• 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测试。

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

  • 相关阅读:
    OpenCV 最小二乘拟合方法求取直线倾角
    BFS-hdu-4101-Ali and Baba
    手机安全卫士开发系列(1)——功能列表
    【Linux常用工具】1.1 diff命令的三种格式
    手机安全卫士开发系列(2)——splash界面
    Ruby学习笔记(二)
    jQuery Animation实现CSS3动画
    HDU2699+Easy
    android中解析文件的三种方式
    查找某元素
  • 原文地址:https://www.cnblogs.com/yangyufan/p/5981739.html
Copyright © 2020-2023  润新知