hibernate工具类

首先我们需要知道为什么我们需要要创建hibernate工具类

  一些固定而且经常使用的步骤我们期望做成一个工具类,以后再需要重复步骤时咱们仅需要引用此工具类就可以,从而避免了一直创建重复代码。比如加载数据库的驱动等,这里Hibernate中我们每个主程序都需要加载hibernate.cfg.xml文件、创建SessionFactory对象、创建Session对象、关闭session。这些都是固定化的步骤,因此我们将它们写在工具类HibernateUtil中,以后咱们直接引用此文件创建各对象即可,大大减少了代码量,提高了代码复用性。

下面以Hibernate映射Map集合来说Hibernate工具类 一些解释都已经加入代码块的注解中

一:PersonMap.java

  1. package com.mao;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. import javax.persistence.*;  
  7. @Entity  
  8. @Table(name="personMap_inf")  
  9. public class PersonMap {  
  10.     @Id  
  11.     @Column(name="person_id")  
  12.     @GeneratedValue(strategy=GenerationType.IDENTITY)  
  13.     private Integer id;  
  14.     private String name;  
  15.     private String age;  
  16.     @ElementCollection(targetClass=Float.class)  
  17.     @CollectionTable(name="score_inf",joinColumns=@JoinColumn(name="person_id",nullable=false))  
  18.     //映射保存Map key的数据列  
  19.     @MapKeyColumn(name="subject_name")  
  20.     //指定Map key的类型为String类型  
  21.     @MapKeyClass(String.class)  
  22.     //映射保存 Map value的数据列  
  23.     @Column(name="mark")  
  24.     private Map<String,Float>scores=new HashMap<>();  
  25.     //省略全部属性的set get方法  

二:工具类HibernateUtil

  1. package com.mao;  
  2.   
  3. import org.hibernate.*;  
  4. import org.hibernate.cfg.*;  
  5. import org.hibernate.service.*;  
  6. import org.hibernate.boot.registry.*;  
  7. /** 
  8.  * Description: 
  9.  * @author  VipMao 
  10.  * @version  1.0 
  11.  */  
  12.   
  13.   
  14. /** 
  15.  * 该工具类提供了一个属性:SessionFactory sessionFactory  
  16.  * 并创建了sessionFactory 将它设置成static 这样其他程序就可以直接通过此工具类引用 
  17.  * 提供了二个方法: 
  18.  * 1:通过线程创建Session-->currentSession() 
  19.  * 2:关闭Session-->closeSession() 
  20.  * 需要在主类中手动关闭sessionFactory 
  21.  */  
  22. public class HibernateUtil  
  23. {  
  24.     public static final SessionFactory sessionFactory;  
  25.     //创建sessionFactory  
  26.     static  
  27.     {  
  28.         try  
  29.         {  
  30.             // 采用默认的hibernate.cfg.xml来启动一个Configuration的实例  
  31.             Configuration cfg = new Configuration()  
  32.                 .configure();  
  33.             // 以Configuration实例来创建SessionFactory实例  
  34.             ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()  
  35.                 .applySettings(cfg.getProperties()).build();  
  36.             sessionFactory = cfg.buildSessionFactory(serviceRegistry);  
  37.         }  
  38.         catch (Throwable ex)  
  39.         {  
  40.             System.err.println("Initial SessionFactory creation failed." + ex);  
  41.             throw new ExceptionInInitializerError(ex);  
  42.         }  
  43.     }  
  44.   
  45.     // ThreadLocal可以隔离多个线程的数据共享,因此不再需要对线程同步  
  46.     public static final ThreadLocal<Session> session  
  47.         = new ThreadLocal<Session>();  
  48.     //创建Session  
  49.     public static Session currentSession()  
  50.         throws HibernateException  
  51.     {  
  52.         //通过线程对象.get()方法安全创建Session  
  53.         Session s = session.get();  
  54.         // 如果该线程还没有Session,则创建一个新的Session  
  55.         if (s == null)  
  56.         {  
  57.             s = sessionFactory.openSession();  
  58.             // 将获得的Session变量存储在ThreadLocal变量session里  
  59.             session.set(s);  
  60.         }  
  61.         return s;  
  62.     }  
  63.     //关闭Session  
  64.     public static void closeSession()  
  65.         throws HibernateException  
  66.     {  
  67.         Session s = session.get();  
  68.         if (s != null)  
  69.             s.close();  
  70.         session.set(null);  
  71.     }  
  72. }  


该工具类提供了一个属性:SessionFactory sessionFactory , 并将创建sessionFactory写在了static代码块里, 这样其他程序就可以直接通过HibernateUtil.sessionFactory引用,而不是再通过一系列的代码创建SessionFactory对象。
另外工具类还提供了二个方法:

 1:通过线程创建Session-->currentSession()  

   工具类中通过ThreadLocal创建Session ,可以隔离多个线程的数据共享

 2:关闭Session-->closeSession() 
可以看出工具类将创建SessionFactory对象、Session对象以及关闭Session放在了不同的代码块以及方法里,这样以后咱们需要创建什么或者关闭什么直接通过HibernateUtil.XXX实现即可,大大缩减了代码量,提高代码复用性。


三:Hibernate主程序 PersonManagerMap.java


  1. package com.mao;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.util.Date;  
  6.   
  7. import org.hibernate.Session;  
  8. import org.hibernate.SessionFactory;  
  9. import org.hibernate.Transaction;  
  10. import org.hibernate.cfg.Configuration;  
  11. import org.hibernate.service.ServiceRegistry;  
  12. import org.hibernate.service.ServiceRegistryBuilder;  
  13.   
  14. public class PersonManagerMap  
  15. {  
  16.     public static void main(String[] args)  
  17.     {  
  18.         PersonManagerMap mgr = new PersonManagerMap();  
  19.         mgr.createAndStorePerson();  
  20.         //通过工具类关闭sessionFactory  
  21.         HibernateUtil.sessionFactory.close();  
  22.     }  
  23.   
  24.     private void createAndStorePerson()  
  25.     {  
  26.         // 打开线程安全的Session对象  
  27.         Session session = HibernateUtil.currentSession();  
  28.         // 打开事务  
  29.         Transaction tx = session.beginTransaction();  
  30.         // 创建Person对象  
  31.         PersonMap person = new PersonMap();  
  32.         person.setName("VipMao");  
  33.         person.setAge("24");  
  34.         // 向person的Map集合属性中添加key-value对  
  35.         person.getScores().put("语文" , 90f);  
  36.         person.getScores().put("英文" , 95f);  
  37.         session.save(person);  
  38.         tx.commit();  
  39.         //通过工具类关闭Session  
  40.         HibernateUtil.closeSession();  
  41.     }  
  42.       
  43. }  

可以看出上面的创建Session对象、关闭Session等都是通过工具类完成的,我们已经在工具类中创建了SessionFactory sessionFactory,所以只要工具类在项目中,我们就可以直接通过HibernateUtil.sessionFactory使用(因为工具类已经将它设置成静态),非常方便。

四:配置文件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://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  5. <hibernate-configuration>  
  6.     <session-factory>  
  7.         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
  8.         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>  
  9.         <property name="hibernate.connection.username">root</property>  
  10.         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>  
  11.         <property name="hibernate.connection.characterEncoding">utf-8</property>  
  12.          <!-- 指定连接池最大连接数 -->  
  13.         <property name="hibernate.c3p0.max_size">20</property>  
  14.         <!-- 指定连接池最小连接数 -->  
  15.         <property name="hibernate.c3p0.min_size">1</property>  
  16.         <!-- 指定连接池里连接超时时长 -->  
  17.         <property name="hibernate.c3p0.timeout">5000</property>  
  18.         <!-- 指定连接池里做大缓存多少个Statement对象 -->  
  19.         <property name="hibernate.c3p0.max_statements">50</property>  
  20.         <!-- 是否根据需要自动建表 -->  
  21.         <property name="hbm2ddl.auto">update</property>  
  22.         <!-- 是否显示sql语句 -->  
  23.         <property name="show_sql">true</property>  
  24.         <!-- 将SQL脚本进行格式化后再输出 -->  
  25.         <property name="hibernate.format_sql">true</property>  
  26.         <!-- 设置连接数据库所使用的方言 -->  
  27.         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>  
  28.         <!-- 罗列所有持久化类名 -->     
  29.         <mapping class="com.mao.PersonMap"/>   
  30.          
  31.     </session-factory>  
  32. </hibernate-configuration>  

五:运行结果



可以看出,与不使用工具类一样,同样实现了数据库中映射Map集合。

这仅仅是我的Hibernate工具类,当然大家可以根据自己的项目需求改写自己的工具类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值