hibernate_day02

实体类编写规则

(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);
            }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值