膜拜java的gravatar头像
膜拜java 2017-12-12 17:32:32
搭建hibernate5框架实例(基于注解、mysql)

废话不聊,直接上步骤,然后上说明,最后上源码。

1、到官网下载hibernate-release-5.2.0.Final包。

2、用myeclipse新建web项目

3、写代码

步骤已说完。详解每一步

1、从官网下载jar以及源码的教程http://blog.csdn.net/leisure_life/article/details/60748288;ps:本人准备自己写的,可是这篇文章描述的太详细了

2、用myeclipse新建web项目。这个就不说了吧。

a)第一步下载好之后,把hibernate-release-5.2.0.Final\lib\required 文件夹下的jar放入项目的lib中。

b)本示例是用junit测试的,另外需要下载com.springsource.org.junit-4.7.0.jar

3、写代码,最刺激的,写代码。先写实体,然后写hibernate.cfg.xml,最后写测试用例

a)Student.java

//学生实体类
@Entity(name="Student2161")
public class Student {
    @Id //主键
    @GeneratedValue //主键生成策略
    private Integer sid;
    
    private String name;
    public Integer getSid() {
        return sid;
    }
    public void setSid(Integer sid) {
        this.sid = sid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

b)hibernate.cfg.xml

<?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="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
    <property name="connection.username">root</property>
    <property name="connection.password">123456</property>
    <!-- 数据库连接池的大小 -->
    <property name="connection.pool_size">5</property>
     <!-- 每次从数据库中取出并放到JDBC的Statement中的记录条数。Fetch Size设的越大,读数据库的次数越少,速度越快,Fetch Size越小,读数据库的次数越多,速度越慢-->   
    <property name="jdbc.fetch_size">50 </property>   
    <!--批量插入,删除和更新时每次操作的记录数。Batch Size越大,批量操作的向数据库发送Sql的次数越少,速度就越快,同样耗用内存就越大-->   
    <property name="jdbc.batch_size">23 </property>  
    <!-- SQL 方言 -->
    <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>
    <!-- 在控制台输出sql语句 -->
    <property name="show_sql">true</property>
    <!-- 在启动时根据配置更新数据库 -->
    <property name="hbm2ddl.auto">update</property>
    <!-- 注解配置 -->
	<mapping class="com.sl.hibernate.entity.Student"/>
</session-factory>
</hibernate-configuration>

c)HibernateUtil.java,此类是为了减少test的代码,因为鄙人准备搭建框架,所以沿用了多类少代码的节奏

import org.hibernate.*;
import org.hibernate.cfg.*;
import org.hibernate.service.*;
import org.hibernate.boot.MetadataSources;
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文件    
            final StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure("cfg/hibernate.cfg.xml").build();
		    //2. 根据服务注册类创建一个元数据资源集,同时构建元数据并生成应用一般唯一的的session工厂
		    sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
            System.out.println("ddd");
		} catch (Throwable ex) {
			System.out.println("ddd_________________");
			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);
	}
}

d)MyTest.java

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.sl.hibernate.entity.StuCard;
import com.sl.hibernate.entity.Student;
import com.sl.hibernate.util.HibernateUtil;

public class MyTest {

	Session session;
	Transaction tx;

	// 单元测试前走
	@Before
	public void Before() {
		session = HibernateUtil.currentSession();
		tx = session.beginTransaction();
	}

	// 单元测试后走
	@After
	public void After() {
		tx.commit();
		HibernateUtil.closeSession();
	}

	@Test
	public void TestOne() {

		Student student = new Student();
		student.setName("good");
		System.out.println("3333333333");
		session.save(student);

	}
}

 

此时就可以运行了。我捣饬了一下午,遇到很多错。

注:在搭建过程遇到很多错误,这些才是最宝贵的

1、找包,有些时候我们想急功近利,一个包一个包的搜。这样反而给自己造成更多的麻烦,所以建议到官网下载包

2、hibernate-release-5.2.0.Final\lib\required\hibernate-core-5.2.0.Final.jar 是下载的,可是运行的时候居然冲突,解决方案用 hibernate-core-5.0.1.Final.jar 更换

3、项目运行的时候hibernate会自己生成一个table hibernate_sequence;需要在这个table 塞入一个数据。后期有时间我来研究下,为什么会这样

4、 在 HibernateUtil 中,创建sessionFactory 不能用Configuration,百度了下,据说hibernate5已经不玩这个了,切记切记

搭建hibernate5框架实例(基于注解、mysql)


打赏

已有2人打赏

liuxiaoming的gravatar头像 最代码官方的gravatar头像
最近浏览
AaronL  LV1 2019年6月17日
1612230014  LV2 2019年1月8日
zzlljj  LV7 2019年1月3日
liuxiaoming  LV5 2018年7月31日
JiangBigPan  LV16 2018年5月24日
C544350851  LV26 2018年3月16日
sowang  LV9 2018年3月13日
junwuxie  LV5 2018年3月2日
weifei  LV6 2018年1月15日
lmg1qaz  LV5 2018年1月15日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友