Mybatis处理表关联(懒加载)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis处理表关联(懒加载)相关的知识,希望对你有一定的参考价值。

1.关系型数据库?

  数据库中的表对象之间是有关系的。

  一对一,一对多,多对多。

  ORM映射。数据库表映射到实体对象。

             实体与实体之间是有关系的。

 一对多的关系。

 比如商品分类表与商品表之间的关系,就是一对多的关系。

     入库主表与入库子表之间的关系,也是一对多的关系。

     出库主表与出库子表之间的关系,也是一对多的关系。

技术分享

ID编号  教师编号   课程编号   其余字段  (外键的都是多的关系)

1        001

2        001

很明显的就是在多的这个表里会出现1的这个表里的字段。

 

 

2.如果我们获取的时候,只想获取单表的数据:

 

 尽可能不用关联查询的时候就不用。

 

延迟加载,也叫懒加载,比如我们取商品信息表的数据,只会从商品信息表里去获取,如果发现我们除了取商品信息表的数据的时候,还会取商品分类表的数据,那么这个时候才会去查询商品分类表的数据。

 

实现延迟加载的步骤:

 

1),首先需要配置mybatis中使用延迟加载:

 

 

 

<!-- lazyLoadingEnabled设置为懒加载-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- aggressiveLazyLoading主动加载设置为false -->
    <setting name="aggressiveLazyLoading" value="false"/>

 

 

 

2)需要配置jar包,cglib的jar包。

 

 

 

<!-- mybatis懒加载需要引入的jar包,cglib包 -->
        <dependency>
              <groupId>cglib</groupId>
              <artifactId>cglib-nodep</artifactId>
              <version>3.1</version>
        </dependency>

 

3.实体与实体之间的关系设定。

技术分享

设计思路,在产品实体类中会有一个产品分类的实体对象。

  在分类的实体对象中会有一个产品表的集合对象数据。

比如产品表,那么会有一个产品分类的实体对象:

public class GoodsInfo implements Serializable{
    private Integer goodsid;
    private Integer goodstypeid;//外键
    private Integer companyid;
    private Integer unitid;
    private String createuser;
    private String updateuser;
    private String commdityid;
    private String commdityname;
    private String describeit;
    private String createtime;
    private String updatetime;
    private String remark;
    private String ifdelete;
    
    //会有一个外键的实体对象数据
    private GoodsType goodsType;
}

映射的配置(配置在实体XML里面):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jinglin.hotelsup.dao.imp.GoodsInfoMapper">
<!-- type是告诉将要映射的实体类,id就是标记名 -->
<!-- 实现懒加载的结果集(延迟加载) -->
<resultMap type="GoodsInfo" id="goodsInfoLazyResultMap">
    <!-- column表示的是数据库的列名,property是对应的属性名 -->
   <id column="goodsid" property="goodsid"/>
   <!--result表示数据库的字段和对象的字段的映射,column表示列名,property表示的是对象的属性名 -->
   <result column="goodstypeid" property="goodstypeid"></result>
   <result column="companyid " property="companyid "></result>
   <result column="unitid" property="unitid"></result>
   <result column="createuser" property="createuser"></result>
   <result column="updateuser" property="updateuser"></result>
   <result column="commdityid" property="commdityid"></result>
   <result column="commdityname" property="commdityname"></result>
   <result column="describeit" property="describeit"></result>
   <result column="createtime" property="createtime"></result>
   <result column="updatetime" property="updatetime"></result>
   <result column="remark" property="remark"></result>
   <result column="ifdelete" property="ifdelete"></result>
   <!--关联另外一个实体对象 -->
   <association  property="goodsType" select="getgoodstypeone"
   column="goodstypeid">
   </association>
</resultMap>
<select id="selectOne" resultMap="goodsInfoLazyResultMap" parameterType="java.lang.Integer">
    select * from goodsinfo where goodsid=#{goodsid}
</select>
<select id="getgoodstypeone" resultType="GoodsType" parameterType="java.lang.Integer">
    select * from goodstype where goodstypeid=#{goodstypeid}
</select>
</mapper>

2)对于产品分类表,那么会对应到多个产品,实际就是在产品分类表里会有产品的集合:

public class GoodsType implements Serializable {
    private Integer goodstypeid;
    private String goodstypename;
    private String ifdel;
    //分类表里会出现多的产品的集合
    private List<GoodsInfo> listgoods;

    
    public List<GoodsInfo> getListgoods() {
            return listgoods;
    }

    public void setListgoods(List<GoodsInfo> listgoods) {
            this.listgoods = listgoods;
    }
    
    public Integer getGoodstypeid() {
        return goodstypeid;
    }

    public void setGoodstypeid(Integer goodstypeid) {
        this.goodstypeid = goodstypeid;
    }

    public String getGoodstypename() {
        return goodstypename;
    }

    public void setGoodstypename(String goodstypename) {
        this.goodstypename = goodstypename;
    }

    public String getIfdel() {
        return ifdel;
    }

    public void setIfdel(String ifdel) {
        this.ifdel = ifdel;
    }
     
}

那么对应的映射结果集(配置在对应产品类型的xml里面):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jinglin.hotelsup.dao.imp.GoodsTypeMapper">
    <!-- 配置延迟加载的映射结果集 -->
   <resultMap type="GoodsType" id="goodsTypeLazyResultMap">
       <!-- 配置主键 -->
       <id column="goodstypeid" property="goodstypeid"></id>
       <result column="goodstypename" property="goodstypename"></result>
       <result column="ifdel" property="ifdel"></result>
       <!-- 配置集合 -->
       <collection select="selectgoods" property="listgoods" column="goodstypeid"></collection>
   </resultMap>
   <select id="selectOne" resultMap="goodsTypeLazyResultMap" parameterType="java.lang.Integer">
           select * from goodstype where ifdel=‘N‘ and goodstypeid=#{goodstypeid}
   </select>
   <select id="selectgoods" resultMap="com.jinglin.hotelsup.dao.imp.GoodsInfoMapper.goodsInfoLazyResultMap" parameterType="java.lang.Integer">
           select * from goodsinfo where goodstypeid=#{goodstypeid}
   </select>
   
</mapper>

 

以上是关于Mybatis处理表关联(懒加载)的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis --- 映射关系一对一对多多对多,懒加载机制

MyBatis 懒加载

Mybatis框架-第三篇

Mybatis懒加载机制

mybatis-注解

Mybatis-04 懒加载&缓存&注解开发