Hibernate(一)——入门

1. 前言

Hibernate是一个开放源代码的ORM持久化框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。所谓ORM,即Object-Relational Mapping,它的作用就是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。这样,我们在操作数据库的时候,不需要再去和复杂SQL打交道,只要像操作对象一样操作它就可以了持久化,即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。

2. 入门

(1)jar包引入:

        image

除了sqljdbc.jar可根据自己的数据库驱动换成其他jar包,其他包都是必须的。下载地址:http://hibernate.org/orm/。因为本例中我们需要使用注解,所以请下载3.0版本以上的包。

(2)数据表准备

  1 CREATE TABLE tbUser (
  2     userID VARCHAR(50),
  3     loginName VARCHAR(200),
  4     userName VARCHAR(200),
  5     passWord VARCHAR(200)
  6 )

(3)创建表tbUser对应的对象

所谓的ORM就是要将关系型数据库的数据表映射为JAVA对象,所以理所应当的我们需要为tbUser表建立一个JAVA对象与其相对应。

  1 package com.luych.hibernate.study.entity;
  2 
  3 import javax.persistence.Entity;
  4 import javax.persistence.Id;
  5 import javax.persistence.Table;
  6 
  7 @Entity
  8 @Table(name="tbUser")
  9 public class UserEntity {
 10 
 11     @Id
 12     private String userID;
 13     private String loginName;
 14     private String userName;
 15     private String passWord;
 16 
 17     public String getUserID() {
 18         return userID;
 19     }
 20     public void setUserID(String userID) {
 21         this.userID = userID;
 22     }
 23     public String getLoginName() {
 24         return loginName;
 25     }
 26     public void setLoginName(String loginName) {
 27         this.loginName = loginName;
 28     }
 29     public String getUserName() {
 30         return userName;
 31     }
 32     public void setUserName(String userName) {
 33         this.userName = userName;
 34     }
 35     public String getPassWord() {
 36         return passWord;
 37     }
 38     public void setPassWord(String passWord) {
 39         this.passWord = passWord;
 40     }
 41     @Override
 42     public String toString() {
 43         return loginName+", "+userName+", "+passWord+", "+userID;
 44     }
 45 
 46 
 47 }

@Entity: 此注解来通知Hibernate,该对象为ORM对象。

@Table(name="tbUser"):此注解来通知Hibernate,该对象对应的数据表为tbUser,将来针对此对象的新增、修改、删除、查询等操作都会映射到tbUSer数据表中。

@id:此注解表示userID为主键,是对象的唯一标识,一般数据库设计时候也会将userID字段设置为主键。Hibernage的对象缓存会根据@id标识的主键来进行处理。

@Column:此注解在本例中没有出现。当数据库中字段名和JAVA对象属性名称不一致的时候,可以用此注解来描述其对应关系。如下例(数据库字段为LOGIN_NAME,对象属性为loginName):

  1 @Column(name="LOGIN_NAME")
  2 private String loginName;

 @Transient:此注解在本例中也没有出现。如果JAVA对象中的某个属性,并没有数据表的字段与其相对应,那么就用此注解标注该属性。Hibernate针对此对象进行增删改查的时候回忽略此属性。例如:我们要为UserEntity对象增加一个登陆次数(由其他数据表统计而来),那么处理如下:

  1 @Transient
  2 private int loginCnt;

另外,我们改造了toString方法,后面的测试代码中将要用到。

(4)配置Hibernate文件

建立Hibernate的配置文件,路径和文件名任意。本例为:hibernate-config.xml。内容如下:

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <!DOCTYPE hibernate-configuration PUBLIC
  3     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  5 <hibernate-configuration>
  6     <session-factory>
  7         <!-- 设置数据库驱动 -->
  8         <property name="hibernate.connection.driver_class">
  9                 com.microsoft.sqlserver.jdbc.SQLServerDriver
 10         </property>
 11         <!-- 设置数据库URL -->
 12         <property name="hibernate.connection.url">
 13                 jdbc:sqlserver://192.168.9.23:14433;databaseName=tempdb
 14         </property>
 15         <!-- 数据库用户名 -->
 16         <property name="hibernate.connection.username">sa</property>
 17         <!-- 数据库密码 -->
 18         <property name="hibernate.connection.password">123@abcd</property>
 19         <!-- beans -->
 20         <mapping class="com.luych.hibernate.study.entity.UserEntity"/>
 21     </session-factory>
 22 </hibernate-configuration>

