8、mybatis中的sql映射文件详解(3)

对于初学者,如何进行mybatis的学习呢?我总结了几点,会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点;当知道了为什么的时候就开始了解如何用的问题,如何使用mybatis、有几种使用方式、各种方式的优缺点,在这个阶段也会学习mybatis涉及到的一些标签的用法;当知道了基础用法之后,就开始接触一些高级的用法,例如动态sql的使用、mybatis的缓存使用等;至此,在实战项目中使用mybatis进行开发已经没有问题了。

接下来就开始深入的研究一下mybatis这个持久层的框架,在纯技术的方面进行研究,提高自己的能力。首先,大家需要了解一下mybatis的整体技术架构和工作原理;接下来,就开始了解一下mybatis各大核心组件的具体功能及其工作原理。至此,算是对mybatis的原理简单的了解一下了,由于博主的能力有限,因此对于mybatis的框架技术研究也就到这里算结束了。

最后会了解一些其他的东西,例如:mybatis的逆向工程使用、如何开发一个mybatis插件,在这里会介绍一下mybatis的分页实现等。

至此,mybatis也算是入门了,出去就可以和别人说,你稍微了解mybatis框架,对其也多少有一点自己的理解和看法了。

目录

1、级联属性的映射

2、association指定关联对象映射

3、association 分步查询(嵌套查询)

4、collection 指定关联集合对象映射

5、collection 分步查询(嵌套查询)

6、discriminator 鉴别器的使用


上一篇 介绍了输入映射和输出映射,结束于自定义映射resultMap的更多用法,这一篇主要针对resultMap 的一些高级用法进行叙述。

1、级联属性的映射

这里直接通过例子来看用法,例如:每一个用户对应一个部门,查询用户信息时需要级联查询出部门的信息,此时就可以使用resultMap 自定义映射关系,具体如下:

<resultMap id="user2" type="com.app.mapper.User"><id column="id" property="id"/><result column="name" property="name"/><result column="dname" property="department.name"/>
</resultMap><select id="selectUser2" resultMap="user2">select a.id, a.name, b.tname from oa_user a, oa_department b where a.id = #{id} and a.department = b.id
</select>

此时,User 实体类的属性定义如下:

private Long id; // id
private String name; // 用户名
private Department department; // 关联的部门

2、association指定关联对象映射

对于1中的sql 映射,可以使用 association 标签进行指定关联对象的映射,其具体使用如下:

<select id="selectUser3" resultMap="user3">select a.id, a.name, b.did, b.dname from oa_user a, oa_department b where a.id = #{id} and a.department = b.did
</select><resultMap id="user3" type="com.app.mapper.User"><id column="id" property="id"/><result column="name" property="name"/><association property="department" javaType="com.app.mapper.Department"><id column="did" property="did"/><result column="dname" property="name"/></association>
</resultMap>

3、association 分步查询(嵌套查询)

有的时候sql 语句过于复杂,无法一条语句获取到最终的结果,需要多条语句,或者为了实现延迟加载,针对于 2 中例子,可以通过嵌套查询的方式实现,具体如下:

<select id="getUserById" resultMap="user"></select><resultMap type="com.app.mapper.User" id="user"><id column="id" property="id"/><result column="name" property="name"/><!--   嵌套一个查询,N+1查询     --><association property="department"select="com.app.mapper.UserMapper.getDepartmentByDid"column="did"/></resultMap><select id="getDepartmentByDid" resultType="com.app.mapper.Department">select did, name from department where did = #{did}
</select>

如果想要实现延时加载,需要在mybatis全局配置文件中设置,这个在 全局配置文件 介绍一篇中有介绍:

<setting name="lazyLoadingEnabled" value="true"></setting>

4、collection 指定关联集合对象映射

有的时候关联的数据是一个集合,例如,一个学生有多个老师,此时就需要使用collection 标签进行结果对象映射了,具体如下:

<select id="getStudentBySid" resultMap="student1">select a.sid, a.sname, b.tid, b.tname from student a, teacher b where b.sid = a.sid
</select><resultMap id="student1" type="com.app.mapper.Student"><id column="sid" property="sid"/><result column="sname" property="sname"/><collection property="teachers" ofType="com.app.mapper.Teacher"><id column="tid" property="tid"/><result column="tname" property="tname"/></collection>
</resultMap>

 对应的java实体如下:

