在Hibernate中如何实现DAO模型(笔记)

首先,我们来看下目录结构

 

Hibernate中DAO模型_Hibernate

接下来,我们看下具体的代码实现:

UserDAO.java的代码如下:

 

  1. package cn.javass.h4.crud.dao.dao; 
  2.  
  3. import java.util.List; 
  4.  
  5. import cn.javass.h4.vo.UserModel; 
  6. import cn.javass.h4.vo.UserQueryModel; 
  7.  
  8. public interface UserDAO { 
  9.     public void create(UserModel um); 
  10.     public void update(UserModel um); 
  11.     public void delete(UserModel um); 
  12.      
  13.     public UserModel getByUuid(String uuid); 
  14.     public List<UserModel> getAll(); 
  15.     public List<UserModel> getByCondition(UserQueryModel uqm); 

建立一个接口类型的DAO模型,用来定义我们将来要实现的具体功能。它的具体实现方法通过UserImpl来实现。具体如下:

 

  1. package cn.javass.h4.crud.dao.impl; 
  2.  
  3. import java.util.ArrayList; 
  4. import java.util.List; 
  5.  
  6. import org.hibernate.Query; 
  7. import org.hibernate.Session; 
  8. import org.hibernate.Transaction; 
  9.  
  10. import cn.javass.h4.crud.dao.dao.UserDAO; 
  11. import cn.javass.h4.crud.util.H4Util; 
  12. import cn.javass.h4.vo.UserModel; 
  13. import cn.javass.h4.vo.UserQueryModel; 
  14.  
  15. public class H4Impl implements UserDAO { 
  16.  
  17.     @Override 
  18.     public void create(UserModel um) { 
  19.         Session s = null
  20.         Transaction t = null
  21.         try { 
  22.             s = H4Util.getSF().openSession(); 
  23.             t = s.beginTransaction(); 
  24.              
  25.  
  26.             s.save(um); 
  27.  
  28.             t.commit(); 
  29.         } catch (Exception e) { 
  30.             e.printStackTrace(); 
  31.             t.rollback(); 
  32.         } finally { 
  33.             s.close(); 
  34.              
  35.         } 
  36.  
  37.     } 
  38.  
  39.     @Override 
  40.     public void update(UserModel um) { 
  41.         Session s = null
  42.         Transaction t = null
  43.         try { 
  44.             s = H4Util.getSF().openSession(); 
  45.             t = s.beginTransaction(); 
  46.  
  47.             s.update(um); 
  48.  
  49.             t.commit(); 
  50.         } catch (Exception e) { 
  51.             e.printStackTrace(); 
  52.             t.rollback(); 
  53.         } finally { 
  54.             s.close(); 
  55.          
  56.         } 
  57.  
  58.     } 
  59.  
  60.     @Override 
  61.     public void delete(UserModel um) { 
  62.         Session s = null
  63.         Transaction t = null
  64.         try { 
  65.             s = H4Util.getSF().openSession(); 
  66.             t = s.beginTransaction(); 
  67.  
  68.             s.delete(um); 
  69.  
  70.             t.commit(); 
  71.         } catch (Exception e) { 
  72.             e.printStackTrace(); 
  73.             t.rollback(); 
  74.         } finally { 
  75.             s.close(); 
  76.         } 
  77.  
  78.     } 
  79.  
  80.     @Override 
  81.     public UserModel getByUuid(String uuid) { 
  82.         UserModel um = null
  83.         Session s = null
  84.         Transaction t = null
  85.         try { 
  86.             s = H4Util.getSF().openSession(); 
  87.             t = s.beginTransaction(); 
  88.             um = (UserModel) s.load(UserModel.class, uuid); 
  89.  
  90.             t.commit(); 
  91.         } catch (Exception e) { 
  92.             e.printStackTrace(); 
  93.             t.rollback(); 
  94.         } finally { 
  95.             s.close(); 
  96.         } 
  97.  
  98.         return um; 
  99.     } 
  100.  
  101.     @Override 
  102.     public List<UserModel> getAll() { 
  103.         List<UserModel> list = new ArrayList<UserModel>(); 
  104.         Session s = null
  105.         Transaction t = null
  106.         try { 
  107.             s = H4Util.getSF().openSession(); 
  108.             t = s.beginTransaction(); 
  109.             Query q = s.createQuery("select o from UserModel o"); 
  110.  
  111.             list = q.list(); 
  112.             t.commit(); 
  113.         } catch (Exception e) { 
  114.             e.printStackTrace(); 
  115.             t.rollback(); 
  116.         } finally { 
  117.             s.close(); 
  118.         } 
  119.  
  120.         return list; 
  121.     } 
  122.  
  123.     @Override 
  124.     public List<UserModel> getByCondition(UserQueryModel uqm) { 
  125.         List<UserModel> list = new ArrayList<UserModel>(); 
  126.         Session s = null
  127.         Transaction t = null
  128.         try { 
  129.             s = H4Util.getSF().openSession(); 
  130.             t = s.beginTransaction(); 
  131.  
  132.             String hql = "select o from UserModel o where 1=1 "
  133.             hql = this.preparedHql(hql, uqm); 
  134.             Query q = s.createQuery(hql); 
  135.             this.setHqlValue(q, uqm); 
  136.             list = q.list(); 
  137.             t.commit(); 
  138.         } catch (Exception e) { 
  139.             e.printStackTrace(); 
  140.             t.rollback(); 
  141.         } finally { 
  142.             s.close(); 
  143.         } 
  144.  
  145.         return list; 
  146.     } 
  147.  
  148.     private void setHqlValue(Query q, UserQueryModel uqm) { 
  149.         if (uqm.getUuid() != null && uqm.getUuid().trim().length() > 0) { 
  150.             q.setString("uuid", uqm.getUuid()); 
  151.         } 
  152.         if (uqm.getName() != null && uqm.getName().trim().length() > 0) { 
  153.             q.setString("name""%" + uqm.getName() + "%"); 
  154.         } 
  155.         if (uqm.getAge() > 0) { 
  156.             q.setInteger("age", uqm.getAge()); 
  157.         } 
  158.         if (uqm.getAge2() > 0) { 
  159.             q.setInteger("age2", uqm.getAge2()); 
  160.         } 
  161.  
  162.     } 
  163.  
  164.     private String preparedHql(String hql, UserQueryModel uqm) { 
  165.         StringBuffer buffer = new StringBuffer(hql); 
  166.         if (uqm.getUuid() != null && uqm.getUuid().trim().length() > 0) { 
  167.             buffer.append(" and o.uuid = :uuid"); 
  168.         } 
  169.         if (uqm.getName() != null && uqm.getName().trim().length() > 0) { 
  170.             buffer.append(" and o.name like :name"); 
  171.         } 
  172.         if (uqm.getAge() > 0) { 
  173.             buffer.append(" and o.age >= :age"); 
  174.         } 
  175.         if (uqm.getAge2() > 0) { 
  176.             buffer.append(" and o.age <= :age2"); 
  177.         } 
  178.  
  179.         return buffer.toString(); 
  180.     } 
  181.  

然后建立一个工厂UserDAOFactory,方便外部程序的调用。具体代码如下:

 

  1. package cn.javass.h4.crud.dao.factory; 
  2.  
  3. import cn.javass.h4.crud.dao.dao.UserDAO; 
  4. import cn.javass.h4.crud.dao.impl.H4Impl; 
  5.  
  6. public class UserDAOFactory { 
  7.     private UserDAOFactory(){ 
  8.          
  9.     } 
  10.     public static UserDAO getUserDAO(){ 
  11.         return new H4Impl(); 
  12.     } 

这个时候我们就初步的实现了DAO模型,当然这里忘记了UserModel、UserQueryModel以及相对应的ORMapping文件

UserModel:

 

  1. package cn.javass.h4.vo; 
  2.  
  3. public class UserModel implements java.io.Serializable { 
  4.     private String uuid; 
  5.     private int age; 
  6.     private int version; 
  7.     private String name; 
  8.  
  9.     public String getName() { 
  10.         return name; 
  11.     } 
  12.  
  13.     public void setName(String name) { 
  14.         this.name = name; 
  15.     } 
  16.  
  17.     public int getVersion() { 
  18.         return version; 
  19.     } 
  20.  
  21.     public void setVersion(int version) { 
  22.         this.version = version; 
  23.     } 
  24.  
  25.     public String getUuid() { 
  26.         return uuid; 
  27.     } 
  28.  
  29.     public void setUuid(String uuid) { 
  30.         this.uuid = uuid; 
  31.     } 
  32.  
  33.     public int getAge() { 
  34.         return age; 
  35.     } 
  36.  
  37.     public void setAge(int age) { 
  38.         this.age = age; 
  39.     } 
  40.  
  41.     @Override 
  42.     public int hashCode() { 
  43.         final int prime = 31
  44.         int result = 1
  45.         result = prime * result + ((uuid == null) ? 0 : uuid.hashCode()); 
  46.         return result; 
  47.     } 
  48.  
  49.     @Override 
  50.     public boolean equals(Object obj) { 
  51.         if (this == obj) 
  52.             return true
  53.         if (obj == null
  54.             return false
  55.         if (getClass() != obj.getClass()) 
  56.             return false
  57.         UserModel other = (UserModel) obj; 
  58.         if (uuid == null) { 
  59.             if (other.uuid != null
  60.                 return false
  61.         } else if (!uuid.equals(other.uuid)) 
  62.             return false
  63.         return true
  64.     } 
  65.  
  66.     public String toString() { 
  67.         return "uuid=" + uuid + ", name=" + name + ", age=" + age; 
  68.     } 

UserQueryModel:

 

  1. package cn.javass.h4.vo; 
  2.  
  3. public class UserQueryModel extends UserModel{ 
  4.     private int age2 = 0
  5.  
  6.     public int getAge2() { 
  7.         return age2; 
  8.     } 
  9.  
  10.     public void setAge2(int age2) { 
  11.         this.age2 = age2; 
  12.     } 
  13.      

UserModel对应的Mapping文件UserModel.hbm.xml

 

 

  1. <?xml version="1.0"?> 
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  4.     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
  5.  
  6. <hibernate-mapping> 
  7.      
  8.     <class name="cn.javass.h4.vo.UserModel" table="user_tbl" lazy="false"> 
  9.         <id name="uuid"> 
  10.             <generator class="assigned"/> 
  11.         </id> 
  12.          
  13.         <!--  
  14.         <version name="version" column="version"/> 
  15.          --> 
  16.           
  17.         <property name="name" /> 
  18.         <property name="age"/> 
  19.          
  20.     </class> 
  21.  
  22. </hibernate-mapping> 

 

这里最后在补上SRC文件根目录下的hibernate.cfg.xml的配置文件

 

  1. <?xml version='1.0' encoding='utf-8'?> 
  2. <!DOCTYPE hibernate-configuration PUBLIC 
  3.         "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
  4.         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
  5.  
  6. <hibernate-configuration> 
  7.  
  8.     <session-factory> 
  9.  
  10.         <!-- Database connection settings --> 
  11.         <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
  12.         <property name="connection.url">jdbc:mysql://localhost:3306/test</property> 
  13.         <property name="connection.username">root</property> 
  14.         <property name="connection.password">root</property> 
  15.  
  16.         <!-- JDBC connection pool (use the built-in) --> 
  17.         <property name="connection.pool_size">1</property> 
  18.          
  19.         <property name="c3p0.mix_size">5</property> 
  20.         <property name="c3p0.max_size">20</property> 
  21.         <property name="cep0.timeout">180</property> 
  22.         <property name="c3p9.max_statements">50</property> 
  23.         <!-- SQL dialect --> 
  24.         <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> 
  25.  
  26.         <!-- Echo all executed SQL to stdout --> 
  27.         <property name="show_sql">true</property> 
  28.         <property name="format_sql">true</property> 
  29.          
  30.         <mapping resource="cn/javass/h4/vo/UserModel.hbm.xml"/> 
  31.     </session-factory> 
  32.  
  33. </hibernate-configuration> 

关于相关的LIB文件以及对应的数据库表就不写了。

下面写个Client类对相关的东西进行测试

 

  1. package cn.javass.h4.crud; 
  2.  
  3. import java.util.List; 
  4.  
  5. import org.hibernate.Query; 
  6. import org.hibernate.Session; 
  7. import org.hibernate.SessionFactory; 
  8. import org.hibernate.Transaction; 
  9. import org.hibernate.cfg.Configuration; 
  10.  
  11. import cn.javass.h4.crud.dao.factory.UserDAOFactory; 
  12. import cn.javass.h4.vo.UserModel; 
  13. import cn.javass.h4.vo.UserQueryModel; 
  14.  
  15. public class Client { 
  16.  
  17.     public static void main(String[] args) { 
  18.         //测试新增 
  19. //      UserModel um = new UserModel(); 
  20. //      um.setUuid("04"); 
  21. //      um.setAge(1); 
  22. //      um.setName("ccc"); 
  23. //      UserDAOFactory.getUserDAO().create(um); 
  24.          
  25.         //测试update 
  26. //      UserModel um = new UserModel(); 
  27. //      um.setUuid("01"); 
  28. //      um.setName("adf"); 
  29. //      um.setAge(1); 
  30. //      UserDAOFactory.getUserDAO().update(um); 
  31.          
  32.         //测试delete 
  33. //      UserModel um = new UserModel(); 
  34. //      um.setUuid("01"); 
  35. //      UserDAOFactory.getUserDAO().delete(um); 
  36.          
  37.         //测试getByUuid 
  38.         //这里特别注意下!!!!! 
  39.         //如果UserModel.hbm.xml中lazy="false",没有添加的话,会抛出异常 
  40. //      UserModel um = UserDAOFactory.getUserDAO().getByUuid("02"); 
  41. //      System.out.println(um); 
  42.          
  43.         //测试获取全部数据 
  44. //      List<UserModel> list = UserDAOFactory.getUserDAO().getAll(); 
  45. //      for (UserModel um : list){ 
  46. //          System.out.println("um==" + um); 
  47. //      } 
  48.          
  49.         //测试精确查询 
  50. //      UserQueryModel uqm = new UserQueryModel(); 
  51. //      uqm.setUuid("02"); 
  52. //      List<UserModel> list = UserDAOFactory.getUserDAO().getByCondition(uqm); 
  53. //      for (UserModel um : list){ 
  54. //          System.out.println("um==" + um); 
  55. //      } 
  56.          
  57.         //模糊查询 
  58. //      UserQueryModel uqm = new UserQueryModel(); 
  59. //      uqm.setName("b"); 
  60. //      List<UserModel> list = UserDAOFactory.getUserDAO().getByCondition(uqm); 
  61. //      for (UserModel um : list){ 
  62. //          System.out.println("um==" + um); 
  63. //      } 
  64.          
  65.         //测试年龄的区间查询 
  66. //      UserQueryModel uqm = new UserQueryModel(); 
  67. //      uqm.setAge(15); 
  68. //      uqm.setAge2(40); 
  69. //      List<UserModel> list = UserDAOFactory.getUserDAO().getByCondition(uqm); 
  70. //      for (UserModel um : list){ 
  71. //          System.out.println("um==" + um); 
  72. //      } 
  73.     }