一、Hibernate介绍
- 1、Hibernate是一种ORM框架,也就是持久层的框架,应用于DAO层,是对JDBC的一种封装,可以让程序直接通过面向对象的方式去完成对数据库的操作,可以做到不用手写SQL语句就能完成对数据库的各种操作。
- 2、ORM框架,那么什么是ORM?
O:Object
R:Relational
M:Mapping
ORM就是对象关系映射(Object Relational Mapping,简称ORM),关注的是对象和数据库中对应表的关系。通过描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。提供了对数据库的映射,不用SQL编码,能够像操作对象一样从数据库中获取数据。
二、Hibernate核心配置文件介绍
- 1、hbm.xml
hbm.xml是对象和表映射的配置文件,命名规则: 类名.hbm.xml
例如数据库有一个user表,在项目中有一个User类,做如下关联:
public class User {
private int id;
private String username;
private String mobile;
}
编写User.hbm.xml
<!--User类所在的包名-->
<hibernate-mapping package="com.jl.domain">
<!--类名为User,表名为user-->
<class name="User" table="user">
<!--主键映射,属性名为id,列名也为id-->
<id name="id" column="id">
<!--主键生成策略-->
<generator class="native"/>
</id>
<!--非主键映射,属性和列名一一对应-->
<property name="username" column="username"/>
<property name="mobile" column="mobile"/>
</class>
</hibernate-mapping>
- 2、hibernate.cfg.xml
<hibernate-configuration>
<!-- 一个session-factory节点代表一个数据库 -->
<session-factory>
<!-- 1. 数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://192.168.1.23:3306/jl</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!-- 数据库方言配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 2. 其他相关配置 -->
<!-- 2.1 显示hibernate在运行时候执行的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 2.2 格式化sql -->
<property name="hibernate.format_sql">true</property>
<!-- 2.3 自动建表 -->
<property name="hibernate.hbm2ddl.auto">create</property>
<!-- 3. 加载映射配置文件-->
<mapping resource="com/jl/domain/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
- 3、测试
package com.jl.domain;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
public class Test {
public static void main(String[] args) {
//创建对象
User user = new User();
user.setUsername("张三");
user.setMobile("13111111234");
//获取加载配置管理类
Configuration configuration = new Configuration();
//默认加载src/目录下的hibernate.cfg.xml配置文件
configuration.configure();
//创建Session工厂对象
SessionFactory factory = configuration.buildSessionFactory();
//得到Session对象
Session session = factory.openSession();
//开启事务
Transaction transaction = session.getTransaction();
transaction.begin();
//把数据保存到数据库中
session.save(user);
//提交事务
transaction.commit();
//关闭Session
session.close();
}
}
上面代码执行完成,数据库就会自动建表,并且包数据存入数据库中。
- 4、其他操作:
session.save(obj); // 保存一个对象
session.update(obj); // 更新一个对象
session.saveOrUpdate(obj); // 保存或者更新的方法
session.get(javaBean.class, int id); // 传入对应的class和id就可以查询
session.load(javaBean.class, int id); // 支持懒加载,
get和load都是根据主键查询,区别是session.get调用就发送SQL语句查询数据库,而session.load会延迟加载,调用后并不会马上发送SQL语句,而是后面用到这个对象的时候才会发送SQL语句查询数据;
三、Hibernate一级缓存、二级缓存
- 1、一级缓存
一级缓存是Hibernate框架自带的,我们无法手动干预,由hibernate自己管理,一级缓存是session级别的缓存,只有在使用同一个session操作数据库才会生效。
一级缓存常见操作:
1) flush : 修改一级缓存数据,针对内存操作, 需要在session执行flush操作时,将缓存变化同步到数据库,只有在 缓存数据 与 快照区 不同时,生成update 语句;
2) clear : 清除所有对象 一级缓存 ;
3) evict : 清除一级缓存 指定对象 ;
4) refresh :重新查询数据库,更新快照和一级缓存; - 2、二级缓存
二级缓存是sessionFactory缓存,它可以被多个session共享。
1)二级缓存的并发策略:
transactional : 提供Repeatable Read事务隔离级别 ,缓存支持事务,发生异常的时候,缓存也能够回滚;
read-write : 提供Read Committed事务隔离级别, 更新缓存的时候会锁定缓存中的数据;
nonstrict-read-write : 导致脏读, 很少使用 ;
read-only: 数据不允许修改 ,只能查询;
2)二级缓存配置步骤:
1.导入jar包
ehcache-1.5.0.jar,依赖 backport-util-concurrent 和 commons-logging
2.开启二级缓存,在hibernate.cfg.xml文件中配置
<property name="hibernate.cache.use_second_level_cache">true</property>
3.配置二级缓存提供商
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
4.设置二级缓存并发访问策略,有两种方式(设置哪些数据保存到二级缓存中)
方式1.一种是在hbm.xml文件中配置
<class name="com.jl.domain.User" table="user" >
<!-- 类级别缓存 -->
<cache usage="read-write"/>
<set name="user" cascade="all-delete-orphan" inverse="true" >
<!-- 关联集合级别缓存 -->
<cache usage="read-write"/>
</set>
</class>
方式2.一种是hibernate.cfg.xml
<class-cache usage="read-write" class="com.jl.domain.User" />
5.导入二级缓存的配置文件
在src中 配置 ehcache.xml ,将 ehcache-1.5.0 jar包中 ehcache-failsafe.xml 改名 ehcache.xml 放入 src 。