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处理表关联(懒加载)的主要内容,如果未能解决你的问题,请参考以下文章