Hibernate(一)——入门
1. 前言
Hibernate是一个开放源代码的ORM持久化框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。所谓ORM,即Object-Relational Mapping,它的作用就是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。这样,我们在操作数据库的时候,不需要再去和复杂SQL打交道,只要像操作对象一样操作它就可以了持久化,即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。
2. 入门
(1)jar包引入:
除了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的入门基本操作,后续还会有其他探究。本文仅当是抛砖引玉吧,愿大家共勉。