实体类编写规则

  1. 实体类的属性都是私有的
  2. 私有属性都有公开的get,set方法来操作
  3. 要求实体类有属性作为唯一值(一般使用id值)
  4. 实体类属性建议不使用基本数据类型,使用基本数据类型对应的包装类
  • 八个基本数据类型对应的包装类
    int—>Integer,char—>Character,其他都是首字母大写,例如double—>Double
  • 为什么要用包装类?
    因为包装类相当于操作一个对象,它可以为null值,但是基本数据类型就不可以。数据库中有字段为null的情况。

hibernate主键生成策略

  • hibernate要求实体类中有一个属性作为唯一值,对应表主键,主键也有不同的生成策略。主键可以是自增长,也可以是UUID生成,hibernate中也提供了很多种主键生成策略。
<generator class="native"></generator>
  • class属性中有很多值:
  1. native: 根据使用的数据库帮选择哪个值
  2. uuid: 之前web阶段写代码生成uuid值,hibernate帮我们生成uuid
  • 如何使用uuid
  1. 修改实体类中uid的类型为string,修改get(),set()方法的类型。
  2. 在配置文件中,换成uuid
<generator class="uuid"></generator>
  1. 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);
  • 修改操作
  1. 先根据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);

实体类对象状态

  1. 瞬时态:对象里面没有id值,对象与session没有关联
  2. 持久态:对象里有id值,对象与session关联
  3. 托管态:对象里有id值,但是与session无关

hibernate缓存

  • 什么是缓存?
    数据存到数据库中,数据库本身是文件系统,使用流的方式操作文件,效率并不是很高,所以把数据存到内存中,不需要使用流的方式,可以直接从内存中读取数据 ,提升读取效率。
  • hibernate框架提供很多优化的方法,hibernate缓存就是一种优化方法。

一级缓存

  1. hibernate一级缓存默认是打开的
  2. hibernate一级缓存使用范围就是session的范围,从session创建到关闭。
  3. hibernate一级缓存中,存储的数据必须是持久态的数据

验证一级缓存存在

  • 验证方式:
  1. 首先根据id查询对象,返回对象
  2. 再次根据id查询,用debug运行,看到控制台不会出现重新sql语句 ,证明他去查缓存了。
  • 一级缓存执行流程:
    在这里插入图片描述
  • 一级缓存执行特性:
  1. 持久态自动更新数据库,快照区不相同就更新,相同不更新
    在这里插入图片描述

二级缓存

  1. 目前已经不使用了,现在有替代技术:redis
  2. 二级缓存不是默认打开的需要配置
  3. 二级缓存使用范围,是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类似于JDBCconnection,之前web时候学过的threadLocal
  • 帮助实现与本地线程绑定session,我们只需要配置即可,不用去关心如何实现的。
  • 获取与本地线程session
  1. 在hibernate核心配置文件中配置
<!-- 配置session绑定本地线程 -->
<property name="hibernate.current_session_context_class">thread</property>		
  1. 在工具类中提供返回与本地线程帮的session的方法
public static Session getSessionobject() {
		return sessionFactory.getCurrentSession();
	}

3.注意不要关闭sessionFactory,关闭之后会报错。

hibernate的其他API

Query

  • 使用query对象,不需要写sql语句,但是写hql语句
  1. hql:hibernate query languagehibernate提供的查询语言,这个hql语句和普通sql语句很相似
  2. hql和sql语句区别:
    使用sql操作表和表字段
    使用hql操作实体类和属性
  • hql语句 查询所有:
    (1)from 实体类名称

  • Query对象使用
    (1)创建Query对象
    (2)调用query对象里面的方法得到结果

在这里插入图片描述

Criteria

  1. 使用这个对象查询操作,但是使用这个对象时候,不需要写语句,直接调用方法实现

  2. 实现过程:

  • 创建criteria对象
  • 调用对象里面的方法得到结果

在这里插入图片描述

SQLQuery

  1. 使用hibernate时候,调用底层sql实现

  2. 实现过程:

  • 创建对象
  • 调用对象的方法得到结果

实现方法一:返回list集合每部分是数组
在这里插入图片描述
在这里插入图片描述

实现方法二:返回list中每部分是对象形式

在这里插入图片描述

在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