Stage3-day15-hibernate

延迟策略

  1. 懒加载:需要时,才查询,不需要,不查询,不发送SQL
  2. hibernate中实现延迟:load方法能实现延迟思想;集合标签中含有lazy属性可以实现延迟思想
  3. 延迟策略的实现--load()方法,不查询就不会调用

  4. 对象导航图也能实现延迟加载. 

    set集合标签中设置lazy属性:true,false,extra---极其懒

    true值表示懒加载、false表示立即加载

    get,load和lazy之间的关系:get方法是立即加载即当我们调用get方法获得对象的时候就会执行查询语句,不论是否使用它(比如执行输出语句),当lazy默认(true)时,即开启延迟加载,get()方法是立即执行,会执行查询的那条SQL,不会执行对象导航图中的SQL语句,当lazy设为false时,关闭延迟加载执行get方法,即使没有输出语句,他也会执行两条SQL语句. load是延迟加载,当没有输出语句等调用时候,是不会执行SQL语句的,不论lazy是开启或是关闭,因为第一个SQL都没执行,后面的SQL也不会执行.

    什么是导航图查询方式:就是通过SQL语句查询出来的对象调用它里面的get方法,查询另一个对象,执行了另一个SQL语句.

查询策略

hibernate中查询方式包括五种:OID,对象导航图,HQL,QBC,SQL

OID(Object Identifier)

主键查询 get/load方法

session的get和load方法调用实现oid查询方式,即按照主键值查询;其中get是立即查询,load是延迟查询

对象导航图查询

连接查询,就是从一个对象查其他对象,在hibernate中通过属性和映射配置,实现一对一、一对多、多对多的时候,如果用到集合标签,那么集合标签中lazy属性可以实现连接查询时候的延迟操作

HQL---Hibernate Query Language

和SQL十分类似;由SQL调整为HQL:SQL中字段名在hql中是属性名,SQL中表名在hql中是类名,hql中select部分可以省略,*号不能使用

  1. 初识. 首先要获取查询对象,然后根据返回值类型,由query对象调用查询方法,获得查询结果,uniqueResult()---返回结果只有一个对象
  2. HQL中占位符的使用,注意在5.3.x版本之后占位符的使用,?号需要添加序号,对应在使用的时候,利用查询对象query调用setParameter方法实现查询参数值的注入
  3. 占位符---使用查询变量替代

  4. 查询结果有多条如何实现---list()方法

  5. 分页实现setFirstResult()是用来设置当前页第一条的下标,丛0开始第一页第一条是0,setMaxResults()是用来设置每页最多显示多少条的参考https://blog.csdn.net/switzerland/article/details/3127992

    public void test5(){
            /*
             * mysql分页的时候limit m,n   n---每页条数    m---起始
             * 当前页码是cp   每页条数pages = 4   start = pages * (cp - 1)
             *
             * oracle分页:
             * select empno,ename,job,hiredate,mgr,sal,comm,deptno
             * from (select rownum rn,emp.* from emp) te
             * where te.rn between m and n;
             *
             * 当前页码是cp  每页条数pages = 4
             * cp == 1   m == 1  n == 4;
             * cp == 2   m == 5  n == 8
             * cp == 3   m == 9
             * n ==== pages * cp
             * m ==== (cp - 1)*pages + 1       pages * cp - 3
             *
             * */
            Session session = test2.getSession();
            //select * from Users
            String hql = "from Users";
            Query query = session.createQuery(hql);
            //firstResult是当前页首行
            query.setFirstResult(0);
            //每页最多显示多少条
            query.setMaxResults(2);
            List<Users> list = query.list();
            for (Users u : list) {
                System.out.println(u);
            }
        }
    

     

  6. 在hql中,select省略表示查询所有字段,当我们查询部分字段时,select不能省略.没有省略select部分时,那么查询结果是数组(一维数组或者二维数组)

  7. 联合查询,和查询多个字段差不多

QBC

qbc和我们mybatis逆向工程差不多,使用的是criteria对象,用criteria.add()Restrictions.eq("uname","刘备"))来添加条件,restrictions可以叠加

SQL

注解实现

  1. 在hibernate核心配置文件中,映射文件导入用class替代resource
  2. 映射文件不需要了,我们在实体类上添加注解@Entity(要导的包是javax.persistence),导入实体类即可,同时也要加上@table(name="")注解,表示指定表名,否则表名就是类名
  3. 当主键是uuid时设置主键类型为String,uuid需要先生成在赋值给id,所以需要两个注解
  4. 当主键是其他类型时,要定义成Integer类型的,,注解设置成auto,就相当于我们配置文件中的native(自适应)
    package com.offcn;
    
    import org.hibernate.annotations.GenericGenerator;
    
    import javax.persistence.*;
    import java.io.Serializable;
    import java.sql.Clob;
    
    @Entity//注解模式实体类必须要加此注解,告知框架此类参与映射配置
    @Table(name = "table_users")//此注解用来实现实体类对应的表格的名称定义
    public class Users implements Serializable{
        private static final long serialVersionUID = -65208953343133567L;
        @Id//主键注解
        @Column(name = "u_id")//用来定义字段名称,不加此注解的话就是默认值,即属性名
        @GeneratedValue(strategy = GenerationType.AUTO)
        private String uid;
        @Column(name = "u_name")//省略不写的话数据库中的字段名就是uname,和属性名一样
        private String uname;
        private String upassword;
        private Clob udesc;
    
        public Integer getUid() {
            return uid;
        }
    
        public void setUid(Integer uid) {
            this.uid = uid;
        }
    
        public String getUname() {
            return uname;
        }
    
        public void setUname(String uname) {
            this.uname = uname;
        }
    
        public String getUpassword() {
            return upassword;
        }
    
        public void setUpassword(String upassword) {
            this.upassword = upassword;
        }
    
        public Clob getUdesc() {
            return udesc;
        }
    
        public void setUdesc(Clob udesc) {
            this.udesc = udesc;
        }
    }
    

     

猜你喜欢

转载自blog.csdn.net/qq_42837554/article/details/90489222