该配置文件中,我们为Hibernate设置了数据库连接信息(驱动、URL、用户名以及密码,这些信息请根据自己实际情况来做相应变更),并通知Hibernate我们刚刚创建的UserEntity对象(mapping class="com.luych.hibernate.study.entity.UserEntity")。

(5)测试运行

  1 package com.luych.hibernate.study.main;
  2 
  3 import java.util.List;
  4 import java.util.UUID;
  5 
  6 import org.hibernate.Query;
  7 import org.hibernate.Session;
  8 import org.hibernate.SessionFactory;
  9 import org.hibernate.cfg.Configuration;
 10 import org.junit.After;
 11 import org.junit.Before;
 12 import org.junit.Test;
 13 
 14 import com.luych.hibernate.study.entity.UserEntity;
 15 
 16 @SuppressWarnings("unchecked")
 17 public class TestMain {
 18 
 19     private Session session;
 20 
 21     @Before
 22     public void getSession(){
 23         //请根据自己在第三部中创建的xml文件路径及名称调整configure参数值
 24         Configuration config = new Configuration().configure("hibernate-config.xml");
 25         SessionFactory sessionFactory = config.buildSessionFactory();
 26         session = sessionFactory.openSession();
 27     }
 28 
 29     @After
 30     public void freeSession(){
 31         session.close();
 32     }
 33 
 34     public void sel() {
 35         Query query = session.createQuery("FROM UserEntity WHERE 1=1");
 36         List<UserEntity> userList = query.list();
 37         for (UserEntity userEntity : userList) {
 38             System.out.println(userEntity.toString());
 39         }
 40     }
 41 
 42     public void add() {
 43         session.beginTransaction();
 44         UserEntity user  = new UserEntity();
 45         user.setLoginName("luych");
 46         user.setUserName("卢艳超");
 47         user.setPassWord("12333");
 48         user.setUserID(UUID.randomUUID().toString());
 49         session.save(user);
 50         session.getTransaction().commit();
 51     }
 52 
 53     public void edt(){
 54         session.beginTransaction();
 55         Query query = session.createQuery("FROM UserEntity WHERE 1=1");
 56         List<UserEntity> userList = query.list();
 57         for (UserEntity userEntity : userList) {
 58             userEntity.setPassWord("45666");
 59             session.update(userEntity);
 60         }
 61         session.getTransaction().commit();
 62     }
 63 
 64     public void del(){
 65         session.beginTransaction();
 66         Query query = session.createQuery("FROM UserEntity WHERE 1=1");
 67         List<UserEntity> userList = query.list();
 68         for (UserEntity userEntity : userList) {
 69             session.delete(userEntity);
 70         }
 71         session.getTransaction().commit();
 72     }
 73 
 74     @Test
 75     public void test(){
 76         System.out.println("当前已有数据:");
 77         sel();
 78         del();
 79         System.out.println("执行删除后:");
 80         sel();
 81         add();
 82         add();
 83         System.out.println("执行新增后");
 84         sel();
 85         edt();
 86         System.out.println("执行修改后");
 87         sel();
 88     }
 89 }
 90 

以上代码里,getSession方法用来根据hibernate-config.xml配置文件来获取。freeSession方法用来关闭不再使用的Session。sel方法用来查询当前数据库中的所有数据并打印到控制台;add方法即要新增一条数据;edt方法将所有的passWord都改为45666;del方法将删除所有的数据。大家看一下test方法,然后我们右键,Run As JUnit Test,控制台输出结果为:

  1 当前已有数据:
  2 luych, 卢艳超, 45666, 50420e9c-e751-41c3-a33d-0b6d09924da8
  3 luych, 卢艳超, 45666, 58bd812c-4e43-4248-b0c9-9c3576c6d47c
  4 执行删除后:
  5 执行新增后
  6 luych, 卢艳超, 12333, 9660637e-5447-42c0-bcfb-2b24786bc0e8
  7 luych, 卢艳超, 12333, c0631818-cc91-4691-93fc-159c2cabe37d
  8 执行修改后
  9 luych, 卢艳超, 45666, 9660637e-5447-42c0-bcfb-2b24786bc0e8
 10 luych, 卢艳超, 45666, c0631818-cc91-4691-93fc-159c2cabe37d

可以看到我们的增删改查操作都成功的完成了。以上就是Hibernate的入门基本操作,后续还会有其他探究。本文仅当是抛砖引玉吧,愿大家共勉。

posted @ 2016-04-26 15:39  柚子苹果果  阅读(349)  评论(0编辑  收藏  举报