浅谈:Hibernate中HibernateUtil工具类

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

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

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

一:PersonMap.java

<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.mao;

import java.util.HashMap;
import java.util.Map;

import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.MapKeyClass;
import javax.persistence.MapKeyColumn;
import javax.persistence.Table;
@Entity
@Table(name="personMap_inf")
public class PersonMap {
	@Id
	@Column(name="person_id")
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id;
	private String name;
	private String age;
	@ElementCollection(targetClass=Float.class)
	@CollectionTable(name="score_inf",[email protected](name="person_id",nullable=false))
	//映射保存Map key的数据列
	@MapKeyColumn(name="subject_name")
	//指定Map key的类型为String类型
	@MapKeyClass(String.class)
	//映射保存 Map value的数据列
	@Column(name="mark")
	private Map<String,Float>scores=new HashMap<>();
	//省略全部属性的set get方法</span>

二:工具类HibernateUtil

package com.mao;

import org.hibernate.*;
import org.hibernate.cfg.*;
import org.hibernate.service.*;
import org.hibernate.boot.registry.*;
/**
 * Description:
 * @author  VipMao
 * @version  1.0
 */

/**
 * 该工具类提供了一个属性:SessionFactory sessionFactory
 * 并创建了sessionFactory 将它设置成static 这样其他程序就可以直接通过此工具类引用
 * 提供了二个方法:
 * 1:通过线程创建Session-->currentSession()
 * 2:关闭Session-->closeSession()
 * 需要在主类中手动关闭sessionFactory
 */
public class HibernateUtil
{
	public static final SessionFactory sessionFactory;
	//创建sessionFactory
	static
	{
		try
		{
			// 采用默认的hibernate.cfg.xml来启动一个Configuration的实例
			Configuration cfg = new Configuration()
				.configure();
			// 以Configuration实例来创建SessionFactory实例
			ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
				.applySettings(cfg.getProperties()).build();
			sessionFactory = cfg.buildSessionFactory(serviceRegistry);
		}
		catch (Throwable ex)
		{
			System.err.println("Initial SessionFactory creation failed." + ex);
			throw new ExceptionInInitializerError(ex);
		}
	}

	// ThreadLocal可以隔离多个线程的数据共享,因此不再需要对线程同步
	public static final ThreadLocal<Session> session
		= new ThreadLocal<Session>();
	//创建Session
	public static Session currentSession()
		throws HibernateException
	{
		//通过线程对象.get()方法安全创建Session
		Session s = session.get();
		// 如果该线程还没有Session,则创建一个新的Session
		if (s == null)
		{
			s = sessionFactory.openSession();
			// 将获得的Session变量存储在ThreadLocal变量session里
			session.set(s);
		}
		return s;
	}
	//关闭Session
	public static void closeSession()
		throws HibernateException
	{
		Session s = session.get();
		if (s != null)
			s.close();
		session.set(null);
	}
}

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

另外工具类还提供了二个方法:

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

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

2:关闭Session-->closeSession()

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

三:Hibernate主程序 PersonManagerMap.java

<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.mao;

import java.io.File;
import java.io.FileInputStream;
import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class PersonManagerMap
{
	public static void main(String[] args)
	{
		PersonManagerMap mgr = new PersonManagerMap();
		mgr.createAndStorePerson();
		//通过工具类关闭sessionFactory
		HibernateUtil.sessionFactory.close();
	}

	private void createAndStorePerson()
	{
		// 打开线程安全的Session对象
		Session session = HibernateUtil.currentSession();
		// 打开事务
		Transaction tx = session.beginTransaction();
		// 创建Person对象
		PersonMap person = new PersonMap();
		person.setName("VipMao");
		person.setAge("24");
		// 向person的Map集合属性中添加key-value对
		person.getScores().put("语文" , 90f);
		person.getScores().put("英文" , 95f);
		session.save(person);
		tx.commit();
		//通过工具类关闭Session
		HibernateUtil.closeSession();
	}

}

</span>

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

四:配置文件hibernate.cfg.xml

<span style="font-family:KaiTi_GB2312;font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.characterEncoding">utf-8</property>
         <!-- 指定连接池最大连接数 -->
        <property name="hibernate.c3p0.max_size">20</property>
        <!-- 指定连接池最小连接数 -->
        <property name="hibernate.c3p0.min_size">1</property>
        <!-- 指定连接池里连接超时时长 -->
        <property name="hibernate.c3p0.timeout">5000</property>
        <!-- 指定连接池里做大缓存多少个Statement对象 -->
        <property name="hibernate.c3p0.max_statements">50</property>
        <!-- 是否根据需要自动建表 -->
        <property name="hbm2ddl.auto">update</property>
        <!-- 是否显示sql语句 -->
        <property name="show_sql">true</property>
        <!-- 将SQL脚本进行格式化后再输出 -->
        <property name="hibernate.format_sql">true</property>
        <!-- 设置连接数据库所使用的方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- 罗列所有持久化类名 -->
        <mapping class="com.mao.PersonMap"/> 

