再次认识Hibernate(三)

Hibernate的检索方式

导航对象图检索方式  

   根据已经加载的对象导航到其他对象

    Customer customer =(Customer) session.get(Custmoer.class,1);

    customer.getOrders();

OID检索方式

    根据对象的OID来检索对象

    get/load 方法进行检索

HQL检索方式  面向对象的查询  支持方法链编程   适用于简单查询

    查询所有记录

    Query query= session.createQuery("HQL");

    List<Customer>list =session.createQuery("from Customer").list(); 

    for(Customer customer: list){
     System.out.println(customer);

    }

    查询使用别名

    List<Customer> list=session.createQuery("from Customer c").list();

   使用带参数的别名

   List<Customer> list=session.createQuery("from Customer as c where c.name=?").setString(0,"demo").list();

   不支持select * from Customer写法   

   List<Customer> list=session.createQuery("select c from Customer  c").list();  相当于select *

   排序

   List<Customer> list=session.createQuery("from Customer c order by c.id desc").list();

   分页查询

   Query query =session.createQuery("from Order");

   query.setFirstResult(20);

   query.setMaxResult(10);

   List<Order> list =query.list();

   for(Order order :list){

      System.out.println(order);

   }

  单个对象查询

   Customer customer =(Customer) session.createQuery("from Customer where cname="?").setString("0","demo").uniqueResult();

  参数绑定

   使用?号方式进行绑定

   Query query =session.createQuery("from Customer where cname=?");

   query.setString(0,"demo"); 

   list<Customer> list=query.list();

   使用名称方式进行绑定

   Query query =session.createQuery("from Customer where cname=:name  and cid=:id ");

   query.setString("name","demo");

   query.setInteger("id",3);

   list<Customer> list =query.list();

   绑定实体

   list<Order> list =session.createQuery("from Order o where o.customer=?").setEntity(0,customer).list();

  投影操作

  使用构造 来投影

  List<Customer> list =session.createQuery("select new Customer(cname) from Customer").list();

 模糊查询

   Query query =session.createQuery("from Customer where cname like ?");

   query.setParameter(0,"xxx");

   list<Customer> list =query.list();

  SQL多表查询

    交叉连接  select *from A,B  笛卡尔乘积 不常用

    内连接  查询的是两个表的交集  将数据封装在list<Object>中   select * from A inner join B on A.属性=B.属性   两表匹配的行

     隐式内连接   select * from A,B where A.属性=B.属性

     迫切内连接  将数据封装在List<Customer>实体类中  需要distinct排重

   左外连接    select * from  A left outer join B on A.字段 =B.字段

   右外连接    select * from A right outer join B on A.字段 =B字段

   迫切左外连接/迫切右外连接

QBC检索方式    适用于复杂查询

    使用QBC(Query By Criteria)来检索对象

    查询List<Customer> list =session.createCriteria(Customer.class).list();

    排序 List<Customer> list=session.createCriteria(Customer.class).addOrder().list();

             <Object> list =session.createQuery("select c.name  from Customer c" ).list();  

   分页  

    Criteria criteria =session.createCriteria(Order.class);

      criteria.setFirstResult(10);

     criteria.setMaxResults(10);

     List<Order> list =criteria.list();

    获取单个对象

 Customer customer = (Customer) session.createCriteria(Customer.class).add(Restrictions.eq("cname", "小明")).uniqueResult();
 System.out.println(customer);

本地SQL检索方式

    SQLQuery query= session.createSQLQuery("SQL");

     List<Object[]> list = session.createSQLQuery("select * from customer").list();
      for (Object[] objects : list) {
       System.out.println(Arrays.toString(objects));
      }

Hibernate的抓取策略

 立即检索  执行某行代码时,马上发出SQL语句进行查询  get()

 延迟检索  执行某行代码时,不会马上发出SQL语句进行查询,当真正使用该对象时才会进行查询  load()

 类级别检索  <class>标签上配置lazy

 关联级别的检索 <set>/ <many-to-one>上配置lazy

 从一的一方 关联 多的一方

     fetch 控制sql语句的类型

        join   会忽略lazy

        select  发送多条sql查询关联对象    默认值

        subselect   发送子查询关联对象

     lazy 控制关联对象的检索是否采用延迟

         true   查询关联对象的时候采用延迟检索  默认值

         false  查询关联对象的时候不使用延迟检索

         extra  极其懒惰的

 从多的一方  关联 一的一方

         fetch  控制sql语句的发送格式

             join  发送迫切左外连接 查询关联对象 

             select 发送多条sql检索关联对象

         lazy  关联对象检索  是否使用延迟

             false  不延迟

             proxy  使用代理

             no-proxy  不使用代理

事务

     事务是逻辑上的一组操作  要么全部成功 要么全部失败

     事务的四大特性   

     原子性  一组事务操作不可分割

     一致性  事务执行前后   数据的完整性保持一致

     隔离性  一个事务在执行过程中不应该收到其他事务的干扰

     持久性   一旦事务执行结束  数据持久保存在数据库中

数据库常见读问题

     脏读:一个事务读到另一个事务未提交数据中

     不可重复读:一个事务读到另一个事务已经提交的数据(update)中 导致查询结果不一致

     虚读:一个事务读到另一个事务已经提交的数据(insert)中 导致查询结果不一致

数据库常见写问题

     丢失更新   解决方案  悲观锁 乐观锁

 事务的隔离级别

     1  未提交读  三种读问题都有可能发生

     2  已提交读  避免脏读  不可重复读和虚读有可能发生

     3  重复读    避免脏读和不可重复读   虚读有可能发生

     4 串行的 序列化   对并发影响最大 能保证数据的完整性和一致性 

线程中绑定session   

            SessionFactory.getCurrentSession()方法   线程结束 则session自动关闭

hibernate中设置事务的隔离级别

    核心配置文件中

   <property name=“hibernate.connection.isolation”>4</property>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值