zoukankan      html  css  js  c++  java
  • Hibernate_day02--Hibernate事务操作_api使用

    Hibernate事务操作

    事务相关概念

    1 什么是事务

    事务是操作中最基本的单元,表示一组操作要么都成功,有一个失败那么所有都失败。最典型的场景:银行转账

    2 事务特性

    原子性 一致性 隔离性 持久性

    3 不考虑隔离性产生问题

    (1)脏读

    (2)不可重复读

    (3)虚读

    4 设置事务隔离级别

    (1)mysql默认隔离级别 repeatable read

    Hibernate事务代码规范写法

    1 代码结构

    try {

       开启事务

       提交事务

    }catch() {

       回滚事务

    }finally {

       关闭

    }

        /**
         * 事务规范代码
         */
        @Test
        public void testTx() {
            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("666");
                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核心配置文件中配置

    (2)调用sessionFactory里面的方法得到

    sessionFactory不用自己关闭了

    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对象里面的方法得到结果

    public class HibernateQueryData {
        //使用query对象
        @Test
        public void testQuery() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try{
                sessionFactory = HibernateUtils.getSessionFactory();
                //与本地线程绑定的session
                session = HibernateUtils.getSessiononObject();
                //开启事务
                tx = session.beginTransaction();    
                //1.创建Query对象
                //方法里面写hql语句
                Query query = session.createQuery("from User");
                //2.调用query对象里面的方法得到结果
                List<User> list = query.list();
                for(User user : list) {
                    System.out.println(user);
                }
                //提交事务
                tx.commit();
            }catch(Exception e) {
                e.printStackTrace();
                //回滚事务
                tx.rollback();
            }finally {
                //关闭操作
                session.close();
                sessionFactory.close();
            }
        }
    }

    Criteria对象

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

    2 实现过程

    (1)创建criteria对象

    (2)调用对象里面的方法得到结果

    //使用Criteria对象
        @Test
        public void testCriteria() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try{
                sessionFactory = HibernateUtils.getSessionFactory();
                //与本地线程绑定的session
                session = HibernateUtils.getSessiononObject();
                //开启事务
                tx = session.beginTransaction();
                //1.创建Criteria对象
                //方法里面参数是实体类class
                Criteria criteria= session.createCriteria(User.class);
                //2.调用方法得到结果
                List<User> list = criteria.list();
                for (User user : list) {
                    System.out.println(user);
                }
                //提交事务
                tx.commit();
            }catch(Exception e) {
                e.printStackTrace();
                //回滚事务
                tx.rollback();
            }finally {
                //关闭操作
                session.close();
                sessionFactory.close();
            }
        }


    SQLQuery对象

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

    2 实现过程

    (1)创建对象

    (2)调用对象的方法得到结果

    //使用SQLQuery对象
        @Test
        public void testSQLQuery() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try{
                sessionFactory = HibernateUtils.getSessionFactory();
                //与本地线程绑定的session
                session = HibernateUtils.getSessiononObject();
                //开启事务
                tx = session.beginTransaction();    
                //1.创建SQLQuery对象
                //参数是普通sql语句
                SQLQuery sqlQuery = session.createSQLQuery("select * from t_user");
                //调用sqlQuery里面的方法
                //返回list集合,默认里面每部分数组结构
                List<Object[]> list = sqlQuery.list();
                for (Object[] objects : list) {
                    //把数组作为字符串输出
                    System.out.println(Arrays.toString(objects));
                }
                //提交事务
                tx.commit();
            }catch(Exception e) {
                e.printStackTrace();
                //回滚事务
                tx.rollback();
            }finally {
                //关闭操作
                session.close();
                sessionFactory.close();
            }
        }

    返回list集合每部分是数组

     

    返回list中每部分是对象形式

  • 相关阅读:
    [Swift通天遁地]四、网络和线程-(4)使用Alamofire实现网络请求
    [Swift通天遁地]四、网络和线程-(3)线程组:使用DispatchGroup(调度组)对线程进行分组管理
    [Swift通天遁地]四、网络和线程-(2)通过BlockOperation实现线程的队列
    [Swift]LeetCode253.会议室 II $ Meeting Rooms II
    [Swift通天遁地]四、网络和线程-(1)线程的锁和解锁
    [Swift]LeetCode252.会议室 $ Meeting Rooms
    [Swift]LeetCode251.展平二维向量 $ Flatten 2D Vector
    [Swift]LeetCode250.计数相同值子树的个数 $ Count Univalue Subtrees
    [Swift]LeetCode249.群组偏移字符串 $ Group Shifted Strings
    [Swift]LeetCode248.对称数 III $ Strobogrammatic Number III
  • 原文地址:https://www.cnblogs.com/justdoitba/p/7856687.html
Copyright © 2011-2022 走看看