对于初学者,如何进行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开发的介绍。

8、mybatis中的sql映射文件详解(3)相关推荐

  1. 7、mybatis中的sql映射文件详解(2)

    对于初学者,如何进行mybatis的学习呢?我总结了几点,会慢慢的更新出来.首先大家需要了解mybatis是什么.用mybatis来做什么.为什么要用mybatis.有什么优缺点:当知道了为什么的时候 ...

  2. 6、mybatis中的sql映射文件详解(1)

    对于初学者,如果进行mybatis的学习呢?我总结了几点,会慢慢的更新出来.首先大家需要了解mybatis是什么.用mybatis来做什么.为什么要用mybatis.有什么优缺点:当知道了为什么的时候 ...

  3. 【java学习之路】(java框架)004.Mybatis SQL映射文件详解

    02Mybatis SQL映射文件详解 ​ 在之前我们学习了mybatis的全局配置文件,下面我们开始学习mybatis的映射文件,在映射文件中,可以编写以下的顶级元素标签: cache – 该命名空 ...

  4. mysql在xml中jdbctype,MyBatis中的JdbcType映射使用详解

    Java项目涉及到数据库交互,以往常用的是JDBC,现在则有Hibernate.Mybatis等这些持久化支持. 项目中用到了MyBatis,和JDBC最显著的区别,就是SQL语句配置化,通过xml文 ...

  5. MyBatis中动态sql语句标签详解

    动态 SQL 通常写在mapper包下面的地址映射配置文件(.xml)中.根据条件的不同, SQL 语句也会随之动态的改变. MyBatis 中,提供了一组标签用于实现动态 SQL. 动态SQL语句标 ...

  6. Mybatis复习笔记3:映射文件详解

    映射文件详解 参数处理(#和$的区别) #{}:可以获取map中的值或者实体对象属性的值: ${}:可以获取map中的值或者实体对象属性的值: select * from person where i ...

  7. Mybaits(3),映射文件详解

    Mybaits(3),映射文件详解 MyBatis 的真正强大在于它的语句映射,这是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对 ...

  8. Hibernate配置文件与映射文件详解

    Hibernate是一个彻底的ORM(Object Relational Mapping,对象关系映射)开源框架. 我们先看一下官方文档所给出的,Hibernate 体系结构的高层视图: 其中PO=P ...

  9. Linux中/proc目录下文件详解

    Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...

最新文章

  1. 09CSS元素显示模式
  2. Ubuntu下eclipse部署mysql jdbc驱动
  3. PHP-FPM.CONF配置:日志文件、端口设置、动态静态选择设置
  4. 为什么待办事项清单不管用
  5. 收集到的非常好的第三方控件
  6. 从今天起,开始等待中信世界杯信用卡
  7. JAVA数组——二分查找
  8. Tomcat内存大小配置及查看内存情况
  9. WPF中使用Chart控件
  10. Python爬虫爬取淘宝天猫,处理url正确的解码方法
  11. EXP6 信息搜集与漏洞扫描 20154328 常城
  12. Could not obtain connection to query metadata : Public Key Retrieval is not allowed
  13. AndroidTV开发-实现APP开机自启动
  14. matlab中strvcat函数,matlab 函数手册大全(3)
  15. C# PDF的创建,替换文本,插入图片
  16. 微课--使用Python查看本机实时网速(GUI版)
  17. anaconda 和Tensorflow 2 安装
  18. 开箱 | 小度智能音箱初体验
  19. python 爬虫http2
  20. mapbox-gl提升建筑渐变效果(视频)

热门文章

  1. zipsys驱动签名工具_全球首发 300系列主板USB WIN7 64位驱动 SMXDIY
  2. arma3自定义服务器,Arma3 生存服架设教程,武装突袭3游戏服务器架设
  3. linux不能更改密码,Linux服务器无法更改密码的解决办法--passwd: User not known
  4. 数据结构---递归实现十进制装换为任意进制
  5. 6-7 求链表的倒数第m个元素 (25 分)
  6. Deep Boltzmann Machines
  7. 网络编程——常用协议解析
  8. SimpleDateFormat与线程安全
  9. 2016-2017 ACM-ICPC CHINA-Final(7 / 12)
  10. 【清华集训2014】Sum)(类欧几里得算法)