实体类编写规则
(1)体类里面属性私有的
(2)私有属性使用公开的set和get方法操作
(3)要求实体类有属性作为唯一值(一般使用id值)
(4)实体类的属性建议不使用基本数据类型,使用基本类型对应的包装类
hibernate主键生成策略
1、hibernate要求实体类里面有一个属性作为唯一值,对应表主键,主键可以不同生成策略
2、hibernate主键生成策略有很多值
<!-- 设置数据库表id增长策略
native:生成表id值就是主键自动增长
-->
<generator class="native"></generator>
3、在class属性里有值
(1)native:hibernate根据使用的数据库选择哪个值
(2)uuid:之前web阶段写代码生成UUID值,hibernate可以生成UUID值
4、演示生成策略值UUID
(1)使用UUID生成策略,实体类id属性类型必须是字符串类型
private String uid;
(2)配置部分写出uuid值
<generator class="uuid"></generator>
实体类的操作
crud操作
1、添加操作
//添加功能
User user = new User();
user.setUsername("小李");
user.setPassword("220");
user.setAddress("US");
//调用session中save方法实现
session.save(user);
2、根据id查询
调用session里面的get方法实现
//调用session里面的get方法
//第一个参数:实体类的class
//第二个参数:id值
User user = session.get(User.class, 1);
System.out.println(user);
3、修改操作
先查询,修改值(在这里save方法也可以实现更新操作,不建议)
//查询id
User user = session.get(User.class, 2);
//向返回的user对象里面设置修改之后的值
user.setUsername("修改");
//调用session的update方法修改
session.update(user);
4、删除操作
// 4删除操作
//第一种:根据id查询对象
User user = session.get(User.class, 2);
session.delete(user);
//第二种:
User user = new User();
user.setUid(3);
session.delete(user);
实体类对象状态
1、实体类状态有三种
(1)瞬时态:对象里面没有id值,对象与session没有关联
User u = new User();
u.setUsername("jack");
u.setPassword("123");
u.setAddress("China");
(2)持久态:对象里面有id值,对象与session有关联
User user = session.get(User.class, 2);
(3)托管态:对象里面有id值,对象与session没有关联
User user = new User();
user.setUid(3);
2、演示操作实体类对象的方法
(1)saveOrUpdate方法:实现添加、修改
User user = new User();
user.setUsername("jack");
user.setPassword("123");
user.setAddress("朝鲜");
// 实体类是瞬时态,做添加
session.saveOrUpdate(user);
User user = new User();
user.setUid(6);
user.setUsername("rose");
user.setPassword("123");
user.setAddress("阿尔巴尼亚");
// 实体类是托管态,做修改
session.saveOrUpdate(user);
User user = session.get(User.class, 7);
user.setUsername("lilei");
// 实体类是持久态,做修改
session.saveOrUpdate(user);
hibernate一级缓存
什么是缓存
1、数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。
(1)把数据存到内存里面,不需要使用流方式,可以直接读取内存中的数据
(2)把数据放到内存中,提高读取效率
Hibernate缓存
1、hibernate框架中提供了很多优化方式,hibernate的缓存就是一个优化方式
2、hibernate缓存特点:
第一类:hibernate的一级缓存
(1)一级缓存默认打开
(2)hibernate的一级缓存使用范围:是session范围,从session创建到关闭范围
(3)hibernate的一级缓存中,存储数据必须是*持久态数据*
第二类:hibernate的二级缓存
(1)目前已经不适用了,替代技术为:redis
(2)二级缓存不是默认打开,需要配置
(3)二级缓存使用范围,是sessionFactory范围
验证一级缓存存在
1、验证方式:
(1)首先根据uid=1查询,返回对象
(2)其次再根据uid=1查询,返回对象
// 1根据uid=5查询
// 执行第一个get方法是否查询数据库,是否发送sql语句
User user1 = session.get(User.class, 5);
System.out.println(user1);
// 执行第一个get方法是否查询数据库,是否发送sql语句
User user2 = session.get(User.class, 5);
System.out.println(user2);
一级缓存的特性
1、持久态自动更新数据库
-修改user对象里面的值、修改持久态的值、修改缓存中的内容
-修改一级缓存的内容,但是不会修改一级缓存对应的快照区的内容
-提交事务时候,比较一级缓存和对应快照区的内容是否相同,不相同把一级缓存内容更新到数据库里面
// 1根据id查询
User user = session.get(User.class, 5);
// 2设置返回值
user.setUsername("hanmeimei");
hibernate的事务操作
事务相关概念
1、事务概念
2、事务特性
3、不考虑隔离性产生问题
(1)脏读
(2)不可重复读
(3)虚读
4、设置事务隔离级别
(1)MySQL默认隔离级别:repeatable read
<!-- 事务隔离级别
hibernate.connection.isolation = 4
1-Read uncomitted isolation
2-Read comitted isolation
4-Repeatable read isolation
8-Serializable isolation -->
<property name="hibernate.connection.isolation">4</property>
事务代码规范写法
代码结构
try{
开启事务
提交事务
} catch() {
回滚事务
} finally {
关闭资源
}
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
User user = new User();
user.setUsername("小马");
user.setPassword("123");
user.setAddress("美国");
session.save(user);
int i = 10/0; // 模拟异常
tx.commit();
} catch(Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
session.close();
sessionFactory.close();
}
Hibernate绑定session
1、session类似jdbc的connection,和web阶段的threadLocal类似
2、帮实现与本地线程绑定session
3、获取与本地线程session
(1)在hibernate核心配置文件中配置
<!-- 配置session绑定本地线程 -->
<property name="hibernate.current_session_context_class">thread</property>
(2)调用sessionFactory里面的方法得到
//提供返回与本地线程绑定的session方法
public static Session getSesionObject() {
return sessionFactory.getCurrentSession();
}
4、获取与本地线程绑定session时候,关闭session报错,不需要手动关闭
Hibernate的api使用
Query对象
1、使用query对象,不需要写SQL语句,但是写hql语句
(1)hql:hibernate query language,hibernate提供查询语言,hql语句和SQL语句类似
(2)hql和sql区别:
-使用sql操作表和表字段
-使用hql操作实体类和属性
2、查询所有hql语句
(1) from实体类名称
3、Query对象使用
(1)创建Query对象
(2)调用query对象里面的方法得到
// 创建Query对象,方法里面写hql语句
Query query = session.createQuery("from User");
// 调用query对象里面的方法
List<User> list = query.list();
for(User user : list) {
System.out.println(user);
}
Criteria对象
1、使用这个对象查询操作,但是使用这个对象时候,不需要写语句,直接调用方法实现
2、实现过程
(1)创建criteria对象
(2)调用里面的方法得到结果
Criteria criteria = session.createCriteria(User.class);
List<User> list = criteria.list();
for(User user : list) {
System.out.println(user);
}
SQLQuery对象
1、使用hibernate时候,调用底层sql实现
2、调用里面的方式
-返回list集合,默认里面每部分数组结构
SQLQuery sqlQuery = session.createSQLQuery("select * from t_user");
List<Object[]> list = sqlQuery.list();
for(Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
-返回list中每部分是对象形式
SQLQuery sqlQuery = session.createSQLQuery("select * from t_user");
sqlQuery.addEntity(User.class);
List<User> list = sqlQuery.list();
for(User user : list) {
System.out.println(user);
}