Mybatis中resultMap的基础配置
一、概述
resultMap 元素是 MyBatis 中最重要最强大的元素。它就是让你远离 90%的需要从结果集中取出数据的 JDBC 代码的那个东西,而且在一些情形下允许你做一些 JDBC 不支持的事情。事实上,编写相似于对复杂语句联合映射这些等同的代码,也许可以跨过上千行的代码。ResultMap 的设计就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。
resultType和resultMap的关系:
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。在MyBatis进行查询映射的时候,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。当提供的返回类型属性是resultType的时候,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType所指定对象的属性,而当我们提供的返回类型是resultMap的时候,因为Map不能很好表示领域模型,我们就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。
二、配置详解
1、可配置情况
<resultMap>
<constructor>
<idArg/>
<arg/>
</constructor>
<id/>
<result/>
<association property=""/>
<collection property=""/>
<discriminator javaType="">
<case value=""></case>
</discriminator>
</resultMap>
节点简介:
constructor – 类在实例化时,用来注入参数值到构造方法中。
idArg – ID 参数;标记结果作为 ID 可以帮助提高整体效能。
arg – 注入到构造方法的一个普通参数。
id – 一个 ID 结果; 标记结果作为 ID 可以帮助提高整体效能。
result – 注入到字段或 JavaBean 属性的普通参数。
association – 一个复杂的类型关联;许多结果将包成这种类型。
collection – 复杂类型的集合。
discriminator – 使用参数值来决定使用哪个参数来进行映射。
case – 基于某些值的结果映射。
2、constructor
构造方法注入允许你在初始化时为类设置属性的值,而不用暴露出公有方法。 MyBatis 也支持私有属性和私有 JavaBeans 属性来达到这个目的,但是一些人更青睐构造方法注入。 Constructor( 构造方法)元素支持这个。默认情况下mybatis会调用实体类的无参构造方法创建一个实体类,然后再给各个属性赋值,但是有的时候我们可能为实体类生成了有参的构造方法,并且也没有给该实体类生成无参的构造方法,这个时候如果不做特殊配置,resultMap在生成实体类的时候就会报错,因为它没有找到无参构造方法。
使用示例:
假设User实体类的构造方法如下:
public User(Long id, String username, String password, String address) {
this.id = id;
this.username = username;
this.password = password;
this.address = address;
}
在resultMap中配置constructor节点,如下:
<resultMap id="userResultMap" type="com.kang.pojo.User">
<constructor>
<idArg column="id" javaType="long"/>
<arg column="username" javaType="string"/>
<arg column="password" javaType="string"/>
<arg column="address" javaType="string"/>
</constructor>
</resultMap>
在constructor中指定相应的参数,这样resultMap在构造实体类的时候就会按照这里的指定的参数寻找相应的构造方法去完成了。
3、id, result
这两个属性是结果映射最基本内容。 id 和 result 都映射一个单独列的值到简单数据类型(字符
串,整型,双精度浮点数,日期等)的单独属性或字段。
这两者之间的唯一不同是 id 表示的结果将是当比较对象实例时用到的标识属性。这帮
助来改进整体表现,特别是缓存和嵌入结果映射(也就是联合映射)。
使用示例:
<id property="id" column="post_id"/>
<result property="subject" column="post_subject"/>
其中的property表示映射到列结果的字段或属性。如果匹配的是存在的,和给定名称相同的 JavaBeans的属性,那么就会使用。否则 MyBatis 将会寻找给定名称。的字段。这两种情形你可以使用通常点式的复杂属性导航。比如,你可以这样映射一些东西:“ username”,或者映射到一些复杂的东西:“ address.street.number”。
column表示从数据库中得到的列名,或者是列名的重命名标签。
4、association和collection
association是mybatis支持级联的一部分,我们知道在级联中有一对一、一对多、多对多等关系,association主要是用来解决一对一关系的,collection是用来解决一对多级联的。这里先不做详述,待梳理到关联查询时再详细叙述。
5、discriminator
discriminator既不是一对多也不是一对一,这个我们称之为鉴别器级联,使用它我们可以在不同的条件下执行不同的查询匹配不同的实体类。鉴别器非常容易理解,因为它的表现很像 Java 语言中的 switch 语句。
定义鉴别器需要指定了 column 和 javaType 属性。column表示用数据表的哪一个字段参与比较, JavaType是参与比较的字段类型。
比如:
<resultMap id="vehicleResult" type="Vehicle">
<id property=”id” column="id" />
<result property="vin" column="vin"/>
<result property="year" column="year"/>
<result property="make" column="make"/>
<result property="model" column="model"/>
<result property="color" column="color"/>
<discriminator javaType="int" column="vehicle_type">
<case value="1" resultMap="carResult"/>
<case value="2" resultMap="truckResult"/>
<case value="3" resultMap="vanResult"/>
<case value="4" resultMap="suvResult"/>
</discriminator>
</resultMap>
在这个示例中,MyBatis 会从结果集中得到每条记录,然后比较它的 vehicle 类型的值。如果它匹配任何一个鉴别器的实例,那么就使用这个实例指定的结果映射。
Mybatis中resultMap的基础配置的更多相关文章
- mybatis中resultMap配置细则
resultMap算是mybatis映射器中最复杂的一个节点了,能够配置的属性较多,我们在mybatis映射器配置细则这篇博客中已经简单介绍过resultMap的配置了,当时我们介绍了resultMa ...
- 在mybatis中resultMap与resultType的区别
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMapresultType是直接表示返回类型的,而resultMap则是对外部ResultMa ...
- MyBatis 中 resultMap 详解
resultMap 是 Mybatis 最强大的元素之一,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中.如在实际应用中,有一个表为(用户角色表),通过查询用户表信息展示页面, ...
- Mybatis中resultMap与resultType区别
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultM ...
- mybatis中resultMap引发的吐血bug
简单的讲: 问题背景:如果在写mybatis中的resultMap时,不下心将resultMapde id写成映射接口的名字,会发生什么? 结论:单元测试进度条卡住但不报错, Tomcat运行不报错, ...
- mybatis中resultMap的使用
在mybatis中,使用<select>标签,必须要设置resultType属性 或 resultMap属性 否则会报错! resultType一般是返回简单类型的查询结果,涉及一张表 可 ...
- Mybatis中<resultMap>用法(主要用于一对多去重)
一.创建部门表和员工表: 创建部门信息表`t_department`,其中包括`id`, `name` CREATE TABLE t_department ( id INT AUTO_ ...
- Mybatis中对于标签的配置可能不会出现自动提示解决方案
解决办法:引入mybatis-3-config.dtd 文件 Window-preferences-搜索xml-xml catalog <!DOCTYPE configuration PUBLI ...
- Mybatis中resultMap的作用-解决实体类属性名和数据库字段不一致
解决实体类属性名和数据库字段不一致
随机推荐
- ASP.NET MVC 实现 AJAX 跨域请求
ASP.NET MVC 实现AJAX跨域请求的两种方法 和大家分享下Ajax 跨域的经验,之前也找了好多资料,但是都不行,后来看到个可行的修改了并测试下 果然OK了 希望对大家有所帮助! 通常发送 ...
- AC日记——[中山市选2009]谁能赢呢? bzoj 2463
2463 思路: 博弈: 把先手和后手的走的两个格子看做一个1*2的方格: 如果n为偶数,那么棋盘一定可以被1*2的方格覆盖: 前端为先手,后端为后手: 那么,当还剩下一个1*2的方格时,先手一定可以 ...
- 牛客网 牛客小白月赛2 E.是是非非-尼姆博奕
E.是是非非 链接:https://www.nowcoder.com/acm/contest/86/E 这个题就是尼姆博奕(我的队友小可爱很擅长这个) 代码: 1 //E 2 #include< ...
- 网络扫描集成工具SPARTA
网络扫描集成工具SPARTA SPARTA是Kali Linux自带的一款图形化网络扫描工具.它集成了NMAP.Nikto.hydra.nbtscan等几十种工具.用户只需要输入要扫描的IP或者I ...
- SQLite中使用全文搜索FTS
SQLite中使用全文搜索FTS SQLite支持全文搜索.通过全文搜索功能,可以方便用户快速进行查找.在iOS中,GRDB.FMDB等SQLite框架均支持FTS技术,如FTS3.FTS4等.各 ...
- 2016北京集训测试赛(十七)Problem B: 银河战舰
Solution 好题, 又是长链剖分2333 考虑怎么统计答案, 我场上的思路是统计以一个点作为结尾的最长上升链, 但这显然是很难处理的. 正解的方法是统计以每个点作为折弯点的最长上升链. 具体的内 ...
- Maven出现错误No plugin found for prefix 'jetty' in the current project and in the plugin groups的问题解决
只需在maven的setting.xml文件上加入如下节点: <pluginGroups> <pluginGroup>org.mortbay.jetty</pluginG ...
- Docker 容器网络
默认网络 当安装docker时,它会自动创建3个网络.可以使用docker network ls 来查看. zane@zane-V:~$ docker network ls NETWORK ID ...
- NetBeans菜单栏字体太小了
NetBeans菜单栏字体太小了,导致很难看 解决方法:在netbeans的快捷方式内加入"netbeans.exe" --fontsize 12参数.还可以通过配置NetBean ...
- php正则表达式取子字符串及替换
最近在学习如何用php编写cms,想把文章中的第一个图片提取出来当做缩略图显示到前面,想到的方法就是把文章内容作为一个大字符串,然后用正则表达式找出匹配出第一次出现<img src=" ...