Hibernate学习笔记

来源:互联网 发布:r语言编程艺术下载。 编辑:程序博客网 时间:2024/06/05 10:06

1.创建一个用于测试的mysql数据库,数据库名为testdb

2.在testdb中创建一个测试表user,结构如下:



  

3.创建一个和user表字段对应的Bean  

[java] view plaincopyprint?
  1. public class User { 
  2.     private int id; 
  3.     private String name; 
  4.     private String address; 
  5.     private String password; 
  6.         setter 和 getter方法略 



4.定义一个操作User表的Dao接口IUserDao

[java] view plaincopyprint?
  1. public interface IUserDao { 
  2.     public void add(User user); 
  3.      
  4.     public void delete(int uid); 
  5.      
  6.     public void update(User user); 
  7.      
  8.     public User findById(int uid); 
  9.      
  10.     public List<User> getUserListByAddress(String address);    

5.定义IUserDao的实现类UserDao类,此类要实现IUserDao接口同时继承HibernateDaoSupport抽象类,以获取SessionFactory


[java] view plaincopyprint?
  1. public class UserDao extends HibernateDaoSupport  implements IUserDao { 
  2.  
  3.     @Override 
  4.     public void add(User user) { 
  5.         this.getHibernateTemplate().save(user); 
  6.     } 
  7.  
  8.     @Override 
  9.     public void delete(int uid) { 
  10.         User user=new User(); 
  11.         user.setId(uid); 
  12.         this.getHibernateTemplate().delete(user); 
  13.     } 
  14.  
  15.     @Override 
  16.     public User findById(int uid) { 
  17.         return (User)this.getHibernateTemplate().get(User.class,uid); 
  18.     } 
  19.  
  20.     @Override 
  21.     public List<User> getUserListByAddress(String address) { 
  22.         return null
  23.     } 
  24.  
  25.     @Override 
  26.     public void update(User user) { 
  27.         this.getHibernateTemplate().update(user); 
  28.     } 
  29.  



6.定义User.hbm.xml,内容如下:

[html] view plaincopyprint?
  1. <?xmlversion="1.0"encoding="utf-8"?> 
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
  4. <hibernate-mapping> 
  5.     <classname="com.hndy.demo.hibernate.jdbc.bean.User"table="user">        
  6.         <idname="id"column="id"type="java.lang.Integer"> 
  7.              <generatorclass="native"/> 
  8.         </id> 
  9.         <propertyname="name"type="java.lang.String"> 
  10.             <columnname="name"length="100"/> 
  11.         </property> 
  12.  
  13.         <propertyname="address"type="java.lang.String"> 
  14.             <columnname="address"length="100"/> 
  15.         </property> 
  16.          
  17.         <propertyname="password"type="java.lang.String"> 
  18.             <columnname="password"length="100"/> 
  19.         </property>         
  20.     </class> 
  21. </hibernate-mapping> 

其中property name与类中的属性一一对应,type是属性的类型,column name是类的属于对应的字段名,length表示字段的长度

这里需要说明一下id的创建问题,有这几种方法产生主键

(1)identity:用于MySql数据库。特点:递增
    对于MySql数据库使用递增序列时需要在建表时对主键指定为auto_increment属性。

(2)native:跨数据库时使用,由底层方言产生。
    Default.sequence为hibernate_sequence
   使用native时Hibernate默认会去查找Oracle中的hibernate_sequence序列。如果Oracle中没有该序列,连Oracle数据库时会报错。

(3)sequence:用于Oracle数据库

[html] view plaincopyprint?
  1. <idname="id"column="id"> 
  2.    <generatorclass="sequence"> 
  3.      <paramname="sequence">序列名</param> 
  4.    </generator> 
  5. </id> 


(4)hilo:通过高低位合成id,先建表hi_value,再建列next_value。必须要有初始值。
[html] view plaincopyprint?
  1. <idname="id"column="id"> 
  2.     <generatorclass="hilo"> 
  3.       <paramname="table">high_val</param> 
  4.        <paramname="column">nextval</param> 
  5.       <paramname="max_lo">5</param> 
  6.     </generator> 
  7. </id> 


(5)assigned:用户自定义id;
[html] view plaincopyprint?
  1. <idname="id"column="id"> 
  2.    <generatorclass="assigned"/> 
  3. </id> 

测试发现当Id设置为自动增长时,使用identity 和 native没有本质上的区别

(6)uuid

[html] view plaincopyprint?
  1. <id  name="Id"column="id" type="string"> 
  2.     <generator  class="uuid"/> 
  3. </id> 
uuid可以产生36个16进制字符串,当表的ID字段设置为字符类型并且非自动增长是时,使用uuid产生逻辑主键非常有用

7.创建测试类TestCase_UserDao

A.测试getHibernateTemplate().save()方法

在本例中其实还配置了Spring和Hibernate的相关参数,在此不再解释了

[java] view plaincopyprint?
  1. public staticvoid testHibernate_add(){ 
  2.         SystemBeans.initialize(); 
  3.         IUserDao dao = (IUserDao)SystemBeans.getBean("userDao"); 
  4.         User user = new User(); 
  5.         user.setName("Wangwu3"); 
  6.         user.setAddress("ShangHai"); 
  7.         user.setPassword("mypassword"); 
  8.         dao.add(user);       



运行测试类的testHibernate_add()方法,部分输出信息如下:

[plain] view plaincopyprint?
  1. Opening Hibernate Session 
  2. opened session at timestamp: 13267000514 
  3. executing identity-insert immediately 
  4. about to open PreparedStatement (open PreparedStatements: 0, globally: 0) 
  5. opening JDBC connection 
  6. insert into user (name, address, password) values (?, ?, ?) 
  7. Hibernate: insert into user (name, address, password) values (?, ?, ?) 
  8. Natively generated identity: 10 
  9. about to close PreparedStatement (open PreparedStatements: 1, globally: 1) 
  10. Eagerly flushing Hibernate session 
  11. processing flush-time cascades 
  12. dirty checking collections 
  13. Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects 
  14. Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections 
  15. listing entities: 
  16. com.ynyd.demo.hibernate.jdbc.bean.User{id=10, address=ShangHai, name=Wangwu3, password=mypassword} 
  17. Closing Hibernate Session 
可以看到具体的执行顺序
第1 行开启Hibernate Session
第5 行打开JDBC connection
第6 行输出的是拼接好的sql
第8 行输出的是产生好的一个主键值10
第9 行执行完SQL
第16行输出User类的各个属性值,可以发现id=10
第17行关闭了Hibernate Session

B.测试getHibernateTemplate().delete()方法

[java] view plaincopyprint?
  1. public staticvoid testHibernate_delete(){ 
  2.     SystemBeans.initialize(); 
  3.     IUserDao dao = (IUserDao)SystemBeans.getBean("userDao"); 
  4.     dao.delete(11); 
运行测试类的testHibernate_delete()方法,部分输出信息如下:
[plain] view plaincopyprint?
  1. Opening Hibernate Session 
  2. opened session at timestamp: 13267028259 
  3. Eagerly flushing Hibernate session 
  4. processing flush-time cascades 
  5. dirty checking collections 
  6. Flushed: 0 insertions, 0 updates, 1 deletions to 1 objects 
  7. Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections 
  8. listing entities: 
  9. com.ynyd.demo.hibernate.jdbc.bean.User{id=11, address=null, name=null, password=null} 
  10. about to open PreparedStatement (open PreparedStatements: 0, globally: 0) 
  11. opening JDBC connection 
  12. delete from user where id=? 
  13. Hibernate: delete from user where id=? 
  14. Executing batch size: 1 
  15. about to close PreparedStatement (open PreparedStatements: 1, globally: 1) 
  16. Closing Hibernate Session 
  17. releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)] 

C.测试HibernateDaoSupport.getHibernateTemplate().update()方法,修改表记录

查看当前的user表数据情况

[sql] view plaincopyprint?
  1. mysql> select *fromuser
  2. +----+---------+----------+------------+ 
  3. | id | name    | address  |password   | 
  4. +----+---------+----------+------------+ 
  5. | 12 | Wangwu3 | ShangHai | mypassword | 
  6. +----+---------+----------+------------+ 
  7. 1 row in set (0.01 sec) 

[java] view plaincopyprint?
  1. public staticvoid testHibernate_update(){ 
  2.     SystemBeans.initialize(); 
  3.     IUserDao dao = (IUserDao)SystemBeans.getBean("userDao"); 
  4.     User user = new User(); 
  5.     user.setId(12); 
  6.     user.setName("Rooke"); 
  7.     user.setAddress("Shangdi BeiJing"); 
  8.     user.setPassword("123456"); 
  9.     dao.update(user); 

运行测试类的testHibernate_update()方法,部分输出信息如下:

[plain] view plaincopyprint?
  1. Opening Hibernate Session 
  2. opened session at timestamp: 13267033472 
  3. Eagerly flushing Hibernate session 
  4. processing flush-time cascades 
  5. dirty checking collections 
  6. Flushed: 0 insertions, 1 updates, 0 deletions to 1 objects 
  7. Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections 
  8. listing entities: 
  9. com.hnyd.demo.hibernate.jdbc.bean.User{id=12, address=Shangdi BeiJing, name=Rooke, password=123456} 
  10. about to open PreparedStatement (open PreparedStatements: 0, globally: 0) 
  11. opening JDBC connection 
  12. update user set name=?, address=?, password=? where id=? 
  13. Hibernate: update user set name=?, address=?, password=? where id=? 
  14. Executing batch size: 1 
  15. about to close PreparedStatement (open PreparedStatements: 1, globally: 1) 
  16. Closing Hibernate Session 
  17. releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)] 
  18. transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources! 


C.测试HibernateDaoSupport.getHibernateTemplate().get()方法

[java] view plaincopyprint?
  1. public staticvoid testHibername_find(){ 
  2.     SystemBeans.initialize(); 
  3.     IUserDao dao = (IUserDao)SystemBeans.getBean("userDao"); 
  4.     User u = dao.findById(12); 
  5.     System.out.println(u.getId()); 
  6.     System.out.println(u.getName()); 
  7.     System.out.println(u.getAddress()); 
  8.     System.out.println(u.getPassword()); 

运行测试类的testHibernate_find()方法,部分输出信息如下:

[plain] view plaincopyprint?
  1. Opening Hibernate Session 
  2. opened session at timestamp: 13267035305 
  3. loading entity: [com.ynyd.demo.hibernate.jdbc.bean.User#12] 
  4. about to open PreparedStatement (open PreparedStatements: 0, globally: 0) 
  5. opening JDBC connection 
  6. select user0_.id as id0_0_, user0_.name as name0_0_, user0_.address as address0_0_,  
  7. user0_.password as password0_0_ from user user0_ where user0_.id=? 
  8. Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.address as address0_0_,  
  9. user0_.password as password0_0_ from user user0_ where user0_.id=? 
  10. about to open ResultSet (open ResultSets: 0, globally: 0) 
  11. result row: EntityKey[com.ynyd.demo.hibernate.jdbc.bean.User#12] 
  12. about to close ResultSet (open ResultSets: 1, globally: 1) 
  13. about to close PreparedStatement (open PreparedStatements: 1, globally: 1) 
  14. resolving associations for [com.ynyd.demo.hibernate.jdbc.bean.User#12] 
  15. done materializing entity [com.ynyd.demo.hibernate.jdbc.bean.User#12] 
  16. initializing non-lazy collections 
  17. done entity load 
  18. transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources! 
  19. Eagerly flushing Hibernate session 
  20. processing flush-time cascades 
  21. dirty checking collections 
  22. Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects 
  23. Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections 
  24. listing entities: 
  25. com.ynyd.demo.hibernate.jdbc.bean.User{id=12, address=Shangdi BeiJing, name=Rooke, password=123456} 
  26. Closing Hibernate Session 
  27. releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)] 
  28. transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources! 
  29. 12 
  30. Rooke 
  31. Shangdi BeiJing 
  32. 123456 
  33. Closing org.springframework.context.support.FileSystemXmlApplicationContext@b169f8: startup date [Mon Jan 16 16:45:29 CST 2012];  
  34. root of context hierarchy 
C.测试HibernateDaoSupport.getHibernateTemplate().find()方法,查询user表所有记录

IUserDao接口增加
public List<User> getAllUsers();


UserDao方法增加
public List<User> getAllUsers(){
[java] view plaincopyprint?
  1. return (List<User>)this.getHibernateTemplate().find("from User"); 


测试类增加
public static void testHibername_findAll(){

[java] view plaincopyprint?
  1.     SystemBeans.initialize(); 
  2.     IUserDao dao = (IUserDao)SystemBeans.getBean("userDao"); 
  3.     List<User> list = dao.getAllUsers(); 
  4.     for(User u:list){ 
  5.         System.out.println(u.toString());            
  6.     } 

查询user表的数据:

[sql] view plaincopyprint?
  1. mysql> select *fromuser
  2. +----+----------+----------+----------+ 
  3. | id | name     | address  |password
  4. +----+----------+----------+----------+ 
  5. | 15 | zhangsan | Beijing  | 123456   | 
  6. | 16 | lisi     | Shanghai | 123456   | 
  7. | 17 | wangwu   | Shanghai | 123456   | 
  8. +----+----------+----------+----------+ 
  9. 3 rows inset (0.01 sec) 


执行测试方法后结果如下:

[plain] view plaincopyprint?
  1. name:zhangsan,password:123456,address:Beijing 
  2. name:lisi,password:123456,address:Shanghai 
  3. name:wangwu,password:123456,address:Shanghai 

C.测试HibernateDaoSupport.getHibernateTemplate().find()方法,查询user表指定条件的记录

IUserDao接口增加

public User findByName(String name);

UserDao增加

[java] view plaincopyprint?
  1. public User findByName(String name){ 
  2.     List<User> list = (List<User>)this.getHibernateTemplate().find(String.format("from User u where u.name='%s'", name)); 
  3.     if (list.size()>0){ 
  4.         return list.get(0); 
  5.     } 
  6.     return null

find()方法支持HQL,并且返回的结果是个集合类型,因此需要从集合里面取出元素再返回

测试类增加

[java] view plaincopyprint?
  1. public staticvoid testHibername_findByName(){ 
  2.     SystemBeans.initialize(); 
  3.     IUserDao dao = (IUserDao)SystemBeans.getBean("userDao"); 
  4.     User u = dao.findByName("zhangsan"); 
  5.     System.out.println(u.toString()); 

执行结果如下:
[plain] view plaincopyprint?
  1. name:zhangsan,password:123456,address:Beijing