Hibernate快速上手

Posted 乖乖女宇帆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate快速上手相关的知识,希望对你有一定的参考价值。

一. Hibernate介绍

  1. Hibernate简介

      Hibernate是一个开放源码的对象-关系映射(ORM)框架,他对JDBC进行了轻量级封装,开发人员可以使用面向对象的编程思想来进行持久层开发,操作数据库。还可以使用Hibernate提供的HQL(Hibernate Query Language)直接从数据库中获得Java对象。

  2. Hibernate工作原理

     Hibernate开发过程中会用到5个核心接口,分别为:Configuration接口,SessionFactory接口,Session接口,Transaction接口和用于数据查询的Query接口。通过这些接口,可以对持久化对象进行操作,还可以进行事物控制。

      这里先介绍一下Hibernate进行持久化操作的主要步骤:

     (1)Hibernate的初始化,创建Configuration对象。

       这一步用来读取XML配置文件和映射文件的信息到Configuration对象的属性中。具体为:

          ① 从Hibernate配置文件Hibernate.cfg.xml中读取配置信息,存放到Configuration对象中。

          ②根据配置文件中的mapping元素加载所有实体类对应的映射文件到Configuration对象中。

      (2)创建SessionFactory实例。

        通过Configuration对象读取到的配置文件信息创建SessionFactory,即将Configuration对象内的配置信息存入SessionFactory的内存(属性)中。     SessionFactory充当数据存储源的代理,并负责创建Session对象。得到SessionFactory对象后,Configuration对象的使命就结束了。

      (3)创建Session实例,建立数据库连接。

        Session通过SessionFactory打开,创建一个Session对象就相当于与数据库建立了一个新的连接。Session对象用来操作实体对象,并把这些操作转换成数 据库中数据的增删改查。

     (4)创建Transaction实例,开始一个事物。

       Transaction用于事物管理,一个Transaction对象对应的事物可以包括多个操作。在使用Hibernate进行增删改是必须先创建Transaction对象。

     (5)利用Session的方法进行持久化操作。将实体对象持久化到数据库中。

     (6)提交操作结果并结束事物。对实体对象的持久化操作结束后,必须提交事务。

     (7)关闭Session,与数据库断开连接。

二. Hibernate开发准备

    1. 下载Hibernate开发包

       (1)登录站点http://www.hibernate.org进行下载

(2)下载后对压缩包解压,解压后的文件夹下包含Hibernate5.jar,他是Hibernate中最主要的jar包,包含了Hibernate的核心类库文件。

2. 在eclipse中部署Hibernate开发环境

这里就讲一下Hibernate Tools的在线安装方式。注:手动安装的时候一定要注意Hibernate Tools与Eclipse版本的兼容性,否则会导致插件安装失败。

(1)运行eclipse,选择主菜单Help|Install New Software选项,弹出Install对话框。

(2)单价Add按钮,弹出Add Repository对话框。其中Name文本框中输入插件名,名字任意。Location文本框中输入下载地址http://download.jboss.org/jbosstools/updates/stable/indigo/ ,单击OK按钮。

(3)根据需要选择相关功能,此处勾选Abridged JBoss Tools 3.3下面的Hibernate Tool选项,单击Next,并接受协议,开始安装,安装完毕根据提示重启Eclipse。(因为我已经安装了这个插件,所以不再显示,大家安装自己的就好了。)

三. Hibernate开发实例

1. 开发Hibernate项目的完整流程

(1)准备开发环境,创建HibernateDemo项目。

(2)在数据库中创建数据库表。

(3)创建持久化类。

(4)设计映射文件,使用Hibernate映射文件将POJO对象映射到数据库。

(5)创建Hibernate的配置文件Hibernate.cfg.xml。

(6)编写辅助工具类HibernateUtils类,用来实现Hibernate的初始化并提供获得Session的方法,此步可根据情况取舍。

(7)编写DAO层类。

(8)编写Service层类。

(9)编写测试类。

2. 创建HibernateDemo项目

(1)在eclipse中创建Dynamic Web Project的方法创建项目,名称为HibernateDemo。

(2)将Hibernate tools引入项目。在HibernateDemo项目中右击,选择New|Other,选择Hibernate Configuration File(cfg.xml)选项,点击Next,一般使用默认的hibernate.cfg.xml即可。

(3)最后点击finish按钮。至此,HibernateDemo项目创建完成。

3. 创建数据库表user表。

4. 编写POJO映射类User.java。

package org.hibernate.entity;

