• hibernate框架学习第六天:QBC、分页查询、投影、数据加载策略、二级缓存


    QBC查询
    1.简单查询
    Criteria c = s.createCriteria(TeacherModel.class);
    2.获取查询结果
    多条:list
    单挑:uniqueResult
    3.分页查询
    setFirstResult(int)
    setMaxResults(int)
    4.查询排序
    添加排序
    c.addOrder(Order);
    排序规则
    Order od = Order.asc("字段名")
    Order od = Order.desc("字段名")
    5.条件查询
    1.添加查询条件
    c.add(条件)
    2.条件格式
    Restrictions.操作名称(参数....);
    3.组合条件
    Restrictions.and(条件1,条件2);
    Restrictions.or(条件1,条件2);
    Restrictions.not(条件)
    6.投影
    单独字段
    c.setProjection(Property.forName("age"));
    多字段
    c.setProjection(
    Projections.projectionList()
    .add(Property.forName("studentName"))
    .add(Property.forName("age"))
    );
    QBC多表查询
    1.如果要建立多表查询,首先要告诉QBC是多表
    c.createAlias("关联对象","别名");
    所有属性,如果是关联对象的属性,统一使用别名调用
    //认为: teacher.nick
    //实际:别名.nick
    2.离线查询
    表现层过来的数据,是散的
    在表现成中,创建一个DetachedCriteria,然后将所有条件在这里赋值完毕,将它传递到逻辑层
    传递到逻辑层
    将DetachedCriteria传递到数据层
    逻辑层传递数据层
    将DetachedCriteria转化为Criteria,使用
    -------------------------------
    数据加载策略/数据抓取策略
    查询方式
    load OID
    get OID
    Query(Query Criteria) SQL
    数据分类
    主数据
    查询TeacherModel->StudentModel
    主数据 主关联数据
    假设关系:一对多
    由一获得多
    一:是主数据
    多:是主关联数据
    由多获得一
    多:是从数据
    一:是从关联数据

    TeacherModel 1 n StudentModel
    查询TeacherModel,主
    查询TeacherModel,找StudentModel 主关联
    查询StudentModel,从
    查询StudentModel,找StudentModel 从关联

    数据获取方式
    load OID
    get OID
    Query OID
    Query 非OID

    直接数据加载策略

    关联数据加载策略
    主关联数据加载策略
    老师对学生一对多,这里研究的是老师对象中的学生集合的数据加载策略
    1.fetch = "select" lazy = "false"
    SQL语句:
    主数据:1条SQL
    主关链数据:多条SQL
    查询主关联数据数据总量
    不执行SQL语句
    查询主关联数据具体数据
    不执行SQL语句
    2.fetch = "select" lazy = "true"
    SQL语句:
    主数据:1条SQL
    查询主关联数据数据总量
    执行主关联数据对应的具体信息查询SQL(按需产生SQL语句A)
    查询主关联数据具体数据
    执行主关联数据对应的具体信息查询SQL(按需产生SQL语句A)
    3.fetch = "select" lazy = "extra"
    SQL语句:
    主数据:1条SQL
    查询主关联数据数据总量
    执行主关联数据集合数据总量查询SQL(按需产生SQL语句A)
    查询主关联数据具体数据
    执行主关联数据对应的具体信息查询SQL (按需产生SQL语句B)
    注意:
    先执行A操作,再执行B操作,AB操作均产生SQL语句
    先执行B操作,再执行A操作,BA操作只产生B操作SQL语句

    4.fetch = "subselect" lazy = "false"
    SQL语句:
    主数据:1条SQL
    主关链数据:1条SQL(子查询)
    查询主关联数据数据总量
    不执行SQL语句
    查询主关联数据具体数据
    不执行SQL语句
    5.fetch = "subselect" lazy = "true"
    SQL语句:
    主数据:1条SQL
    查询主关联数据数据总量
    执行主关联数据对应的具体信息查询SQL(一条子查询SQL语句A)
    查询主关联数据具体数据
    执行主关联数据对应的具体信息查询SQL(一条子查询SQL语句A)
    6.fetch = "subselect" lazy = "extra"
    SQL语句:
    主数据:1条SQL
    查询主关联数据数据总量
    执行主关联数据集合数据总量查询SQL(按需产生SQL语句A)
    查询主关联数据具体数据
    执行主关联数据对应的具体信息查询SQL (一条子查询SQL语句B)
    注意:
    先执行A操作,再执行B操作,AB操作均产生SQL语句
    先执行B操作,再执行A操作,BA操作只产生B操作SQL语句
    使用Query查询,携带OID作为查询条件或使用load/get查询,查询SQL生成等同于fetch=select (subselect=select)
    7.fetch = "join" lazy = "false"
    SQL语句:
    主数据:1条SQL
    主关链数据:多条SQL
    查询主关联数据数据总量
    不执行SQL语句
    查询主关联数据具体数据
    不执行SQL语句
    8.fetch = "join" lazy = "true"
    SQL语句:
    主数据:1条SQL
    查询主关联数据数据总量
    执行主关联数据对应的具体信息查询SQL (按需产生SQL语句A)
    查询主关联数据具体数据
    执行主关联数据对应的具体信息查询SQL (按需产生SQL语句A)
    9.fetch = "join" lazy = "extra"
    SQL语句:
    主数据:1条SQL
    查询主关联数据数据总量
    执行主关联数据集合数据总量查询SQL (按需产生SQL语句A)
    查询主关联数据具体数据
    执行主关联数据对应的具体信息查询SQL (按需产生SQL语句B)
    9-2.fetch = "join" lazy = "extra" 查询使用OID进行
    SQL语句:
    主数据:1条SQL(左外连接SQL,主和关联数据全部查询出来)
    查询主关联数据数据总量
    不会产生SQL语句
    查询主关联数据具体数据
    不会产生SQL语句

    fetch:用于控制进行关联查询时,产生的SQL语句
    select:一般SQL
    subselect:子查询SQL语句
    join:Query join=select 一般SQL
    OID 左外连接SQL
    lazy:用于控制进行关联查询时,被关联数据的加载策略
    false:非延迟加载,初期就将数据查询出来
    true:延迟加载,需要使用执行SQL
    extra:超级延迟加载,如果获取长度,执行SQL与获取数据执行SQL不同

    总结:
    lazy控制的是关联数据的加载策略,分为理解加载,延迟加载,和超级延迟加载
    fetch控制的是SQL语句格式,select一般,subselect子查询,join一般
    fetch如果是使用按OID查询,join左外连接SQL


    从关联数据加载策略
    获取主数据,设置主数据关联的数据加载策略
    获取从数据,设置从数据关联的数据加载策略
    1.fetch = "select" lazy = "false"
    SQL语句:
    从数据:1条SQL
    从关联数据:多条SQL
    查询从关联数据具体数据
    不执行SQL
    2.fetch = "select" lazy = "proxy" proxy指延迟策略由被关联类控制
    SQL语句:
    从数据:1条SQL
    被关联数据lazy="false" 执行多条SQL
    查询从关联数据具体数据
    被关联数据lazy="true" 执行从关联数据查询SQL (按需产生SQL语句)
    注意:lazy="proxy"将控制权交给被关联对象进行控制
    如果被关联对象lazy="true":延迟加载从关联数据
    如果被关联对象lazy="false":立即加载从关联数据
    3.fetch = "join" lazy = "false"
    SQL语句:
    从数据:1条SQL
    从关联数据:多条SQL
    查询从关联数据具体数据
    不执行SQL
    4.fetch = "join" lazy = "proxy"
    SQL语句:
    从数据:1条SQL
    被关联数据lazy="false" 执行多条SQL
    查询从关联数据具体数据
    被关联数据lazy="true" 执行从关联数据查询SQL (按需产生SQL语句)
    注意:lazy="proxy"将控制权交给被关联对象进行控制
    如果被关联对象lazy="true":延迟加载从关联数据
    如果被关联对象lazy="false":立即加载从关联数据
    注意:当使用OID进行查询时,生成的SQL是左外连接格式,此时lazy失效

    fetch:用于控制进行关联查询时,产生的SQL语句
    select:一般SQL
    join:Query join=select 一般SQL
    OID 左外连接SQL
    lazy:用于控制进行关联查询时,被关联数据的加载策略
    false:非延迟加载,初期就将数据查询出来
    proxy:根据从关联数据的lazy属性来决定延迟加载策略

    在进行非延迟加载策略搜索时,往往会生成多条SQL语句,可以通过调整批量抓取策略,提高执行效率
    batch-size = 4

    ---------------------------------------
    二级缓存
    缓存的作用:
    H3支持两种缓存
    一级缓存
    对应Session对象
    二级缓存
    对相SessionFactory对象
    二级缓存操作
    load/get
    先查找一级缓存,有,返回,没有
    再查找二级缓存,有,保存到一级缓存,由一级缓存返回,没有
    再查找数据库,SQL,保存到一级缓存,一级缓存将数据保存到二级缓存,一级缓存返回
    SQL查询
    查找数据库,SQL,保存到一级缓存,一级缓存将数据保存到二级缓存,一级缓存返回
    添加数据
    更新所在一级缓存的数据
    更新数据库对应数据
    删除、修改数据
    更新所在一级缓存的数据
    更新所在二级缓存的数据
    更新数据库对应数据

    二级缓存操作注意事项
    1.SQL查询不走二级缓存
    2.不要将所有数据装入二级缓存
    3.二级缓存获取数据按OID获取
    4.从数据库查询的信息全部进入二级缓存

    二级缓存中的数据需要具备什么条件
    适合加入二级缓存的数据
    很少被修改的数据
    不是很重要的数据,允许出现偶尔并发的数据
    不会被并发访问的数据
    参考数据
    不适合加入二级缓存的数据
    经常被修改的数据
    财务数据,绝对不允许出现并发
    与其他应用共享的数据

  • 相关阅读:
    POJ1741 Tree
    BZOJ3674 可持久化并查集加强版
    BZOJ3673 可持久化并查集 by zky
    BZOJ3174 [Tjoi2013]拯救小矮人
    BZOJ2733 永无乡【splay启发式合并】
    AtCoder Grand Contest 007 E:Shik and Travel
    BZOJ2599:[IOI2011]Race
    AtCoder Regular Contest 063 E:Integers on a Tree
    SPOJ1825:Free Tour II
    AtCoder Grand Contest 012 C:Tautonym Puzzle
  • 原文地址:https://www.cnblogs.com/xyhero/p/9348828.html
Copyright © 2020-2023  润新知