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>
时间: 2024-08-07 08:18:34

Mybatis处理表关联(懒加载)的相关文章

mybatis(三)懒加载

懒加载的好处: 所谓懒加载(lazy)就是延时加载,延迟加载.什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载.至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,我们让数据在需要的时候才进行加载,这时我们就用到了懒加载.总结为: 1> 不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强,层次感很强. 2> 每个属性的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强

mybatis分页插件以及懒加载

1.   延迟加载 延迟加载的意义在于,虽然是关联查询,但不是及时将关联的数据查询出来,而且在需要的时候进行查询. 开启延迟加载: <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/> lazyLoadingEnabled:true使用延迟加载,fal

【SSH三大框架】Hibernate基础第十二篇:load()懒加载分析以及一对一、一对多、多对一、多对多懒加载的分析

一.懒加载的定义: 懒加载:在WEB应用程序中,经常会需要查询数据库,系统的响应速度在很大程度上是与数据库交互的响应.因此,如果能够优化与数据库的交互速度,则能够大大提高WEB应用的响应速度. 例如:当有一个Student类和一个Teacher类.当我们加载一个学生的所有信息,包括:学号,姓名等属性后,此时Student类中的Teacher类型的属性为null,当我们需要知道这个Student对应的Teacher属性的时候,我们才去加载这个Teacher对象. 如果,我们只需要知道学生信息,我们

hibernate懒加载

16.懒加载 性能: 发出的sql语句越少,性能越高 方法: 1.懒加载 2.抓取策略 3.缓存策略 4.HQL语句   懒加载 1.类的懒加载 1.利用session.load方法可以产生代理对象 2.在session.load方法执行的时候并不发出sql语句 3.在得到其一般属性的时候发出sql语句 4.只针对一般属性有效,针对标示符属性是无效的 5.默认情况就是懒加载  2.集合的懒加载 <set name=""  lazy="" cascasd=&qu

功能列表字段懒加载原理——JEPLUS快速开发平台

JEPLUS之功能列表字段懒加载原理 当我们在点击进入一个列表或者是列表是总会遇到这样的情况---加载缓慢.在我们配置列表或者表单中默认会员很多的加载项,我们并不是都需要每次点开时都要加载.在今天我给大家介绍下遇到这种情况怎么解决. 一.效果展示 二.准备工作 1.JEPLUS平台5.0.0.2 2.数据库MySql 5.7 三,实现步骤 1.我们在有些场景下需要配置很多列表字段,还有很多的表单字段,那么它在加载的过程中就会逐步加载很缓慢,我们这里给他设置懒加载的目的就是提高列表的展示速度来展示

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

映射(多.一)对一的关联关系 1)若只想得到关联对象的id属性,不用关联数据表 2)若希望得到关联对象的其他属性,要关联其数据表 举例: 员工与部门的映射关系为:多对一 1.创建表 员工表 确定其外键是部门表的 id DROP TABLE IF EXISTS emp; CREATE TABLE emp( id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, emp_name VARCHAR(255) DEFAULT NULL, gender CHAR(1

mybatis懒加载特性详解,以及多对多映射详解

注意讲解都在代码中 准备数据库,测试数据,各位自己添加,因为是多对多,所以使用中间表: 用到的实体: 学生类: public class Student { private Integer sid; private String name; private Integer age; //一个学生有多个老师,一个老师有多个学生 private List<Teacher> teachers=new ArrayList<Teacher>(); setter.. getter.... to

mybatis中的懒加载

知识点:mybatis中的懒加载的使用 参考:https://www.cnblogs.com/ysocean/p/7336945.html?utm_source=debugrun&utm_medium=referral (1)什么是mybatis的懒加载 通俗的讲就是按需加载,我们需要什么的时候再去进行什么操作.而且先从单表查询,需要时再从关联表去关联查询,能大大提高数据库性能, 因为查询单表要比关联查询多张表速度要快. 在mybatis中,resultMap可以实现高级映射(使用associa

Mybatis懒加载

一.需求:查询用户信息,有时候需要关联查出部门信息. 第一种方法:我们直接关联查询出所有用户和部门的信息 select * from tb_user u ,tb_department d where u.dep_id = d.dep_id; 分析: ①这里我们一次查询出所有用户信息,需要什么部门信息的时候直接从查询的结果中筛选.但是如果部门和用户表都比较大的时候,这种关联查询肯定比较耗时. ②我们的需求是有时候需要关联查询部门信息.这里不是一定需要部门信息的.即有时候不需要查询部门信息,我们也查