zoukankan      html  css  js  c++  java
  • Mybatis的延迟加载

    Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

    Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,多对一,collection指的就是一对多,多对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false

    延迟加载代码实现(一对多collection 查询部门时,查出该部门的员工):

    实体:Dept   Emp

    需要在Dept中加入private List<Emp> empList;  和getter setter (即构造方法)

    dao:
    
    DeptDao:
    
     /**
    
         * 查询所有部门
    
         * @return
    
         */
    
        List<Dept>  listAll();
    
    EmpDao:
    
       /**
    
         * 根据部门编号获取员工
    
         * @param deptNo
    
         * @return
    
         */
    
        List<Emp> listEmpByDeptNo(int deptNo);

    配置文件:

    DeptMapper.xml : 

    <!--查询所有部门-->
    
         <select id="listAll" resultMap="deptEmp">
    
              select  * from dept
    
         </select>
    
        <!--映射-->
    
        <resultMap id="deptEmp" type="com.aaa.mybatis.entity.Dept">
    
            <id property="deptNo" column="deptno"/>
    
            <result property="deptName" column="deptname"/>
    
            <result property="loc" column="loc"/>
    
            <collection property="empList" column="deptno" ofType="com.aaa.mybatis.entity.Emp" select="com.aaa.mybatis.dao.EmpDao.listEmpByDeptNo">
    
            </collection>
    
        </resultMap>

     EmpMapper.xml:

    <!--根据部门编号获取员工-->
    
        <select  id="listEmpByDeptNo" resultType="com.aaa.mybatis.entity.Emp">
    
            select empno,empname,salary from emp where deptno=#{deptNo}
    
        </select>

     主配置文件:mybatis-config.xml  中的 settings

    <!--开启全局懒加载-->
    
        <setting name="lazyLoadingEnabled" value="true"></setting>

    测试:

    /**
         * 测试延时加载
         */
        @Test
        public void testListAll(){
            SqlSession sqlSession = null;
            try {
                sqlSession = SqlSessionFacotryUtil.getSqlSession();
                DeptDao deptDao = sqlSession.getMapper(DeptDao.class);
                List<Dept> depts = deptDao.listAll();
                if(depts!=null&&depts.size()>0){
                    for (Dept dept : depts) {
                        dept.getEmpList();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if(sqlSession!=null)
                    sqlSession.close();
            }
        }
    如果下面代码注释掉,开启懒加载,底层查询数据库时,只执行了部门查询,如果不开启懒加载,部门和该部门的员工都查询了
       if(depts!=null&&depts.size()>0){
                    for (Dept dept : depts) {
                        dept.getEmpList();
                    }
                }

    association指的就是一对一,多对一:

    /*实体加入*/
    private
    Ictionaries ictionaries; <!-- 通用查询映射结果 --> <resultMap id="CustomerIctionaries" type="com.aaa.entity.Customer"> <id column="customer_id" property="customerId" /> <result column="name" property="name" /> <result column="sex" property="sex" /> <result column="type_id" property="typeId" /> <result column="purchase_quantity" property="purchaseQuantity" /> <result column="purchase_purpose" property="purchasePurpose" /> <result column="purchase_date" property="purchaseDate" /> <result column="nationality" property="nationality" /> <result column="certificateType" property="certificateType" /> <result column="identification_number" property="identificationNumber" /> <result column="date_birth" property="dateBirth" /> <result column="home_address" property="homeAddress" /> <result column="residential_address" property="residentialAddress" /> <result column="issuing_authority" property="issuingAuthority" /> <result column="work_unit" property="workUnit" /> <result column="remarks" property="remarks"/> <association property="ictionaries" javaType="com.aaa.entity.Ictionaries"> <result property="code" column="code"/> </association> </resultMap>
  • 相关阅读:
    关于 a 标签 jquery的trigger("click"),无法触发问题。
    浏览器上传文件,存到oracle数据库示例。
    关于java的Long 类型到js丢失精度的问题
    java 自定义注解,并使用示例
    关于重置功能(type="reset")的相关问题
    校验键盘上中英文状态下所有的特殊字符(排除下划线所在的按键)
    VS Code 设置取消打开文件目录的自动定位跟踪功能。
    $.extend(x,y); 函数用法介绍。
    用jquery的.val() 给具有style="display:none;" 属性的标签写值的问题。
    10.我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。 请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
  • 原文地址:https://www.cnblogs.com/cwshuo/p/13438616.html
Copyright © 2011-2022 走看看