MyBatis的高级映射及延迟加载

多对一:

多种方式,常见的包括三种:

  • 第一种方式:一条SQL语句,级联属性映射。

  • 第二种方式:一条SQL语句,association。

  • 第三种方式:两条SQL语句,分步查询。(这种方式常用:优点一是可复用。优点二是支持懒加载。)

怎么区分主表和副表?

原则:谁在前面谁是主表

例如:多对一,多在前面,那么多的那个表就是主表

级联属性映射:

Student类:

package pojo;/*** 学生信息* 没有cid这个属性,后期会有特殊的方式来处理这个关系字段*/
public class Student {private Integer sid;private String sname;private Clazz clazz;public Clazz getClazz() {return clazz;}public void setClazz(Clazz clazz) {this.clazz = clazz;}@Overridepublic String toString() {return "Student{" +"sid=" + sid +", sname='" + sname + '\'' +", clazz=" + clazz +'}';}public Student() {}public Student(Integer sid, String sname) {this.sid = sid;this.sname = sname;}public Integer getSid() {return sid;}public void setSid(Integer sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}
}

对应的sql映射文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.StudentMapper"><!-- 级联属性映射 --><resultMap id="studentResultMap" type="Student"><id property="sid" column="sid"/><result property="sname" column="sname"/><result property="clazz.cid" column="cid"/><result property="clazz.cname" column="cname"/></resultMap><select id="selectById" resultMap="studentResultMap">SELECTs.sid, s.sname, c.cid, c.cnameFROMt_student_plus sLEFT JOINt_clazz c ON s.cid = c.cidWHEREs.sid = #{sid}</select></mapper>

@Testpublic void testSelectBySid(){StudentMapper mapper = SqlSessionUtil.openSession().getMapper(StudentMapper.class);Student student = mapper.selectBySid(1);System.out.println(student);}

sql语句:

2024-10-14 13:29:58.511 [main] DEBUG mapper.StudentMapper.selectById - ==>  Preparing: 
SELECT s.sid, s.sname, c.cid, c.cname FROM t_student_plus s 
LEFT JOIN t_clazz c ON s.cid = c.cid WHERE s.sid = ?

association

对应的sql映射文件:

  <resultMap id="studentResultMapAssociation" type="Student"><id property="sid" column="sid"/><result property="sname" column="sname"/><!-- 嵌套映射,将 clazz 对象中的 cid 和 cname 映射 --><association property="clazz" javaType="Clazz"><id property="cid" column="cid"/><result property="cname" column="cname"/></association></resultMap><select id="selectByIdAssociation" resultMap="studentResultMap">SELECTs.sid, s.sname, c.cid, c.cnameFROMt_student_plus sLEFT JOINt_clazz c ON s.cid = c.cidWHEREs.sid = #{sid}</select>

association翻译为:关联。 学生对象关联一个班级对象。

关键点说明

  1. <resultMap> 元素resultMap 用于映射结果集到 Java 对象。通过定义 StudentResultMap 来描述如何将查询结果映射到 Student 对象。

  2. <association> 元素<association> 用于处理多对一的关系映射。它会把 clazz 的数据映射到 Student 对象的 clazz 属性上。

    • property:对应 Student 类中的 clazz 属性。
    • javaType:指定 Clazz 类的全限定名。
    • 通过 propertycolumn 进行字段的映射。
  3. SQL 查询selectStudentWithClazz 查询使用了 LEFT JOIN 来同时获取 studentclazz 的信息,并通过 resultMap 映射到 Student 对象中。

分步查询

  <resultMap id="studentResultMapByStep" type="Student"><id property="sid" column="sid"/><id property="sname" column="sname"/><association property="clazz"select="mapper.ClazzMapper.selectByCid"column="cid"/></resultMap><!--两条sql语句,完成多对一的分布查询-->