    </session-factory>
</hibernate-configuration>
</span>

五:运行结果

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

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

时间: 2024-08-07 21:18:22

浅谈:Hibernate中HibernateUtil工具类的相关文章

浅谈Hibernate中映射集合属性以及主键和外键

首先说明一下什么叫主键以及外键. 主键和外键是对于数据库来说的,数据库的表才有主键外键的说法. 主键:主键是指标识某个表中唯一且非空的一条记录行的列,这个列中的值不允许有重复的值,用于确定一个表中的一条记录,实际上主键就是告诉别人:这个数据列是唯一的. 外键:引用另外一个表中的主键,在当前表中不一定为唯一的,但是在被引用表中一般唯一.对于关系型数据库来说(比如MySQL)外键是联系数据表之间的唯一方式,主要目的是控制存储在外键表中的数据. 建立外键的前提:本表的列必须与外键类型相同(外键必须是外

浅谈swift中的那些类,结构以及初始化的操作

首先呢,我们先声明一个类 class Parent { //声明一个属性 var p1: String = "abc" //声明一个方法 func m() { print("parent m") } //声明一个静态的方法 final func n(){ } } 然后我们new一个Parent类(注意了,在swift中是没有new的,如果想new 一个的话, 直接调用该类就可以了) var par = Parent() 调用parent的方法和属性 par.m()

浅谈Windows中DLL导出类

一般的DLL导出类方法,一个简单的例子: dllExample.h: 1 #pragma once 2 3 #ifdef DLL_EXPORTS 4 #define DLL_API __declspec(dllexport) 5 #else 6 #define DLL_API __declspec(dllimport) 7 #endif 8 9 class DLL_API ExportClass 10 { 11 pirvate: 12 int x; 13 public: 14 void foo(

【SSH三大框架】Hibernate基础第二篇:编写HibernateUtil工具类优化性能

相对于上一篇中的代码编写HibernateUtil类以提高程序的执行速度 首先,仍然要写一个javabean(User.java): package cn.itcast.hibernate.domain; import java.util.Date; public class User { private int id; private String name; private Date birthday; public int getId() { return id; } public voi

简单了解Spring中常用工具类_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 文件资源操作 Spring 定义了一个 org.springframework.core.io.Resource 接口,Resource 接口是为了统一各种类型不同的资源而定义的,Spring 提供了若干 Resource 接口的实现类,这些实现类可以轻松地加载不同类型的底层资源,并提供了获取文件名.URL 地址以及资源内容的操作方法 访问文件资源 * 通过 FileSystemResource 以文件系统绝对路径的

浅谈hadoop中mapreduce的文件分发

最近在做数据分析的时候,需要在mapreduce中调用c语言写的接口,此时就需要把动态链接库so文件分发到hadoop的各个节点上,原来想自己来做这个分发,大概过程就是把so文件放在hdfs上面,然后做mapreduce的时候把so文件从hdfs下载到本地,但查询资料后发现hadoop有相应的组件来帮助我们完成这个操作,这个组件就是DistributedCache,分布式缓存,运用这个东西可以做到第三方文件的分发和缓存功能,下面详解: 如果我们需要在map之间共享一些数据,如果信息量不大,我们可

浅谈Hibernate关系映射(2)

继上篇博客 一对一关系映射:一对一关联映射在实际生活中是比较常见的,如人与身份证的关系,通过人这个对象可以找到他相关的内容. 一对一单向(主键): 单向一对一主键关联,靠的是它们的主键相等,从Person中能看到IdCard,也就是把t_idCard中的主键拿过来当做t_Pseron的主键. 如图的线表示一个关联,在person中可以看见idcard.即在person中持有idCard的引用 person类的映射关系 <hibernate-mapping> <class name=&qu

浅谈Hibernate关系映射(4)

继上篇博客 多对多关联映射(单向) 多对多对象关系映射,需要加入一张新表完成基本映射. Hibernate会自动生成中间表 Hibernate使用many-to-many标签来表示多对多的关联,多对多的关联映射,在实体类中,跟一对多一样,也是用集合来表示的. 如下图所示 通过User可以查看Role的信息 User的映射文件 <hibernate-mapping> <class name="com.bjpowernode.hibernate.User"> <

【转】浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初