Hibernate简介
1.1项目中架构的体系结构
1.2 ORM框架
- 对象关系映射(英语:Object Relational Mapping简称ORM)
- 是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换
- Object对象,java对象此处特指JavaBean
- Relational 关系二维表、数据库中的表
- Mapping映射
1.3什么是Hibernate
Hibernate是一个开源源代码的对象关系映射框架,他对于JDBC进行了非常轻量级的对象封装
它将POJO与数据库表建立映射关系,是一个全自动的ORM框架,POJO(Plain Ordinary Java Object)简单的java对象,实际就是普通的JavaBean
Hibernate 可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库
Hibernate可以应用在任何的JDBC的场合,即可以在Java的客户端程序使用,也可以在Servlet.jsp的web应用中使用
Hibernate是一个数据持久化的ORM框架,它的主要功能就是把对象映射到表中,操作API,只需要将一个对象存储到数据库,不需要写SQL语句
Hibernate也提供了对关系型数据库的增删改查操作
1.4主流的ORM框架
- JPA Java persistence API JPA通过JDK5.0注解或xml描述对象关系表的映射
- Hibenate最流行ORM框架,通过对象关系映射配置,可以完全脱离底层
- MyBatis本是apache的一个开源项目iBatis支持的普通SQL查询存储过程和高级映射的优秀持久层框架
1.5Hibernate优点
- Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问繁琐的重复性代码
Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的ORM实现,它很大程度上简化了DAO层编码工作session.save(user)
Hibernate使用Java的反射机制
Hibernate性能非常好,因为它是一个轻量级框架,映射的灵活性很出色,它支持很多关系型数据库,从一对一到多对多的各种复杂关系
Hibernate的简单使用
2.1Hibernate的使用步骤
- 下载Hibernate的jar包,并导入到项目中下载地址
-
创建数据库和表
- 配置核心的配置文件hibernate.cfg.xml 这个文件有连接数据库的配置,创建该文件并放入到src文件目录下
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/hibernate_day01
root
123456
true
true
true
- 编写映射文件hibernate.mapping *.hbm.xml声明对象如何关系连接库表字段,该文件放入与对应的Model同一目录下创建
- 调用hibernate的api
@Test
public void test01() {
//保存用户数据
//1.获取核心配置文件对象,默认是加载src的hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure();
//2.创建会话工厂
SessionFactory sessionFactory = cfg.buildSessionFactory();
//创建会话[会话相当于连接connect]
Session session = sessionFactory.openSession();
//开启事务
Transaction transaction = session.getTransaction();
transaction.begin();
//保存【直接把对象保存到数据库】
User user = new User();
user.setUsername("gyf");
user.setPassword("123");
session.save(user);
//提交事务
transaction.commit();
//关闭会话
session.close();
//关闭工厂释放资源
sessionFactory.close();
}
jar包功能解析图
3 Hibernate API详解
3.1 Configuration配置对象
Hibernate的核心文件的多种形式
- hibernate.cfg.xml通常使用xml配置文件,可以配置内容更丰富
- hibernate.properties用于配置key/value形式的内容。key不能充分的配置有很多的局限性。一般不用
Configuration对象用于加载配置文件
new Configuration构造方法配置加载的是hibernate.properties,configue()方法加载hibernate.cfg.xml,默认情况下上面两种配置都可以放在src目录下,configure(String resource)这个方法可以指定配置文件的路径
public Configuration configure() throws HibernateException {
this.configure("/hibernate.cfg.xml");
return this;
}
3.2 SessionFactory工厂
连接池操作数据库和Session操作数据库流程图对比
- SessionFactory相当于Java Web连接池,用于管理所有的Session
- 获得SessionFactory方式config.buildSessionFactory()
- SessionFactory还用于缓存配置信息(数据库配置信息,映射文件预定HQL语句等)
- SessionFactory线程安全的可以是成员变量,多个线程同时访问时,不会出现线程并发问题
3.3Session会话
SessionFactory提供了两种方法获取session
- factory.openSession();获取一个全新的session
- factory.getCurrentSession()获取一个与当前线程绑定的session
如果要使用第二种方法
a.必须在hibernate.cfg.xml中配置
thread
b.hibernate支持将创建的session绑定到本地线程中,底部使用ThreadLocal,在程序之间共享Session
c.如果提交或者回滚事务,底层将自动关闭session
//创建会话[会话相当于连接connect]
Session session = sessionFactory.openSession();
Session session_1 = sessionFactory.openSession();
Session session1 = sessionFactory.getCurrentSession();
Session session2 = sessionFactory.getCurrentSession();
System.out.println(session.hashCode());
System.out.println(session_1.hashCode());
System.out.println(session1.hashCode());
System.out.println(session2.hashCode());
new Thread(){
@Override
public void run() {
super.run();
Session session3 = sessionFactory.getCurrentSession();
Session session4 = sessionFactory.getCurrentSession();
System.out.println(session3.hashCode());
System.out.println(session4.hashCode());
}
}.start();
//关闭会话
session.close();
session_1.close();
3.4Transaction事务
掌握hibernate怎么获取事务,开启、提交和回滚事务
获得事务Transaction trans = session.getTransaaction();
trans.begin:开启事务 、 trans.commit:提交事务 trans.rollback回滚事务
扩展,不需要手动的管理事务,之后所有的事务管理都交于Spring
事务也可以在hibernate.cfg.xml配置文件中设置
true
3.5Session的API
save保存
User user = new User();
user.setUsername("gyf");
user.setPassword("123");
session.save(user);
get通过id查询,如果没有null
User user = (User) session.get(User.class,7);
if (user != null) {
System.out.println(user);
}else{
System.out.println("user is null");
}
load通过id查询,如果没有抛异常
try{
User user = (User) session.load(User.class,7);
}catch (Exception e){
e.printStackTrace();
}
upload更新
- 获取数据,调用set方法赋值,自动更新执行update方法
//开启事务
Transaction transaction = session.getTransaction();
transaction.begin();
User user = (User) session.get(User.class,1);
if (user != null) {
user.setPassword("123456");
session.update(user);
}
//提交事务
transaction.commit();
- 方法二,自己封装User对象,设置id时候需要调用update方法
User user = new User();
user.setUid(2);
user.setUsername("lisi");
user.setPassword("1234");
session.update(user);
delete删除
方法一
User user = (User) session.get(User.class,2);
session.delete(user);
方法二
User user = new User();
user.setUid(2);
session.delete(user);
3.6 get和load的区别
- get方法是直接加载数据库
- load的设计是依赖懒加载,用到时才会查询数据库
- load方法返回的是对象的一个代理
load的执行流程图
3.7Query查询对象
HQL:Hi9bernate Query Language 的缩写,就是Hibernate的查询语言,面向对象查询语言,最终底层要转成面向数据库查询语言
Query:用于查询对象,可以设置条件和分页查询
Query query = session.createQuery("from User where username=? and password=?");
query.setParameter(0,"gyf");
query.setParameter(1,"123456");
User user = (User) query.uniqueResult();
3.8 Criteria
QBC(query by criteria)hibernate提供纯面向对象查询语言,提供直接使用PO对象进行操作
- Criteria:Hibernate独创的查询对象,全程无hql语句
eq等于
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.eq("username","gyf"));
User user = (User) criteria.uniqueResult();
gt大于 注意如果是一条数据则使用uniqueResult 如果是返回多条数据使用上面的方法就会报错,需要使用list方法
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.gt("uid",2));
User user = (User) criteria.uniqueResult();
ge大于等于
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.ge("uid",2));
List
lt小于
criteria.add(Restrictions.lt("uid",2));
List
le小于等于
criteria.add(Restrictions.le("uid",2));
List
模糊查询
criteria.add(Restrictions.like("username","%s%"));
List
3.9 SQLQuery
SQLQuery使用原生的SQL语句查询
使用原生SQL来查询数据
SQLQuery query = session.createSQLQuery("select * from user");
List objs = query.list();
for (int i = 0; i < objs.size(); i++) {
Object object = objs.get(i);
System.out.println(object);
}
Hibernate封装工具类
public class HibernateUtils {
private static SessionFactory factory;
static {
Configuration cfg = new Configuration().configure();
factory = cfg.buildSessionFactory();
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run() {
super.run();
System.out.println("------close sessionFactory-------");
factory.close();
}
});
}
public static Session openSession() {
return factory.openSession();
}
public static Session getCurrentSession() {
return factory.getCurrentSession();
}
}