hibernate框架:
1、hibernate框架应用在javaee三层结构中dao层框架
2、在dao层里面做对数据库crud操作,使用hibernate实现crud操作,hibernate底层代码就是jdbc,hibernate对jdbc进行封装,使用hibernate好处,不需要写复杂jdbc代码了,
不需要写sql语句实现
3、hibernate开源的轻量级的框架
什么是orm思想:
orm:objectrelational mapping,对象关系映射
(1)让实体类和数据库表进行一一对应关系
让实体类首先和数据库表对应
让实体类属性和表里面字段对应
(2)不需要直接操作数据库表,而操作表对应实体类对象
搭建hibernate环境:
1、导入hibernate的jar包
2、创建实体类
public class User {
private int id;
private String name;
private String pwd;
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}...
3、配置实体类和数据库表一一对应关系(映射关系)
(1)创建xml格式的配置文件
- 映射配置文件名称和位置没有固定要求
- 建议:在实体类所在包里面创建,实体类名称.hbm.xml
(2)配置是xml格式,在配置文件中首先引入xml约束
- 学过约束dtd、schema,在hibernate里面引入的约束dtd约束
(3)配置映射关系
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- package对应实体类的包 -->
<hibernate-mapping>
<!-- 对应的实体类,domain对象,pojo -->
<class name="com.jredu.entity.User" table="h_user">
<id name="id" column="id" type="java.lang.Integer">
<!-- 主键生成策略 -->
<!-- 序列的形式生成主键 -->
<generator class="sequence">
<!-- 指定参数:指定序列的名称 -->
<param name="sequence">SEQ_USER</param>
</generator>
</id>
<property name="name" column="name" type="java.lang.String"/>
<property name="pwd" column="pwd" type="java.lang.String"/>
<property name="address" column="address" type="java.lang.String"/>
</class>
</hibernate-mapping>
4、创建hibernate的核心配置文件
(1)核心配置文件格式xml,但是核心配置文件名称和位置固定的
- 位置:必须src下面
- 名称:必须hibernate.cfg.xml
(2)引入dtd约束
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
(3)hibernate操作过程中,只会加载核心配置文件,其他配置文件不会加载
第一部分:配置数据库信息必须的
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:jredu</property>
<property name="connection.username">hibernate</property>
<property name="connection.password">hibernate</property>
第二部分:配置hibernate信息可选的
<!-- 通常设置为update,当表不存在时自动创建 -->
<property name="hbm2ddl.auto">update</property>
<!-- 输出底层sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 输出底层sql语句格式 -->
<property name="hibernate.format_sql">true</property>
<!-- 配置数据库方言
在mysql里面实现分页 关键字 limit,只能使用mysql里面
在oracle数据库,实现分页rownum
让hibernate框架识别不同数据库的自己特有的语句
-->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!-- 在hibernate核心配置文件中配置 -->
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.c3p0.validate">true</property>
<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
第三部分:把映射文件放到核心配置文件中
<mapping resource="com/jredu/entity/User.hbm.xml"/>
实现添加操作:
第一步加载hibernate核心配置文件
第二步创建SessionFactory对象
第三步使用SessionFactory创建session对象
第四步开启事务
第五步写具体逻辑 crud操作
第六步提交事务
第七步关闭资源
SessionFactory sessionFactory=null;
Session session=null;
Transaction tx=null;
try {
//1、调用工具类得到sessionFactory
sessionFactory= HibernateUtils.getSessionFactory();
//2、获取session
session=HibernateUtils.getSessionobject();
//3、开启事务
tx=session.beginTransaction();
//4、添加用户
User user=new User();
user.setName("东方不败");
user.setPwd("123456");
user.setAddress("japan");
session.save(user);
//5、提交事务tx.commit();
} catch (Exception e) {
//事务回滚tx.rollback();
}finally{
//6、关闭
//session.close();
//当session与线程捆绑一块时,不需要再关闭sessionFactory.close();
}
Hibernate核心api:
//加载核心配置文件
cfg = new Configuration();
cfg.configure();
(1)到src下面找到名称hibernate.cfg.xml配置文件,创建对象,把配置文件放到对象里面(加载核心配置文件)
SessionFactory
1 使用configuration对象创建sessionFactory对象
(1)创建sessionfactory过程中做事情:
- 根据核心配置文件中,有数据库配置,有映射文件部分,到数据库里面根据映射关系把表创建
2创建sessionFactory过程中,这个过程特别耗资源的
(1)在hibernate操作中,建议一个项目一般创建一个sessionFactory对象
3 具体实现
(1)写工具类,写静态代码块实现
* 静态代码块在类加载时候执行,执行一次
public class HibernateUtils {
static Configuration cfg = null;
static SessionFactory sessionFactory = null;
//静态代码块实现
static {
//加载核心配置文件
cfg = new Configuration();
cfg.configure();
StandardServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();
sessionFactory = cfg.buildSessionFactory(serviceRegistry);
}
//提供返回与本地线程帮的session的方法
public static Session getSessionobject() {
return sessionFactory.getCurrentSession();
}
//提供方法返回sessionFactory
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Session
1 session类似于jdbc中connection
2 调用session里面不同的方法实现crud操作
(1)添加 save方法
(2)修改 update方法
(3)删除 delete方法
(4)根据id查询 get方法
3 session对象单线程对象
(1)session对象不能共用,只能自己使用
Transaction
1、事务对象
//3、开启事务
tx=session.beginTransaction();
2、事务提交和回滚方法
//提交事务
tx.commit();
//事务回滚
tx.rollback();
3、事务概念
(1)事务四个特性
原子性、一致性、隔离性、持久性
实体类编写规则:
1 实体类里面属性私有的
2 私有属性使用公开的set和get方法操作
3 要求实体类有属性作为唯一值(一般使用id值)
4 实体类属性建议不使用基本数据类型,使用基本数据类型对应的包装类
(1)八个基本数据类型对应的包装类
- int – Integer
- char—Character、
- 其他的都是首字母大写比如double – Double
(2)比如表示学生的分数,假如 int score;
- 比如学生得了0分,intscore = 0;
- 如果表示学生没有参加考试,int score = 0;不能准确表示学生是否参加考试
解决:使用包装类可以了, Integer score = 0,表示学生得了0分,
表示学生没有参加考试,Integer score = null;
hibernate主键生成策略:
1 hibernate要求实体类里面有一个属性作为唯一值,对应表主键,主键可以不同生成策略
2 hibernate主键生成策略有很多的值
3 在class属性里面有很多值
(1)native:根据使用的数据库帮选择哪个值,用于数值型自动增加
(2)uuid:之前web阶段写代码生成uuid值,hibernate帮我们生成uuid值,独一无二的字符串
(3)sequence:oracle使用
<!-- 主键生成策略 -->
<!-- 序列的形式生成主键 -->
<generator class="sequence">
<!-- 指定参数:指定序列的名称 -->
<param name="sequence">SEQ_USER</param>
</generator>
对实体类crud操作:
添加操作
User user=new User();
user.setName("东方不败");
user.setPwd("123456");
user.setAddress("japan");
session.save(user);
根据id查询
User user= (User) session.get(User.class, 4);
修改操作
User user= (User) session.get(User.class, 4);
user.setName("岳不群");
session.update(user);
删除操作
User user= (User) session.get(User.class, 4);
session.delete(user);
实体类对象状态:
1 实体类状态有三种
(1)瞬时态:对象里面没有id值,对象与session没有关联
User user=new User();
user.setName("东方不败");
user.setPwd("123456");
user.setAddress("黑木崖");
(2)持久态:对象里面有id值,对象与session关联
User user= (User) session.get(User.class, 4);
(3)托管态:对象有id值,对象与session没有关联
User user=new User();
user.setId(4);
2 演示操作实体类对象的方法
(1)saveOrUpdate方法:实现添加、实现修改
User user = new User();
user.setUsername("jack");
user.setPassword("520");
user.setAddress("朝鲜");
//实体类对象状态是瞬时态,做添加
session.saveOrUpdate(user);
// User user = new User();
// user.setUid(6);
// user.setUsername("rose");
// user.setPassword("1314");
// user.setAddress("阿尔巴尼亚");
//实体类对象状态是托管态,做修改
// session.saveOrUpdate(user);
// User user = session.get(User.class, 7);
// user.setUsername("lilei");
//实体类对象状态是持久态,做修改
// session.saveOrUpdate(user);
Hibernate缓存:
1 hibernate框架中提供很多优化方式,hibernate的缓存就是一个优化方式
2 hibernate缓存特点:
第一类 hibernate的一级缓存
(1)hibernate的一级缓存默认打开的
(2)hibernate的一级缓存使用范围,是session范围,从session创建到session关闭范围
(3)hibernate的一级缓存中,存储数据必须持久态数据
第二类 hibernate的二级缓存
(1)目前已经不使用了,替代技术 redis
(2)二级缓存默认不是打开的,需要配置
(3)二级缓存使用范围,是sessionFactory范围