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,并且简单描述如何快速的上手操作hibernate,用于作为与数据库的连接的持久层. 简单讲述一下hibernate究竟是什么,它有什么作用,在理解它的 ...
- Hibernate学习笔记(1)---hibernate快速上手与准备工作
持久层介绍 持久化:将内存中的数据保存在磁盘等存储设备中. 持久化对象:指已经存储在数据库护着磁盘的业务对象 经典的软件应用体系结构(三层结构) 在三层结构中,由于业务逻辑除了负责业务逻辑以外,还要负 ...
- NHibernate3快速上手教程FluentNHibernate配置与DBHelper
很多学习NHibernate的新手很容易卡在配置文件这一关,正所谓万事开头难,上手后再配合官方文档就比较容易了. 网上关于配置文件的资料非常多,但由于版本的问题,许多老的教程中都没有明确指出类库的版本 ...
- Spring Boot 揭秘与实战(一) 快速上手
文章目录 1. 简介 1.1. 什么是Spring Boot 1.2. 为什么选择Spring Boot 2. 相关知识 2.1. Spring Boot的spring-boot-starter 2. ...
- NHibernate3快速上手教程FluentNHibernate配置与DBHelper(已过期,有更好的)
很多学习NHibernate的新手很容易卡在配置文件这一关,正所谓万事开头难,上手后再配合官方文档就比较容易了. 网上关于配置文件的资料非常多,但由于版本的问题,许多老的教程中都没有明确指出类库的版本 ...
- 【Python五篇慢慢弹】快速上手学python
快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...
- 快速上手Unity原生Json库
现在新版的Unity(印象中是从5.3开始)已经提供了原生的Json库,以前一直使用LitJson,研究了一下Unity用的JsonUtility工具类的使用,发现使用还挺方便的,所以打算把项目中的J ...
- [译]:Xamarin.Android开发入门——Hello,Android Multiscreen快速上手
原文链接:Hello, Android Multiscreen Quickstart. 译文链接:Hello,Android Multiscreen快速上手 本部分介绍利用Xamarin.Androi ...
- [译]:Xamarin.Android开发入门——Hello,Android快速上手
返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...
随机推荐
- SAPD:FSAF升级版,合理的损失值加权以及金字塔特征选择 | ECCV 2020
针对anchor-point检测算法的优化问题,论文提出了SAPD方法,对不同位置的anchor point使用不同的损失权重,并且对不同的特征金字塔层进行加权共同训练,去除了大部分人为制定的规则,更 ...
- C/C++ 大型工程工具链搭建
一.配置环境要求 C/C++ 编译器 此项有系统区别,如果是 Windows 平台,那么可以下载 VS2022 社区版,它自带 MSVC 编译器.如果嫌它太笨重,也可以直接下载 MSVC 再发行组件. ...
- cookie、session和Storage
概念: cookie:HTTP响应头的一部分,通过name=value的形式存储,主要用于保存登录信息.在设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭. 存放数据大小为4K左右 .有个 ...
- 安装MYSQL8.0提示api-ms-win-crt-runtime-l1-1-0.dll 丢失
Windows Server 2012 api-ms-win-crt-runtime-l1-1-0.dll 丢失 2017-11-06 11:11:37 Martin_Yelvin 阅读数 17015 ...
- LGP3426题解
真是不管什么时候来做这道题都会觉得很神仙呐... 观察一下,如果存在一个合法的印章,那么这个印章一定是这个串的前缀,也是这个串的后缀. 即合法的印章一定是原串的 \(\rm Border\). 于是设 ...
- (一)【转】asp.net mvc生成验证码
网站添加验证码,主要为防止机器人程序批量注册,或对特定的注册用户用特定程序暴力破解方式,以进行不断的登录.灌水等危害网站的操作.验证码被广泛应用在注册.登录.留言等提交信息到服务器端处理的页面中. ...
- 一个简单的模拟实例说明Task及其调度问题
Task对于.NET的重要性毋庸置疑.通过最近的一些面试经历,发现很多人对与Task及其调度机制,以及线程和线程池之间的关系并没有清晰的认识.本文采用最简单的方式模拟了Task的实现,旨在说明Task ...
- S120的基本定位功能
转自:https://support.industry.siemens.com/cs/document/84136148/s120%E7%9A%84%E5%9F%BA%E6%9C%AC%E5%AE%9 ...
- linux下的shell脚本
先说明以下内容来自: http://c.biancheng.net/cpp/shell/ ,C语言中文网,请大家支持原作,点击链接查看. 我写下来只是作为笔记,如果侵权,请留言,立马删除. Shell ...
- SpringBean的生命周期 以及一些问题总结
SpringBean的生命周期 一.传统 Bean 的生命周期 new实例化: 可使用了 无引用时,GC回收. 二.Servlet 的生命周期 实例化Servlet对象: init初始化对象: 相应客 ...