private Long sid;
private String sname;
private List<Teacher>  teachers;

5、collection 分步查询(嵌套查询)

类似于 3 ,如果想要实现延时加载的话,可以通过使用 嵌套查询(N+1查询)的方式实现,具体如下:

<select id="getStudentBySid" resultMap="student1">select a.sid, a.sname, b.tid, b.tname from student a, teacher b where a.tid = b.tid
</select><resultMap id="student1" type="com.app.mapper.Student"><id column="sid" property="sid"/><result column="sname" property="sname"/><collection property="teachers" select="com.app.mapper.UserMapper.selectTeacherBySid" column="sid"                         fetchType="lazy"/>
</resultMap>
<select id="getStudentBySid" resultType="com.app.mapper.UserMapper.Teacher">select tid, tname from teacher  where sid = #{sid}
</select>

6、discriminator 鉴别器的使用

鉴别器的作用类似于if ... else ... 选择的作用,在进行分步查询时,可以对前一步查询出来的自定字段值进行判断来确定下一步的执行行为,例如查询用户字段,根据用户的性别来进行不同联系方式的映射,具体使用如下:

<select id="getUser" resultMap="user3">select uid, uname, sex, phone, email from user where uid = #{uid}
</select><resultMap id="user3" type="com.app.mapper.User"><id column="uid" property="uid"/><result column="uname" property="uname"/><discriminator javaType="int"><!-- 1 为男,若为1, 则将用户的手机映射到联系方式; 2 为女,若为2, 则将用户的邮箱映射到联系方式 --><case value="1"><result column="phone" property="link_info"/></case><case value="2"><result column="email" property="link_info"/></case></discriminator>
</resultMap>

这一篇这介绍到这里,下一篇开始进行动态sql开发的介绍。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P3159-[CQOI2012]交换棋子【费用流】

正题 题目链接:https://www.luogu.com.cn/problem/P3159 题目大意 n∗mn*mn∗m的棋盘&#xff0c;每个格子有黑子或白子&#xff0c;每次可以交换两个位置的棋&#xff0c;给出起始态和最终态和每个格子参与交换的最多次数。 求最少交换次数。 解题思路 这里只把白色棋子算作…

[系统安全]使用OD编写连连看外挂

文档下载地址&#xff1a;https://pan.baidu.com/s/1hrzzerq

2018 .NET开发者调查报告: .NET Core 是怎么样的状态

4月28日&#xff0c;在公众号里发起《.NET Core 使用调查》&#xff0c;该调查为期一周&#xff0c;有近3300名开发者参与&#xff0c;统计下结果供你的决策参考。已经使用.net core 的人数只有44%&#xff0c;计划使用.net core 比例达到48%&#xff0c; 没有计划去使用.net …

【动态规划】【递归】取数字问题 (ssl 1644)

取数字问题取数字问题取数字问题 Description 给定M*N的矩阵&#xff0c;其中的每个元素都是-10到10之间的整数。你的任务是从左上角&#xff08;1&#xff0c;1&#xff09;走到右下角&#xff08;M&#xff0c;N&#xff09;&#xff0c;每一步只能向右或向下&#xff0c;并…

9、mybatis中动态sql的使用

对于初学者&#xff0c;如何进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

软件质量保证划重点期末复习总结

软件质量保证复习总结大纲及问题 Module1 《软件工程实践》 1、软件工程实践通过解决问题的根源来指导软件开发。 2、软件工程实践之间相辅相成。 3、过程指导一个团队在什么时候做什么以及如何做。 4、软件工程过程为实现软件工程实践提供了上下文和支持。 Module2 《软件…

P4721-[模板]分治FFT【NTT,分治】

正题 题目链接:https://www.luogu.com.cn/problem/P4721 题目大意 给出序列ggg&#xff0c;然后f01f_01f0​1 fi∑j1ifi−jgjf_{i}\sum_{j1}^if_{i-j}g_jfi​j1∑i​fi−j​gj​ 求序列fff 解题思路 使用分治后用NTTNTTNTT计算前区间对后区间的贡献即可。 时间复杂度O(nlo…

Microsoft Build 2018 直播来啦!

一年一度的Microsoft Build大会又来啦&#xff01;Microsoft Build是微软面向全球开发者、合作伙伴以及消费者介绍其重要产品在未来一年内发展方向的技术盛会。而今年的Microsoft Build 2018大会是微软巨大蜕变、最彻底组织变革后的第一次前沿技术大会。更多了解&#xff0c;请…

