前言
hibernate是一个数据持久化层的ORM框架,是对基本jdbc的进一步封装。那么,什么是ORM?ORM是“对象关系映射(Object Relationship Mapping)”的简称。下面分别解释这3个单词:
1,Object:java对象,这里特指javabean。
2,Relationship:关系(二维表),特指关系型数据库中的表。
3,Mapping:映射,指对象(Object)的属性与表(Relationship)中的字段存在对应关系。
ORM就是将java对象映射到数据库表,通过操作java对象,然后完成对数据库表的操作。
正文
一,hibernate基本架构
上图是高抽象级别的结构视图
上图显示了基本结构和一些重要的类
hibernate使用了现存的java API,比如jdbc,java事务API(JTA)等。下面简要说明hibernate中涉及到的常用类。
1,配置文件加载类Configuration,其在应用程序初始化时创建。配置类有2个基本组件:
a-数据库连接:文件有hibernate.properties或者hibernate.cfg.xml
b-类映射文件:用于创建javabean与数据库之间的联系。
2,SessionFactory类:相当于建立java web连接池,用于管理所有session。
3,Session类:一个会话被用于创建与数据库的连接, 相当于jdbc的Connection。
4,Transaction类:事务管理类
5,Query类:hibernate执行HQL语句时,使用对象和属性进行查询。session.createQuery(“HQL语句”)。
6,Crireria类:Criteria 对象被用于创造和执行面向规则查询的对象来检索对象。
二,一个hibernate案例的完整目录结构
三,java对象属性和表字段的映射
首先加载hibernate.cfg.xml创建数据库连接,接着创建javabean属性和数据库表字段之间的联系。接下来就可以通过操作java对象来操作数据库表啦。
四,对象操作示例
1,一般地,我们在编写hibernate程序时,要重复的获取数据库连接,创建sessionFactory,并且在程序结束时关闭sessionFactory。这些重复性的工作提取出来封装进HibernateUtils.java类。
package com.jimmy.utils;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
/**
* hibernate工具类,封装了hibernate的重复性初始化代码
*
* 1,封装“配置文件读取”操作
* 2,封装“创建sessionFactory”操作
* 3,封装“获取session”操作
*/
public class HibernateUtils {
//整个程序应该只有一个sessionFactory
private static SessionFactory sessionFactory;
static {
//加载配置文件
Configuration configure = new Configuration().configure();
//创建session工厂
sessionFactory = configure.buildSessionFactory();
//关闭虚拟机时,释放session工厂
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
sessionFactory.close();
}
}));
}
public static Session openSession(){ //创建session
return sessionFactory.openSession();
}
public static Session getCurrentSession(){ //获取当前session
return sessionFactory.getCurrentSession();
}
}
2,增删改查
package com.jimmy.test;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.jimmy.domain.User;
import com.jimmy.utils.HibernateUtils;
public class TestDemo2 {
@Test
public void saveTest(){
Session session = HibernateUtils.openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
//----------开启事务
User user = new User(); //瞬时态
user.setUsername("haha"); //瞬时态
user.setPassword("131313"); //瞬时态
session.save(user); //持久态
//----------提交事务
transaction.commit(); //持久态
} catch (HibernateException e) {
e.printStackTrace();
transaction.rollback();
} finally{
session.close(); //游离态
}
}
@Test
public void updateTest(){
Session session = HibernateUtils.openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
//----------开启事务
User user = (User)session.get(User.class, 9); //根据表id获取User对象
user.setUsername("xixi"); //重新设置值
user.setPassword("222");
session.update(user); //保存对象
//----------提交事务
transaction.commit(); //持久态
} catch (HibernateException e) {
e.printStackTrace();
transaction.rollback();
} finally{
session.close(); //游离态
}
}
@Test
public void deleteTest(){
Session session = HibernateUtils.openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
//----------开启事务
User user = (User)session.get(User.class, 9); //根据表id获取User对象
session.delete(user); //保存对象
//----------提交事务
transaction.commit(); //持久态
} catch (HibernateException e) {
e.printStackTrace();
transaction.rollback();
} finally{
session.close(); //游离态
}
}
@Test
public void queryTest(){
Session session = HibernateUtils.openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
//----------开启事务
Query query = session.createQuery("from com.jimmy.domain.User"); //HQL语句
List<User> list = query.list(); //获取所有用户信息,存入List列表
//----------提交事务
transaction.commit(); //持久态
} catch (HibernateException e) {
e.printStackTrace();
transaction.rollback();
} finally{
session.close(); //游离态
}
}
}
上述代码,我们可以看到,对数据库的操作完全转变为对java对象的操作。