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>();
    //使用静态代码块初始化Hibernatestatic{
        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测试。

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

时间: 2024-11-10 15:00:59

Hibernate快速上手的相关文章

Hibernate 快速上手操作入门

本文主要是从技术操作角度去介绍hibernate,并且简单描述如何快速的上手操作hibernate,用于作为与数据库的连接的持久层. 简单讲述一下hibernate究竟是什么,它有什么作用,在理解它的作用之前,我们先想一想,在一个项目当中,我们需要将项目当中的数据存入数据库,或者从数据库中读取项目当中需要的数据进行操作,我们往常一般使用什么方法呢?首先想到的就是通过JDBC去对数据库进行手动的操作,编写一个连接数据库的模块,通过加载driver并且手动编写增删改查方法联通程序与数据库当中的数据,

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

持久层介绍 持久化:将内存中的数据保存在磁盘等存储设备中. 持久化对象:指已经存储在数据库护着磁盘的业务对象 经典的软件应用体系结构(三层结构) 在三层结构中,由于业务逻辑除了负责业务逻辑以外,还要负责相关的数据库操作,为了更好的业务逻辑的开发,形成了一个新的,单独的持久化层,增加了持久化以后,就形成了四层结构 hibernate介绍 hibernate是一个开源的对象-关系映射(即ORM)的轻量级框架,它对JDBC进行了封装,开发人员通过使用面向对象的思想进行持久层开发,操作数据库. hibe

R语言快速上手入门

R语言快速上手入门 课程学习网址:http://www.xuetuwuyou.com/course/196 课程出自学途无忧网:http://www.xuetuwuyou.com 课程简介 本教程深入浅出地讲解如何使用R语言玩转数据.课程中涵盖R语言编程的方方面面,内容涉及R对象的类型.R的记号体系和环境系统.自定义函数.if else语句.for循环.S3类R的包系统以及调试工具等.本课程还通过示例演示如何进行向量化编程,从而对代码进行提速并尽可能地发挥R的潜能.本课程适合立志成为数据科学家的

Power BI教程_Power BI数据分析快速上手及案例实战

Power BI数据分析快速上手及案例实战 课程学习地址:http://www.xuetuwuyou.com/course/194 课程出自学途无忧网:http://www.xuetuwuyou.com 课程简介 本课程在<Power BI 数据分析快速上手>基础上结合大量的实例,深入讲解PowerBI中看似难懂的各种概念.操作, 并结合行业中的典型案例贯穿了从初级的数据透视表工具.数据透视表选项.数据透视表的刷新.数据透视表中的排序,到中级的动 态数据透视表的创建.数据透视表函数 GETPI

《Python编程快速上手 让繁琐工作自动化》pdf

<div id="article_content" class="article_content tracking-ad" data-mod="popu_307" data-dsm="post"> <p><br></p><p>下载地址:<a target="_blank" href="https://page74.ctfile.co

下载快速上手数据挖掘之solr搜索引擎高级教程(Solr集群、KI分词、项目实战)

Solr是一个高性能,采用Java开发,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎. 快速上手数据挖掘之solr搜索引擎高级教程(Solr集群.KI分词.项目实战),刚刚入手,转一注册文件,视频的确不错,可以先下载看看:http://pan.baidu.com/s/1jIdgtWM 密码:s1t3

Masonry介绍与使用实践:快速上手Autolayout

以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时代 window的size固定为(320,480) 我们只需要简单计算一下相对位置就好了 在iphone4-iphone4s时代 苹果推出了retina屏 但是给了码农们非常大的福利:window的size不变 在iphone5-iphone5s时代 window的size变了(320,568) 这时autoresizingMask派上了用场(为啥这时候不用Autolayout? 因为还要支持ios5呗) 简单

MongoDB快速上手

1.  MongoDB简介 MongoDB是一个跨平台的基于Key_Value键值对形式保存数据的NoSQL文档类型数据库. NoSQL(not only sql)数据库,泛指非关系型数据库. 1.1 NoSQL数据库的特点 l  不需要预定义模式 不需要事先定义数据模式,预定义表结构.数据中的每条记录都可能有不同的属性和格式.当插入数据时,并不需要预先定义它们的模式. l  无共享架构 相对于将所有数据存储的存储区域网络中的全共享架构.NoSQL往往将数据划分后存储在各个本地服务器上.因为从本

intellij idea 13&amp;14 插件推荐及快速上手建议 (已更新!)

原文:intellij idea 13&14 插件推荐及快速上手建议 (已更新!) 早些年 在外企的时候,公司用的是intellij idea ,当时也是从eclipse.MyEclipse转过去的很是不习惯. 用了一周明显感觉爱上它了.因为它很智能,而且能纠正你很多不好的习惯. 后来跳巢到一家上市公司.因为大家都在用MyEclipse,要求开发工具统一.没办法只能转回MyEclipse.不过个人倒是一直关注intellij idea版本的发布和新的功能. 最近开始使用intellij idea