<!--    这是第一步,根据id值查询学生的所有信息,这些信息当中含有班级id(cid-->
<select id="selectByIdStep1" resultMap="studentResultMapByStep" >select sid,sname,cid from t_student_plus where sid = #{sid}
</select>

解释:

  • <resultMap id="studentResultMap" type="Student">:定义了一个结果映射规则,结果将映射到 Student 对象中。
  • <id property="sid" column="sid"/>:将数据库中的 sid 列映射到 Student 类的 sid 属性,通常用于映射主键。
  • <result property="sname" column="sname"/>:将数据库中的 sname 列映射到 Student 类的 sname 属性。
  • <association>:用于描述一个对象属性与其他查询之间的关联。
    • property="clazz"Student 类中对应的属性名是 clazz,它表示学生所属的班级。
    • select="com.powernode.mybatis.mapper.ClazzMapper.selectByCid":指定调用的查询方法,用于获取 Clazz 信息。
    • column="cid":指定当前查询结果中的 cid 列的值,将其作为参数传递给 selectByCid 方法。

 在ClazzMapper接口中添加方法

public interface ClazzMapper {/*** 分布查询第二步* 根据cid获取Clazz信息* @param cid* @return*/Clazz selectByCid(Integer cid);
}

 ClazzMapper的sql映射文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.ClazzMapper">
<select id="selectByCid" resultType="Clazz">select cid,cname from t_clazz where cid = #{cid}
</select>
</mapper>

执行结果,可以很明显看到先后有两条sql语句执行:

延迟加载

一对多延迟加载机制和多对一是一样的。同样是通过两种方式:

  • 第一种:fetchType="lazy"

      <resultMap id="studentResultMapByStep" type="Student"><id property="sid" column="sid"/><id property="sname" column="sname"/><association property="clazz"select="mapper.ClazzMapper.selectByCid"column="cid"fetchType="lazy"/> <!--添加延迟--></resultMap><!--两条sql语句,完成多对一的分布查询-->
    <!--    这是第一步,根据id值查询学生的所有信息,这些信息当中含有班级id(cid-->
    <select id="selectByIdStep1" resultMap="studentResultMapByStep" >select sid,sname,cid from t_student_plus where sid = #{sid}
    </select>
  • 第二种:修改全局的配置setting,lazyLoadingEnabled=true,如果开启全局延迟加载,想让某个sql不使用延迟加载:fetchType="eager"

一对多

一对多的实现,通常是在一的一方中有List集合属性。

在Clazz类中添加List<Student> stus; 属性。

package pojo;import java.util.List;/*** 班级信息*/
public class Clazz {public Clazz() {}private Integer cid;private String cname;private List<Student> stus;public List<Student> getStus() {return stus;}@Overridepublic String toString() {return "Clazz{" +"cid=" + cid +", cname='" + cname + '\'' +", stus=" + stus +'}';}public void setStus(List<Student> stus) {this.stus = stus;}public Integer getCid() {return cid;}public void setCid(Integer cid) {this.cid = cid;}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}public Clazz(Integer cid, String cname) {this.cid = cid;this.cname = cname;}
}

一对多的实现通常包括两种实现方式:

  • 第一种方式:collection

  • 第二种方式:分步查询

collection:

public interface ClazzMapper {/*** 根据cid获取Clazz信息* @param cid* @return*/Clazz selectByCid(Integer cid);/*** 根据班级编号查询班级信息。同时班级中所有的学生信息也要查询。* @param cid* @return*/Clazz selectClazzAndStusByCid(Integer cid);
}
<resultMap id="clazzResultMap" type="Clazz"><id property="cid" column="cid"/><result property="cname" column="cname"/><collection property="stus" ofType="Student"><id property="sid" column="sid"/><result property="sname" column="sname"/></collection>
</resultMap><select id="selectClazzAndStusByCid" resultMap="clazzResultMap">select * from t_clazz c join t_student s on c.cid = s.cid where c.cid = #{cid}
</select>

 注意是ofType,表示“集合中的类型”!!!

分步查询:

<resultMap id="clazzResultMap" type="Clazz"><id property="cid" column="cid"/><result property="cname" column="cname"/><!--主要看这里--><collection property="stus"select="com.powernode.mybatis.mapper.StudentMapper.selectByCid"column="cid"/>
</resultMap><!--sql语句也变化了-->
<select id="selectClazzAndStusByCid" resultMap="clazzResultMap">select * from t_clazz c where c.cid = #{cid}
</select>
/**
* 根据班级编号获取所有的学生。
* @param cid
* @return
*/
List<Student> selectByCid(Integer cid);
<select id="selectByCid" resultType="Student">select * from t_student where cid = #{cid}
</select>

延迟加载

一对多延迟加载机制和多对一是一样的。同样是通过两种方式:

  • 第一种:fetchType="lazy"

  • 第二种:修改全局的配置setting,lazyLoadingEnabled=true,如果开启全局延迟加载,想让某个sql不使用延迟加载:fetchType="eager"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/2472.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

bugku中web题-source

Web安全解题基础三件套思路 信息收集与目录扫描 御剑扫描&#xff1a;探测网站目录结构&#xff0c;找潜在可访问路径&#xff0c;如管理员后台等目录。dirsearch扫描后台目录&#xff1a;配置参数后扫描&#xff0c;分析返回有意义状态码的目录&#xff0c;可能包含后台管理界…

Java中String的length与Oracle数据库中VARCHAR2实际存储长度不一致的问题

目录 一、根本原因 二、解决方案 一、根本原因 Oracle数据库新增数据的时候报如下错误&#xff1a; 先给大家看个小案例&#xff0c;这样更好去理解&#xff0c;下面是一段测试代码&#xff1a; 这里面我分别列举了三种字符串&#xff0c;中文&#xff0c;英文和数字以及两种…

shodan6-7---清风

shodan6-7 1.shodan网页版 以cve-2019-0708漏洞指纹特征为例 "\x03\x00\x00\x0b\x06\xd0\x00\x00\x124\x00"在这里插入图片描述 搜索命令参考 https://www.shodan.io/search/filters这个网页中有搜索关键词 对指定网址进行监控&#xff0c;这里可以对ip进行扫描&…

Spring5学习记录(四)声明式事务管理

Spring5学习记录&#xff08;四&#xff09;声明式事务管理 一、事务管理1、事务四个特性ACID2、事务的两种方式 二、基于注解实现声明式事务管理1、配置xml文件2、添加事务注解 Transactional 三、声明式事务管理的参数配置1、propagation&#xff1a;事务传播行为2、isolat…

Linux上python离线安装教程

一. 安装Python 1. 下载python离线包 安装包下载地址&#xff1a;https://www.python.org/downloads/source/ 我下载的是Python 3.10.14 下面是linux服务器上的部署过程 2. 系统更新 sudo yum update -y 3. 安装必要的依赖项 sudo yum groupinstall “Development Tools” -y…

快速入门CSS

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗 如有错误&#xff0c;欢迎指出~ 目录 CSS css的三种引入方式 css书写规范 选择器分类 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 color颜色设置 border边框设置 width/heigth 内/外边距 C…

ssm基于vue搭建的新闻网站+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 [2 系统…

MATLAB计算朗格朗日函数

1. 朗格朗日函数介绍 朗格朗日函数&#xff08;Lagrange function&#xff09;通常用于优化问题&#xff0c;尤其是带有约束的优化问题。其一般形式为&#xff1a; 其中&#xff1a; f(x) 是目标函数。 是约束条件。 是拉格朗日乘子。 为了编写一个MATLAB代码来计算和绘制…

商场应急响应:SpringBoot技术优化

3系统分析 3.1可行性分析 通过对本大型商场应急预案管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本大型商场应急预案管理系统采用SSM框架&#xff0…

WebSocket的理解与应用

WebSocket的理解与应用 一、是什么二、特点1、全双工2、二进制帧3、协议名4、握手5、优点 三、应用场景 一、是什么 WebSocket&#xff0c;是一种网络传输协议&#xff0c;位于OSI模型的应用层。可在单个TCP连接上进行全双工通信&#xff0c;能更好的节省服务器资源和带宽并达…

【C++ 算法进阶】算法提升八

复杂计算 &#xff08;括号问题相关递归套路 重要&#xff09; 题目 给定一个字符串str str表示一个公式 公式里面可能有整数 - * / 符号以及左右括号 返回最终计算的结果 题目分析 本题的难点主要在于可能会有很多的括号 而我们直接模拟现实中的算法的话code会难写 要考虑…

Node学习记录-until实用工具

来源&#xff1a;Nodejs 第十八章&#xff08;util&#xff09; util 是Node.js内部提供的很多实用或者工具类型的API util.promisify 用于将遵循Node回调风格&#xff08;即最后一个参数为回调函数&#xff09;的函数转换成返回Promise的函数&#xff0c;这样可以使得异步代…

Vue生命周期

Vue生命周期&#xff1a;Vue实例从创建到销毁的过程&#xff0c;即指从创建、初始化数据、编译模板、挂载DOM到渲染、更新到渲染、销毁等一系列过程。主要分为创建前后、载入前后、更新前后、销毁前后以及一些特殊场景的生命周期。 …

注意力机制的目的:理解语义;编码器嵌入高纬空间计算;注意力得分“得到S*V”;解码器掩码和交叉注意力层用于训练;最终的编码器和输出实现大模型

目录 注意力机制的目的:理解语义中的它是小白兔 词编码器嵌入高纬空间 计算注意力得分“得到S*V” 权重QKV:连接权重 训练阶段使用解码器:翻译后的语句 解码器掩码和交叉注意力层用于训练 最终的编码器和输出实现大模型 Transformer模型中,QKV QKV的作用 举例说明…

鸿蒙5.0时代:原生鸿蒙应用市场引领开发者服务新篇章

前言 10月22日原生鸿蒙之夜发布会宣布HarmonyOS NEXT正式发布&#xff0c;首个版本号&#xff1a;鸿蒙5.0。这次“纯血鸿蒙”脱离了底层安卓架构成为纯国产的独立系统&#xff0c;仅凭这一点就有很多想象空间。 目前鸿蒙生态设备已超10亿&#xff0c;原生鸿蒙操作系统在中国市…

联动香港、成都、武汉三所高校!“2024 深圳国际金融科技大赛”校园行圆满结束

在金融科技蓬勃发展的当下&#xff0c;人才培养成为推动行业前行的关键。为推进深圳市金融科技人才高地建设&#xff0c;向高校学子提供一个展示自身知识、能力和创意的平台&#xff0c;2024 FinTechathon 深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛重磅开启&#xf…

【真题笔记】16年系统架构设计师要点总结

【真题笔记】16年系统架构设计师要点总结 存储部件接口嵌入式处理器产品配置配置管理用户文档系统文档CMM&#xff08;能力成熟度模型&#xff09;螺旋模型敏捷软件开发的方法学软件工具面向对象的分析模型设计模型COP&#xff08;面向构件的编程&#xff09;构件原子构件模块S…

【力扣打卡系列】二分查找(红蓝染色法)

坚持按题型打卡&刷&梳理力扣算法题系列&#xff0c;语言为go&#xff0c;Day8 在排序数组中查找元素的第一个和最后一个位置 题目描述解题思路 二分查找 注意勿漏循环&#xff0c;条件为left < right注意比较的是nums[mid]与target的值&#xff0c;不是mid注意if s…

NGINX 交叉编译 arm32

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

openstack之guardian介绍与实例创建过程

运行特征 采集模块&#xff1a;扩展Ceilometer&#xff0c;采集存储网、业务网连通性、nova目录是否可读写&#xff1b; 收集模块&#xff1a;将采集到的数据存储到数据库中&#xff1b; 分析模块&#xff1a;根据采集的结果&#xff0c;分析各节点状态&#xff0c;并进行反向检…