【动态规划】矩阵链相乘 (ssl 1596)/能量项链 (ssl 2006)

矩阵链相乘{\color{Cyan} 矩阵链相乘 }矩阵链相乘 Description Input n表示矩阵的个数(<100) n1个数,表示矩阵(<100) Output 最小的乘法次数 Sample Input 5 5 10 4 6 10 2 Sample Output 348 题目大意&#xff1a; 有n个矩阵&#xff0c;输入n1个数&#x…

10、mybatis中缓存的使用

对于初学者&#xff0c;如何进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

C#编译器优化那点事

使用C#编写程序&#xff0c;给最终用户的程序&#xff0c;是需要使用release配置的&#xff0c;而release配置和debug配置&#xff0c;有一个关键区别&#xff0c;就是release的编译器优化默认是启用的。优化代码开关即optimize开关&#xff0c;和debug开关一起&#xff0c;有以…

P3195-[HNOI2008]玩具装箱【斜率优化dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3195 题目大意 nnn个物品&#xff0c;分成若干段&#xff0c;每一段的长度为j−i∑ilrCkj-i\sum_{il}^rC_kj−i∑ilr​Ck​&#xff0c;打包价格为(长度−L)2(长度-L)^2(长度−L)2 求最小价格和。 解题思路 si∑j1iCjs_i\su…

【动态规划】书的复制 (ssl 1203)

书的复制书的复制书的复制 Description 现在要把m本有顺序的书分给k个人复制&#xff08;抄写&#xff09;&#xff0c;每个人的抄写速度都一样&#xff0c;一本书不允许分给两个或两个以上的人抄写&#xff0c;分给每个人的书&#xff0c;必须是连续的&#xff0c;比如不能把…

P1975-[国家集训队]排队【树状数组套线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P1975 题目大意 一个nnn个数字的序列&#xff0c;每次交换两个数&#xff0c;求逆序对。 解题思路 显然交换lll和rrr的话对[1..l−1][1..l-1][1..l−1]和[r1,n][r1,n][r1,n]是不会有影响的&#xff0c;所以我们只需要考虑ll…

【动态规划】分组背包 (ssl 2291)

分组背包分组背包分组背包 Description 有N件物品和一个容量为V的背包。第i件物品的费用是c[i]&#xff0c;价值是w[i]。这些物品被划分为若干组&#xff0c;每组中的物品互相冲突&#xff0c;最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量&#…

如何在Visual Studio 2017中使用C# 7+语法

前言之前不知看过哪位前辈的博文有点印象C# 7控制台开始支持执行异步方法&#xff0c;然后闲来无事&#xff0c;搞着&#xff0c;搞着没搞出来&#xff0c;然后就写了这篇博文&#xff0c;不喜勿喷&#xff0c;或许对您有帮助。在Visual Studio 2017配置支持C# 7语法心想都VS20…

11、mybatis的功能架构分析

1、Mybatis功能架构 1&#xff09;API接口层&#xff1a;提供给外部使用的接口API&#xff0c;开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。 2&#xff09;数据处理层&#xff1a;负责具体的SQL查找、SQL解析、SQL执…

我的ACM之路-写于南宁站后

先说说我的ACM之路吧。自大一下学期开学开始&#xff0c;受到OI大佬舍友的影响&#xff0c;遂入坑。开始啃白书和紫书&#xff0c;然而发现好难啊。意识到大概是自己算法和数据结构知识欠缺的太厉害了&#xff0c;于是去网上买了本数据结构的教材&#xff08;隐约记得是清华大学…

P1903-[国家集训队]数颜色/维护队列【带修莫队】

正题 题目链接:https://www.luogu.com.cn/problem/P1903 题目大意 要求支持两个操作 QLR:Q\ \ L\ \ R:Q L R:询问L,RL,RL,R之间有多少个不同的数RPCol:R\ \ P\ \ Col:R P Col:将PPP修改为ColColCol 解题思路 莫队中多加一个时间维度ttt表示前面有多少个修改操作&#xf…

【动态规划】方格取数 (ssl 1010)

方格取数方格取数方格取数 Description 设有N*N的方格图(N<10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示&#xff08;见样例&#xff09;&#xff1a; 某人从图的左上角的A 点出发&#xff0c;可以向下行走&#xff0c;也可以向右走&#…