Hibernate学习笔记(二)


我是从b站视频上学习的hibernate框架,其中有很多和当前版本不符合之处,我在笔记中进行了修改
以下是b站视频地址:
https://www.bilibili.com/video/av14626440

  *实现添加操作 第一步 加载hibernate核心配置文件 第二步 创建SessionFactory对象     第三步 使用SessionFactory创建session对象 第四步 开启事务 第五步 写具体逻辑 crud操作 第六步 提交事务 第七步 关闭资源 @Test     public void testAdd() { //     第一步 加载hibernate核心配置文件        // 到src下面找到名称是hibernate.cfg.xml        //在hibernate里面封装对象        Configuration cfg = new Configuration();        cfg.configure(); //     第二步 创建SessionFactory对象        //读取hibernate核心配置文件内容,创建sessionFactory        //在过程中,根据映射关系,在配置数据库里面把表创建        SessionFactory sessionFactory = cfg.buildSessionFactory(); //     第三步 使用SessionFactory创建session对象        // 类似于连接        Session session = sessionFactory.openSession();        //     第四步 开启事务        Transaction tx = session.beginTransaction(); //     第五步 写具体逻辑 crud操作        //添加功能        User user = new User();        user.setUsername("小王");        user.setPassword("250");        user.setAddress("日本");        //调用session的方法实现添加        session.save(user); //     第六步 提交事务         tx.commit(); //     第七步 关闭资源        session.close();//本地线程绑定的session也不需要关闭        //sessionFactory.close(); /*sessionFactory如果是静态加载的则不需要关闭*/     }   *创建的SessionFactory工具类 public class HibernateUtil {     static SessionFactory sessionFactory =  null;     static Configuration cfg = null;     //静态代码块,静态代码块会在代码执行时首先运行     static {        //加载核心配置文件        cfg = new Configuration();        cfg.configure();        //创建SessionFactory        sessionFactory =  cfg.buildSessionFactory();     }          public static SessionFactory  getSessionFactory() {        return sessionFactory;     } }   *Session对象 1)session对象是单线程对象,只能自己使用,不能共用   *事务的提交和回滚   tx.commit();//提交 tx.rollback();//回滚     *hibernate主键生成策略 还有其他类型,但是通常不使用   *hibernate查询get()操作 User user = session.get(User.class,1);   *hibernate修改操作 /*先查询再修改*/ User user = session.get(User.class,1); user.setUsername("东方不败"); session.update(user);   *hibernate删除操作 /*先查询再删除*/ User user =session.get(User.class, 1); session.delete(user);   *实体类对象状态(概念) 1)瞬时态:对象里面没有id值,和session对象没有关联 2)持久态:对象里面有id值,和session对象也有关联 3)托管态:对象有id值,但是和session对象没有关联     *hibernate其他操作实体类对象的方法 1)saveOrUpdate() 如果实体类对象状态是瞬时态,进行添加操作 实体类对象是托管态时,进行修改操作 实体类对象是持久态时,进行修改操作     *hibernate的一级缓存

.什么是缓存

1 数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。 (1)把数据存到内存里面,不需要使用流方式,可以直接读取内存中数据 (2)把数据放到内存中,提供读取效率 .hibernate缓存 1 hibernate框架中提供很多优化方式,hibernate的缓存就是一个优化方式 2 hibernate缓存特点: 第一类 hibernate的一级缓存 (1)hibernate的一级缓存默认打开的 (2)hibernate的一级缓存使用范围,是session范围,从session创建到session关闭范围 (3)hibernate的一级缓存中,存储数据必须 持久态数据 第二类 hibernate的二级缓存 (1)目前已经不使用了,替代技术 redis (2)二级缓存默认不是打开的,需要配置 (3)二级缓存使用范围,是sessionFactory范围   *hibernate一级缓存特性 1)持久态自动更新数据库 2)执行过程   *hibernate事务规范代码写法 try{     开启事务     提交事务 }catch(){     回滚事务 }finally{     关闭 }   *hibernate绑定Session .获取与本地线程绑定的Session 1)在hibernate核心配置文件中配置 thread 2)在工具类中提供返回session的方法 一般也写在工具类中 sessionFactory.getCurrentSession(); .获取与本地线程绑定的session时,关闭时报错 SessionException:Session was already closed   所以与本地线程绑定的 session不需要手动关闭   *hibernate中的一些API的使用 .Query对象 注意:5.3版本中org.hibernate.Query对象已过时,这里导入的是org.hibernate.query.Query包     1.使用Query对象,不需要写sql语句,但是写hql语句         1)hql:hibernate query language   /*hibernate提供的查询语句*/         2)hql和sql的区别             sql操作的是表和字段             hql操作的实体类对象和对象的属性     2.查询所有的hql语句         1)from 实体类对象     3.Query对象使用         1)创建Query对象         2)调用Query对象里面的方法得到结果 .Critica对象      1.使用这个对象就不需要写hql语句,直接调用对象的方法就能进行查询操作             2.实现过程                 1)创建Critica对象                 2)调用Critica对象里面的方法得到结果        .SQLQuery对象     1.调用底层SQL实现     2.实现过程          1)创建SQLQuery对象          2)调用SQLQuery对象里面的方法得到结果          3)  SQLQuery返回的是数组          4)设置返回的是对象形式 sqlQuery.addEntity(User.class);      .CriticaQuery 在hibernate5.2版本之后,为了符合jpa规范,上述Critica已过时,推荐使用符合规范的CriticaQuery对象