Hibernate查询方式(criteria和sql)和事务的简单了解

criteria

这种语法连Hql语句都不用写,查询的时候全部调用他封装好的方法

这是一些 经常用到

and并且
or()或者
equal()等于
notEqual 不等于
like()模糊查询
isnull()为空
in():等于列表中的某一个值(特别注意,使用特别)
gt(): 大于
ge(): 大于等于
lt(): 小于
le(): 小于等于
between()两者之间

count():统计数量

案例:

1.基本查询

public void fun(){
       Session session = HibernateUtil.getOpenSession();
       Transaction transaction = session.beginTransaction();

       CriteriaBuilder criteriaBuilder =   session.getCriteriaBuilder();
       CriteriaQuery<Student> query = criteriaBuilder.createQuery(Student.class);
       Root<Student> root = query.from(Student.class);
      //select * from Student

       //query.select(root);

       List<Student> list = session.createQuery(query).list();

       System.out.println(list);
       transaction.commit();
       session.close();
   }

2.条件查询

 public void  fun1(){
        Session session = HibernateUtil.getOpenSession();
        Transaction transaction = session.beginTransaction();
      //1.获得Criteria工厂  封装方法,可以获得CriteriaQuery对象
        CriteriaBuilder cb = session.getCriteriaBuilder();
       //2.获得criteria对象 这个对象使用来存储查询条件的
        CriteriaQuery<Student> query = cb.createQuery(Student.class);
      //3.指定从哪个表查询 适用于哪个表 root对象 存储的是数据库表的信息
        Root<Student> root = query.from(Student.class);
        //4.增加条件
        Predicate con1 = cb.equal(root.get("name"), "傻强");



        //5.把条件放到 query 对象里面
        query.where(con1);
       //6.把这个query 对象传给 session 调用他的list方法
        List<Student> list = session.createQuery(query).list();
        System.out.println(list)
        ;
        transaction.commit();
        session.close();
    }

Sql查询

 public void fun(){
        Session session = HibernateUtil.getOpenSession();
        Transaction transaction = session.beginTransaction();
        String sql = "SELECT * FROM student WHERE name =?";
        NativeQuery nativeQuery = session.createNativeQuery(sql,Student.class);

        nativeQuery.setParameter(1,"傻强");

        List<Student> list = nativeQuery.list();
        System.out.println(list);


        transaction.commit();
        session.close();


    }

事务的了解

案列  :

张三(1000)给李四(1000) 转钱。

张三向李四转钱(100)

张三的钱数-100  900

李四的钱数 +100   1100

在转钱过程中  张三的前减少 恰巧这个时候停电了 程序出现了异常,导致张三的钱减少 但是李四没有增多 ,这样的问题就叫做事务安全问题。

一致性:张三和李四的钱数总和保持不变

原子性:张三的钱减少和李四的钱增多要同时进行。

持久性:最终这些数据的改变要保存在数据库中

事务线程

1.  脏读数据

张三 从 李四 买东西

事务1 张三给李四转账, 转账成功了

事务2 李四查看账户,钱多了 他就发货了 提交了事务

事务1 回滚

2.  不可重复读

酒店前台 2个前台  A和B

来了一个客人  这个客人 想住 1101 号房间  前天A可以住

来了另一个客人  这个客人 找的是 前台B   B把1101 号房间开了 给这个客人

3.  幻读(虚读)

对一个定单表查询两次,另外 一个事务 已经添加了新的记录 之前查的是100条现在发现是101次

为了解决 上述问题:提出了一个隔离性:

(1)串行化

想要完全解决问题 一个办法 串行化(死锁)不推荐使用 效率太低

(2)可重复读(MySql数据库默认的隔离级别)

可以防止脏读和不可重复读。不能防止幻读

(1)  读已提交数据(Oracle默认的隔离级别)

可以防止脏读数据,不可以防止不可重复读和幻读

(2)  读未提交数据

所有问题都不解决,这是情况是所有隔离性中 性能最好的



猜你喜欢

转载自blog.csdn.net/leizhenjiang/article/details/80764834
今日推荐