• 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>
  • 相关阅读:
    深入浅出SQL Server 2008 分区函数和分区表
    数据库的恢复模式
    Windows Server 2003网络负载均衡的实现(转)
    SharePoint2010网站备份还原简单介绍
    HTTP协议详解(转)
    SharePoint 2010之LINQ与SPMetal
    moss 自定义文档库文档图标
    SharePoint 2010环境搭建
    C#中的yield关键字
    .NET开发中你可能会用到的常用方法总结(添加ing...)
  • 原文地址:https://www.cnblogs.com/ljljava/p/7440725.html
Copyright © 2020-2023  润新知