public class User implements java.io.Serializable{
    private int id;
    private String name;
    private String password;
    private String type;
    public User()
    {
        
    }
    public int getId() {
        return this.id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return this.password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getType() {
        return this.type;
    }
    public void setType(String type) {
        this.type = type;
    }
    

}

5. 编写映射文件User.hbm.xml。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="org.hibernate.entity.User" table="user">
<id name="id" type="java.lang.Integer" column="user_id">
<generator class="increment"/>
</id>
<property name="name" type="java.lang.String" column="name" length="20">
</property>
<property name="password" type="java.lang.String" column="password" length="12">
</property>
<property name="type" type="java.lang.String" column="type" length="6">
</property>


</class>
</hibernate-mapping>

6. 编写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 name="">
  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="hibernate.connection.password">1234</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mysqldb</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  <property name="connection.pool_size">1</property>
  <property name="show_sql">true</property>
  <mapping resource="org/hibernate/entity/User.hbm.xml"/>
 </session-factory>
</hibernate-configuration>

7. 编写辅助工具类HibernateUtil.Java

package org.hibernate.entity;

import org.hibernate.*;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
    private static SessionFactory sessionFactory;
    private  static Configuration configuration = new Configuration();   
//创建线程局部变量threadLocal,用来保存Hibernate的Session
private static final ThreadLocal<Session> threadLocal=new ThreadLocal<Session>(); //使用静态代码块初始化Hibernate
static{ try{ Configuration cfg=new Configuration().configure();//读取配置文件hibernate.cfg.xml sessionFactory=cfg.buildSessionFactory(); //创建SessionFactory }catch(Throwable ex){ throw new ExceptionInInitializerError(ex); } } //获得SessionFactory实例 public static SessionFactory getSessionFactory(){ return sessionFactory; }
//获得ThreadLocal对象管理的Session实例
public static Session getSession() throws HibernateException{ Session session=(Session) threadLocal.get(); if(session==null||!session.isOpen()){ if(sessionFactory==null){ rebuildSessionFactory(); }
// 通过SessionFactory对象创建Session对象 session
=(sessionFactory!=null)?sessionFactory.openSession():null; threadLocal.set(session); //将新打开的Session实例保存到线程局部变量threadLocal中 } return session; } //关闭Session实例 public static void closeSession() throws HibernateException{ Session session=(Session) threadLocal.get(); //从线程局部变量threadLocal中获取之前存入的Session实例 threadLocal.set(null); if(session!=null){ session.close(); } } //重建SessionFactory public static void rebuildSessionFactory(){ try{ configuration.configure("/hibernate.cfg.xml"); sessionFactory=configuration.buildSessionFactory(); }catch(Exception e){ System.err.println("Error creating SessionFactory"); e.printStackTrace(); } } //关闭缓存和连接池 public static void shutdown(){ getSessionFactory().close(); } }

8. 编写一个用于数据库访问的DAO接口UserDAO.java

//创建UserDAO接口
public interface UserDAO{
       void save(User user);  //添加用户
       User findById(int id);   //根据用户标示查找指定用户
       void delete(User user);//删除用户
       void update(User user);//修改用户信息
}

 

9. 编写DAO层实现类UserDAOImpl.java

package org.hibernate.dao;
import org.hibernate.*;
import org.hibernate.entity.*;

public class UserDAOImpl implements UserDao{

    @Override
    public void save(User user) {
        // TODO Auto-generated method stub
        Session session=HibernateUtil.getSession();
        Transaction tx=session.beginTransaction();
        try{
            session.save(user);
            tx.commit();
        }catch(Exception e){
            e.printStackTrace();
            tx.rollback();
        }
    }

    @Override
    public User findById(int id) {
        // TODO Auto-generated method stub
        
        User user=null;
        Session session=HibernateUtil.getSession();
        Transaction tx=session.beginTransaction();
        try{
            user=(User)session.get(User.class, id);
            tx.commit();
        }catch(Exception e){
            e.printStackTrace();
            tx.rollback();
        }finally{
            HibernateUtil.closeSession();
        }
        return user;
    }

    @Override
    public void delete(User user) {
        // TODO Auto-generated method stub
        Session session=HibernateUtil.getSession();
        Transaction tx=session.beginTransaction();
        try{
            session.delete(user);
            tx.commit();            
        }catch(Exception e){
            e.printStackTrace();
            tx.rollback();
        }finally{
            HibernateUtil.closeSession();
        }
        
    }

    @Override
    public void update(User user) {
        // TODO Auto-generated method stub
        Session session=HibernateUtil.getSession();
        Transaction tx=session.beginTransaction();
        try{
            session.update(user);
            tx.commit();
        }catch(Exception e){
            e.printStackTrace();
            tx.rollback();
        }finally{
            HibernateUtil.closeSession();
        }
        
    }

}

10. Junit是一种进行单元测试的常用方法,这里我们简单介绍一下Eclipse中JUnit4的用法,我们以save方法为例,对save方法完成测试:

(1)建立测试用例。

Properties-》Java Build Path-》Add Library...最后在Add Library对话框中选中Junit单击Next按钮。

(2)在使用JUnit4测试时,不需要main方法,可以直接用IDE进行测试。创建一个org.hibernate.test包,右击包,选择New-》JUnit Test Case,弹窗New JUnit Test Case窗口。

 

 

 配置完成,则会出现UserTest方法,将UserTest类补充完成即可。

package org.hibernate.test;

import static org.junit.Assert.*;

import org.hibernate.dao.DAOFactory;
import org.hibernate.dao.UserDAOImpl;
import org.hibernate.dao.UserDao;
import org.hibernate.entity.User;
import org.junit.Before;
import org.junit.Test;
//测试用例
public class UserTest {

    @Before                                  //注解表明setUp方法为初始化方法
    public void setUp() throws Exception {
    }

    @Test                                   //测试save方法
    public void testSave() {
        UserDao userdao=DAOFactory.getUserDAOInstance();
        //UserDao userdao=new UserDAOImpl();
        try{
            User u=new User();              //创建User对象
            u.setId(20);
            u.setName("zhangsan");
            u.setPassword("4567");
            u.setType("admin");
            userdao.save(u);                //使用UserDAOImpl的save方法将User对象存入数据库
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}

 (3)在UserTest.java节点上单击右键,Run As-》JUnit Test测试。

自此,查看数据库,数据插入到数据库中,测试成功!!!!!!

 

以上是关于Hibernate快速上手的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate学习笔记---hibernate快速上手与准备工作

快速上手React:

JOOQ快速上手(基于springboot 和 postgresql)

具有运行时 pojos 的带有 Hibernate 的 OSGi 片段包

新浪SAE快速上手教程

《Python编程快速上手》6.7实践项目代码