Hibernate学习笔记(二)

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

 
*实现添加操作
第一步 加载hibernate核心配置文件
第二步 创建SessionFactory对象
 
<!--
    因为SessionFactory创建时会去检测数据库来进行创建表或更新,所以非常耗费资源,所以一般创建工具类来创建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);
//     第六步 提交事务
//     第七步 关闭资源
       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核心配置文件中配置
<property name="name.current_session_context_class" >thread</property>
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对象
 
 
 
 
 
 
posted @ 2019-03-19 16:19  snolin  阅读(182)  评论(0编辑  收藏  举报