实体类编写规则
- 实体类的属性都是私有的
- 私有属性都有公开的
get,set
方法来操作 - 要求实体类有属性作为唯一值(一般使用id值)
- 实体类属性建议不使用基本数据类型,使用基本数据类型对应的包装类
- 八个基本数据类型对应的包装类
int
—>Integer
,char
—>Character
,其他都是首字母大写,例如double
—>Double
- 为什么要用包装类?
因为包装类相当于操作一个对象,它可以为null
值,但是基本数据类型就不可以。数据库中有字段为null
的情况。
hibernate主键生成策略
hibernate
要求实体类中有一个属性作为唯一值,对应表主键,主键也有不同的生成策略。主键可以是自增长,也可以是UUID
生成,hibernate
中也提供了很多种主键生成策略。
<generator class="native"></generator>
class
属性中有很多值:
native
: 根据使用的数据库帮选择哪个值uuid
: 之前web
阶段写代码生成uuid
值,hibernate
帮我们生成uuid
值
- 如何使用
uuid
?
- 修改实体类中
uid
的类型为string
,修改get(),set()
方法的类型。 - 在配置文件中,换成
uuid
<generator class="uuid"></generator>
- 在
hibernateUtils
类中加入main()
方法,让他执行。
CRUD操作
- 添加操作
User user = new User();
user.setUsername("张三");
user.setPassword("123456");
user.setAddress("上海");
//调用session的方法进行添加
session.save(user);
- 根据id查询
4.根据id查询
调用session里面的get方法
第一个参数:实体类的class
第二个参数:id值
User user = session.get(User.class, 1);
需要事先在User实体类中重写tosring方法
System.out.println(user);
- 修改操作
- 先根据id查询出来,然后再修改
4.修改操作
先根据id查询出来,调用session里面的get方法
User user = session.get(User.class, 2);
向返回的user对象中设置修改之后的值
user.setUsername("我的桐宝");
调用session中update方法修改
session.update(user);
- 删除操作
4.删除操作
方法一:先根据id查询出来,调用session里面的get方法
User user = session.get(User.class, 3);
session.delete(user);
方法二:
User user = new User();
user.setUid(3);
session.delete(user);
实体类对象状态
- 瞬时态:对象里面没有id值,对象与
session
没有关联 - 持久态:对象里有id值,对象与
session
关联 - 托管态:对象里有id值,但是与
session
无关
hibernate缓存
- 什么是缓存?
数据存到数据库中,数据库本身是文件系统,使用流的方式操作文件,效率并不是很高,所以把数据存到内存
中,不需要使用流的方式,可以直接从内存中读取数据 ,提升读取效率。 hibernate
框架提供很多优化的方法,hibernate
缓存就是一种优化方法。
一级缓存
hibernate
一级缓存默认是打开的hibernate
一级缓存使用范围就是session
的范围,从session
创建到关闭。hibernate
一级缓存中,存储的数据必须是持久态
的数据
验证一级缓存存在
- 验证方式:
- 首先根据id查询对象,返回对象
- 再次根据id查询,用
debug
运行,看到控制台不会出现重新sql语句 ,证明他去查缓存了。
- 一级缓存执行流程:
- 一级缓存执行特性:
- 持久态自动更新数据库,快照区不相同就更新,相同不更新
二级缓存
- 目前已经不使用了,现在有替代技术:
redis
- 二级缓存不是默认打开的需要配置
- 二级缓存使用范围,是
sessionFactory
的范围。
事务代码规范写法
1.代码结构:
try{
开启事务
提交事务
}catch{
回滚事务
}finally{
关闭事务
}
事务的规范写法
@Test
public void testTx() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtils.getSesionFactory();
session = sessionFactory.openSession();
// 开启事务
tx = session.beginTransaction();
//添加
User user = new User();
user.setUsername("天才");
user.setPassword("1111");
user.setAddress("sahnghai ");
session.save(user);
// 提交事务
tx.commit();
} catch (Exception e) {
// 回滚事务
tx.rollback();
} finally {
//关闭
session.close();
sessionFactory.close();
}
}
Hibernate绑定session
session
类似于JDBC
的connection
,之前web时候学过的threadLocal
- 帮助实现与本地线程绑定
session
,我们只需要配置即可,不用去关心如何实现的。 - 获取与本地线程
session
- 在hibernate核心配置文件中配置
<!-- 配置session绑定本地线程 -->
<property name="hibernate.current_session_context_class">thread</property>
- 在工具类中提供返回与本地线程帮的session的方法
public static Session getSessionobject() {
return sessionFactory.getCurrentSession();
}
3.注意不要关闭sessionFactory
,关闭之后会报错。
hibernate的其他API
Query
- 使用query对象,不需要写sql语句,但是写hql语句
- hql:
hibernate query language
,hibernate
提供的查询语言,这个hql语句和普通sql语句很相似 - hql和sql语句区别:
使用sql操作表和表字段
使用hql操作实体类和属性
-
hql语句 查询所有:
(1)from 实体类名称 -
Query对象使用
(1)创建Query对象
(2)调用query对象里面的方法得到结果
Criteria
-
使用这个对象查询操作,但是使用这个对象时候,不需要写语句,直接调用方法实现
-
实现过程:
- 创建
criteria
对象 - 调用对象里面的方法得到结果
SQLQuery
-
使用hibernate时候,调用底层sql实现
-
实现过程:
- 创建对象
- 调用对象的方法得到结果
实现方法一:返回list集合每部分是数组
实现方法二:返回list中每部分是对象形式
转载:https://blog.csdn.net/weixin_44861399/article/details/105883900
查看评论