Hibernate快速上手
来源:互联网 发布:广州sd卡数据恢复 编辑:程序博客网 时间:2024/05/16 19:44
一.Hibernate工作原理
5个核心接口:Configuration接口、SessionFactory接口、Session接口、Transaction接口和用于数据查询的
Query接口。
Hibernate进行持久化操作的主要步骤:
(1)Hibernate初始化:创建Configuration对象。
读取XML配置文件和映射文件的信息到Configuration对象的属性中:
1.从Hibernate配置文件Hibernate.cfg.xml中读取配置信息,存放到Configuration对象(内存)中。
2.根据配置文件中的mapping元素加载所有实体类对应的映射文件到Configuration对象中。
(2)创建SessionFactory实例。
将Configuration对象内的配置信息存入SessionFactory的内存(属性)中。SessionFactory充当数据存储
源的代理,负责创建Session对象。
(3)创建Session实例,建立数据库连接。
Session通过SessionFactory打开,创建一个Session对象就相当于与数据库建立了一个新的连接。Session
对象用来操作实体对象,并把这些操作转换成对数据库中数据的增加、删除、查询和修改操作。
(4)创建Transaction实例,开始一个事务。
Transaction用于事务管理,一个Transaction对象对应的事务可以包括多个操作。使用Hibernate进行增
加、删除、修改操作时必须先创建Transaction对象。
(5)利用Session接口提供的方法进行持久化操作。将实体对象持久化到数据库中。
(6)提交操作结果并结束事务。对实体对象的持久化操作结束后,必须提交事务。
(7)关闭Session,与数据库断开连接。
二.开发Hibernate项目的完整流程
(1)准备开发环境,创建Hibernate项目
(2)数据库中创建所需数据表
(3)创建持久化类(xxx.java)
包括表中的各种字段属性,
(4)设计映射文件(xxx.hbm.xml),使用Hibernate映射文件将POJO对象映射到数据库。
<hibernate-mapping> <!-- name指定持久化类的类名,table指定数据表的表名 --> <class name="com.model.xxx" table="user"> <!-- 标识属性 --> <id name="id" type="java.lang.Integer" column="user_id"> <generator class="increment"></generator> </id> <property name="name" type="java.lang.String" column="name" length="20"></property> </class> </hibernate-mapping>
(5)创建Hibernate的配置文件Hibernate.cfg.xml.
<hibernate-configuration> <session-factory> <!-- 方言(数据库类型) --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 数据库连接URL --> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mysqldb</property> <!-- 数据库用户名 --> <property name="hibernate.connection.username">root</property> <!-- 数据库密码 --> <property name="hibernate.connection.password">xxxxxx</property> <!-- 配置数据库JDBC驱动 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 数据库连接池(保存的最大数据库连接数) --> <property name="connection.pool_size">1</property> <!-- 输出运行时生成的sql语句到控制台,(方便调试) --> <property name="show_sql">true</property> <!-- 列出所有的映射文件 --> <mapping resource="包名/xxx.hbm.xml"/> </session-factory> </hibernate-configuration>
(6)编写辅助工具类HibernateUtil.Java
org.hibernate.SessionFactory是一个线性安全的对象,只能被实例化一次。使用
org.hibernate.SessionFactory可以获得一个或多个org.hibernate.Session实例。
HibernateUtil类的基本实现代码如下:
import org.hibernate.*;import org.hibernate.cfg.*;public class HibernateUtil {private static SessionFactory sessionFactory;//一个代码只创建一个Configuration实例private static Configuration configuration = new Configuration(); //创建线程局部变量threadLocal,用来保存Hibernate的Sessionprivate static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();//使用静态代码块初始化Hibernate,只在类被加载时执行一次static {try {Configuration cfg=new Configuration().configure(); //读取配置文件 hibernate.cfg.xmlsessionFactory=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; //将新打开的Session实例保存到线程局部变量threadLocal中 threadLocal.set(session); } return session;}//关闭Session实例public static void closeSession() throws HibernateException {//从线程局部变量threadLocal中获取之前存入的Session实例Session session = (Session) threadLocal.get(); threadLocal.set(null); if (session != null) { session.close(); } }//重建SessionFactorypublic static void rebuildSessionFactory() { try { configuration.configure("/hibernate.cfg.xml"); //读取配置文件hibernate.cfg.xml sessionFactory = configuration.buildSessionFactory(); //创建SessionFactory } catch (Exception e) { System.err.println("Error Creating SessionFactory "); e.printStackTrace(); }}//关闭缓存和连接池public static void shutdown() {getSessionFactory().close();}}
代码解说: 创建Configuration实例的作用 1.读取hibernate.cfg.xml配置文件信息
new Configuration().configure(); 或 Configuration configuration = new Configuration(); configuration.configure();
(1)new Configuration()方法被调用时,查找classpath根目录下的hibernate.properties文件(总是位于类路 径的根目录下)。 (2)configure()方法被调用时,查找classpath根目录下的hibernate.cfg.xml文件,找不到,则抛出 HibernateException。 Configure接口的一个带参数的方法:
//configFile指定了hibernate.cfg.xml文件的位置 public Configuration configure(File configFile) throws HibernateException{}
2.创建SessionFactory实例
new Configuration().configure().buildSessionFactory(); 或 sessionFactory = configuration.buildSessionFactory();
!!只有当应用中存在多个数据源时,才为每个数据源创建一个SessionFactory实例。 获取Session实例的代码:
Session session = sessionFactory.openSession();
Session并不是线程安全的,常用的管理方案是使用ThreadLocal模式。 ThreadLocal指线程局部变量,功能是为每个使用变量X的线程提供一个X的副本。 ThreadLocal类中提供了一个Map,ThreadLocal使用这个Map来存储每一个线程中的变量副本。
(7)编写DAO层类
DAO指的是数据库访问对象,将底层数据访问逻辑与上层的业务逻辑隔离开。
//四个方法:插入、删除、查找、更新 public void save(User user)|delete(User user)|update(User user){ Session session = HibernateUtil.getSession(); //创建Session实例 Transaction tx = session.beginTransaction(); //创建Transaction实例 try{ // 插入 删除 更新 session.save(user)|session.delete(user)|session.update(user); tx.commit(); //提交事务 }catch(Exception e){ e.printStackTrace(); tx.rollback(); }finally{ HibernateUtil.closeSession(); //关闭Session实例 } } //查找用户 public User findById(int id){ User user = null; Session session = HibernateUtil.getSession(); //创建Session实例 Transaction tx = session.beginTransaction(); //创建Transaction实例 try{ user = (User)session.get(User.class, id); tx.commit(); //提交事务 }catch(Exception e){ e.printStackTrace(); tx.rollback(); }finally{ HibernateUtil.closeSession(); } return user; }
三、进阶:
如果没有提供DAO工厂类,则必须要创建DAO实现类的实例来完成数据库的操作,这对于后期的代码重用和维护都非常
不便。(若将操作Mysql数据库的DAO实现类改为操作Oracle数据库的DAO实现类,则必须修改所有使用DAO实现类的
那些代码)
可通过DAO工厂类提供的一个静态方法来获取DAO实现类的实例,当需要替换DAO实现类时,只需在该DAO工厂中修
改静态方法的代码。
public class DAOFactory{ //返回UserDao实现类的实例 public static UserDao getUserDaoInstance(){ return new UserDaoimpl(); } } //通过Dao工厂来获得Dao实现类的实例 UserDao userDao = DAOFactory.getUserDaoInstance();
- Eclipse快速上手Hibernate
- 快速上手Hibernate
- 快速上手Hibernate
- Hibernate快速上手
- Hibernate快速上手
- Hibernate学习(1)----Hibernate快速上手
- Hibernate初体验Cat之快速上手
- Hibernate初体验Cat之快速上手
- Eclipse快速上手Hibernate--1. 入门实例
- Eclipse快速上手Hibernate--5. 组件映射
- Eclipse快速上手Hibernate--1. 入门实例
- Eclipse快速上手Hibernate--1. 入门实例
- Eclipse快速上手Hibernate--1. 入门实例
- Eclipse快速上手Hibernate之入门实例
- Eclipse快速上手Hibernate之入门实例
- Eclipse快速上手Hibernate--5. 组件映射
- Eclipse快速上手Hibernate之入门实例
- Eclipse快速上手Hibernate--1. 入门实例
- 第十一周项目4哈夫曼编码的算法验证
- 例3.4 使用栈判断回文
- 第九周实践项目2—对称矩阵压缩存储的实现与应用(2)
- ftp提取文件到hdfs
- java面向对象之继承
- Hibernate快速上手
- Ionic中集成和卸载 Crosswalk
- 黑马程序员——IO——File、常用流对象演示
- Codeforces Round #330 (Div. 2)B Pasha and Phone
- Cocoapods第三方库快速集成
- HTML5 的标签大全以及相关属性
- Spring注解详解
- 安卓中的gridview
- HDU 1276 士兵队列训练问题