SQL 映射XML 文件是所有sql语句放置的地方。需要定义一个workspace,一般定义为对应的接口类的路径。写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用,例如:

  1. <mappers>
  2. <mapper resource="com/liming/manager/data/mappers/UserMapper.xml" />
  3. <mapper resource="com/liming/manager/data/mappers/StudentMapper.xml" />
  4. <mapper resource="com/liming/manager/data/mappers/ClassMapper.xml" />
  5. <mapper resource="com/liming/manager/data/mappers/TeacherMapper.xml" />
  6. </mappers>

当Java接口与XML文件在一个相对路径下时,可以不在myBatis配置文件的mappers中声明。

SQL 映射XML 文件一些初级的元素:

1. cache – 配置给定模式的缓存
2. cache-ref – 从别的模式中引用一个缓存
3. resultMap – 这是最复杂而却强大的一个元素了,它描述如何从结果集中加载对象
4. sql – 一个可以被其他语句复用的SQL 块
5. insert – 映射INSERT 语句
6. update – 映射UPDATE 语句
7. delete – 映射DELEETE 语句
8. select  -  映射SELECT语句

2.1 resultMap

resultMap 是MyBatis 中最重要最强大的元素了。你可以让你比使用JDBC 调用结果集省掉90%的代码,也可以让你做许多JDBC 不支持的事。现实上,要写一个等同类似于交互的映射这样的复杂语句,可能要上千行的代码。ResultMaps 的目的,就是这样简单的语句而不需要多余的结果映射,更多复杂的语句,除了只要一些绝对必须的语句描述关系以外,再也不需要其它的。

resultMap属性:type为java实体类;id为此resultMap的标识。

resultMap可以设置的映射:

1. constructor – 用来将结果反射给一个实例化好的类的构造器

a) idArg – ID 参数;将结果集标记为ID,以方便全局调用
b) arg –反射到构造器的通常结果

2. id – ID 结果,将结果集标记为ID,以方便全局调用

3. result – 反射到JavaBean 属性的普通结果

4. association – 复杂类型的结合;多个结果合成的类型

a) nested result mappings – 几resultMap 自身嵌套关联,也可以引用到一个其它上

5. collection –复杂类型集合a collection of complex types

6. nested result mappings – resultMap 的集合,也可以引用到一个其它上

7. discriminator – 使用一个结果值以决定使用哪个resultMap

a) case – 基本一些值的结果映射的case 情形

i. nested result mappings –一个case 情形本身就是一个结果映射,因此也可以包括一些相同的元素,也可以引用一个外部resultMap。

2.1.1 id、result

id、result是最简单的映射,id为主键映射;result其他基本数据库表字段到实体类属性的映射。
  最简单的例子:

  1. <resultMap type="liming.student.manager.data.model.StudentEntity" id="studentResultMap">
  2. <id  property="studentId"        column="STUDENT_ID" javaType="String" jdbcType="VARCHAR"/>
  3. <result property="studentName"       column="STUDENT_NAME" javaType="String" jdbcType="VARCHAR"/>
  4. <result property="studentSex"        column="STUDENT_SEX"  javaType="int" jdbcType="INTEGER"/>
  5. <result property="studentBirthday"   column="STUDENT_BIRTHDAY"  javaType="Date" jdbcType="DATE"/>
  6. <result property="studentPhoto"  column="STUDENT_PHOTO" javaType="byte[]" jdbcType="BLOB" typeHandler="org.apache.ibatis.type.BlobTypeHandler" />
  7. </resultMap>

id、result语句属性配置细节:

属性

描述

property

需要映射到JavaBean 的属性名称。

column

数据表的列名或者标签别名。

javaType

一个完整的类名,或者是一个类型别名。如果你匹配的是一个JavaBean,那MyBatis 通常会自行检测到。然后,如果你是要映射到一个HashMap,那你需要指定javaType 要达到的目的。

jdbcType

数据表支持的类型列表。这个属性只在insert,update 或delete 的时候针对允许空的列有用。JDBC 需要这项,但MyBatis 不需要。如果你是直接针对JDBC 编码,且有允许空的列,而你要指定这项。

typeHandler

使用这个属性可以覆写类型处理器。这项值可以是一个完整的类名,也可以是一个类型别名。

支持的JDBC类型
       为了将来的引用,MyBatis 支持下列JDBC 类型,通过JdbcType 枚举:
BIT,FLOAT,CHAR,TIMESTAMP,OTHER,UNDEFINED,TINYINT,REAL,VARCHAR,BINARY,BLOB,NVARCHAR,SMALLINT,DOUBLE,LONGVARCHAR,VARBINARY,CLOB,NCHAR,INTEGER,NUMERIC,DATE,LONGVARBINARY,BOOLEAN,NCLOB,BIGINT,DECIMAL,TIME,NULL,CURSOR

2.1.2 constructor

我们使用id、result时候,需要定义java实体类的属性映射到数据库表的字段上。这个时候是使用JavaBean实现的。当然我们也可以使用实体类的构造方法来实现值的映射,这个时候是通过构造方法参数的书写的顺序来进行赋值的。
        使用construcotr功能有限(例如使用collection级联查询)。
        上面使用id、result实现的功能就可以改为:

  1. <resultMap type="StudentEntity" id="studentResultMap" >
  2. <constructor>
  3. <idArg javaType="String" column="STUDENT_ID"/>
  4. <arg javaType="String" column="STUDENT_NAME"/>
  5. <arg javaType="String" column="STUDENT_SEX"/>
  6. <arg javaType="Date" column="STUDENT_BIRTHDAY"/>
  7. </constructor>
  8. </resultMap>

当然,我们需要定义StudentEntity实体类的构造方法:

  1. public StudentEntity(String studentID, String studentName, String studentSex, Date studentBirthday){
  2. this.studentID = studentID;
  3. this.studentName = studentName;
  4. this.studentSex = studentSex;
  5. this.studentBirthday = studentBirthday;
  6. }

2.1.3 association联合

联合元素用来处理“一对一”的关系。需要指定映射的Java实体类的属性,属性的javaType(通常MyBatis 自己会识别)。对应的数据库表的列名称。如果想覆写的话返回结果的值,需要指定typeHandler。
不同情况需要告诉MyBatis 如何加载一个联合。MyBatis 可以用两种方式加载:

1. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活;
2. resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。

例如,一个班级对应一个班主任。
 首先定义好班级中的班主任属性:

  1. private TeacherEntity teacherEntity;

2.1.3.1使用select实现联合

例:班级实体类中有班主任的属性,通过联合在得到一个班级实体时,同时映射出班主任实体。

这样可以直接复用在TeacherMapper.xml文件中定义好的查询teacher根据其ID的select语句。而且不需要修改写好的SQL语句,只需要直接修改resultMap即可。

ClassMapper.xml文件部分内容:

  1. <resultMap type="ClassEntity" id="classResultMap">
  2. <id property="classID" column="CLASS_ID" />
  3. <result property="className" column="CLASS_NAME" />
  4. <result property="classYear" column="CLASS_YEAR" />
  5. <association property="teacherEntity" column="TEACHER_ID" select="getTeacher"/>
  6. </resultMap>
  7. <select id="getClassByID" parameterType="String" resultMap="classResultMap">
  8. SELECT * FROM CLASS_TBL CT
  9. WHERE CT.CLASS_ID = #{classID};
  10. </select>

TeacherMapper.xml文件部分内容:

  1. <resultMap type="TeacherEntity" id="teacherResultMap">
  2. <id property="teacherID" column="TEACHER_ID" />
  3. <result property="teacherName" column="TEACHER_NAME" />
  4. <result property="teacherSex" column="TEACHER_SEX" />
  5. <result property="teacherBirthday" column="TEACHER_BIRTHDAY"/>
  6. <result property="workDate" column="WORK_DATE"/>
  7. <result property="professional" column="PROFESSIONAL"/>
  8. </resultMap>
  9. <select id="getTeacher" parameterType="String"  resultMap="teacherResultMap">
  10. SELECT *
  11. FROM TEACHER_TBL TT
  12. WHERE TT.TEACHER_ID = #{teacherID}
  13. </select>

2.1.3.2使用resultMap实现联合

与上面同样的功能,查询班级,同时查询器班主任。需在association中添加resultMap(在teacher的xml文件中定义好的),新写sql(查询班级表left join教师表),不需要teacher的select。

修改ClassMapper.xml文件部分内容:

  1. <resultMap type="ClassEntity" id="classResultMap">
  2. <id property="classID" column="CLASS_ID" />
  3. <result property="className" column="CLASS_NAME" />
  4. <result property="classYear" column="CLASS_YEAR" />
  5. <association property="teacherEntity" column="TEACHER_ID"  resultMap="teacherResultMap"/>
  6. </resultMap>
  7. <select id="getClassAndTeacher" parameterType="String" resultMap="classResultMap">
  8. SELECT *
  9. FROM CLASS_TBL CT LEFT JOIN TEACHER_TBL TT ON CT.TEACHER_ID = TT.TEACHER_ID
  10. WHERE CT.CLASS_ID = #{classID};
  11. </select>

其中的teacherResultMap请见上面TeacherMapper.xml文件部分内容中。

2.1.4 collection聚集

聚集元素用来处理“一对多”的关系。需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList);列表中对象的类型ofType(Java实体类);对应的数据库表的列名称;
不同情况需要告诉MyBatis 如何加载一个聚集。MyBatis 可以用两种方式加载:

1. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活;
2. resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。

例如,一个班级有多个学生。
首先定义班级中的学生列表属性:

  1. private List<StudentEntity> studentList;

2.1.4.1使用select实现聚集

用法和联合很类似,区别在于,这是一对多,所以一般映射过来的都是列表。所以这里需要 定义javaType为ArrayList,还需要定义列表中对象的类型ofType,以及必须设置的select的语句名称(需要注意的是,这里的查询 student的select语句条件必须是外键classID)。

ClassMapper.xml文件部分内容:

  1. <resultMap type="ClassEntity" id="classResultMap">
  2. <id property="classID" column="CLASS_ID" />
  3. <result property="className" column="CLASS_NAME" />
  4. <result property="classYear" column="CLASS_YEAR" />
  5. <association property="teacherEntity" column="TEACHER_ID"  select="getTeacher"/>
  6. <collection property="studentList" column="CLASS_ID" javaType="ArrayList" ofType="StudentEntity" select="getStudentByClassID"/>
  7. </resultMap>
  8. <select id="getClassByID" parameterType="String" resultMap="classResultMap">
  9. SELECT * FROM CLASS_TBL CT
  10. WHERE CT.CLASS_ID = #{classID};
  11. </select>

StudentMapper.xml文件部分内容:

  1. <!-- java属性,数据库表字段之间的映射定义 -->
  2. <resultMap type="StudentEntity" id="studentResultMap">
  3. <id property="studentID" column="STUDENT_ID" />
  4. <result property="studentName" column="STUDENT_NAME" />
  5. <result property="studentSex" column="STUDENT_SEX" />
  6. <result property="studentBirthday" column="STUDENT_BIRTHDAY" />
  7. </resultMap>
  8. <!-- 查询学生list,根据班级id -->
  9. <select id="getStudentByClassID" parameterType="String" resultMap="studentResultMap">
  10. <include refid="selectStudentAll" />
  11. WHERE ST.CLASS_ID = #{classID}
  12. </select>

2.1.4.2使用resultMap实现聚集

使用resultMap,就需要重写一个sql,left join学生表。

  1. <resultMap type="ClassEntity" id="classResultMap">
  2. <id property="classID" column="CLASS_ID" />
  3. <result property="className" column="CLASS_NAME" />
  4. <result property="classYear" column="CLASS_YEAR" />
  5. <association property="teacherEntity" column="TEACHER_ID"  resultMap="teacherResultMap"/>
  6. <collection property="studentList" column="CLASS_ID" javaType="ArrayList" ofType="StudentEntity" resultMap="studentResultMap"/>
  7. </resultMap>
  8. <select id="getClassAndTeacherStudent" parameterType="String" resultMap="classResultMap">
  9. SELECT *
  10. FROM CLASS_TBL CT
  11. LEFT JOIN STUDENT_TBL ST
  12. ON CT.CLASS_ID = ST.CLASS_ID
  13. LEFT JOIN TEACHER_TBL TT
  14. ON CT.TEACHER_ID = TT.TEACHER_ID
  15. WHERE CT.CLASS_ID = #{classID};
  16. </select>

其中的teacherResultMap请见上面TeacherMapper.xml文件部分内容中。studentResultMap请见上面StudentMapper.xml文件部分内容中。

2.1.5discriminator鉴别器

有时一个单独的数据库查询也许返回很多不同(但是希望有些关联)数据类型的结果集。鉴别器元素就是被设计来处理这个情况的,还有包括类的继承层次结构。鉴别器非常容易理解,因为它的表现很像Java语言中的switch语句。

定义鉴别器指定了column和javaType属性。列是MyBatis查找比较值的地方。JavaType是需要被用来保证等价测试的合适类型(尽管字符串在很多情形下都会有用)。

下面这个例子为,当classId为20000001时,才映射classId属性。

      1. <resultMap type="liming.student.manager.data.model.StudentEntity" id="resultMap_studentEntity_discriminator">
      2. <id  property="studentId"        column="STUDENT_ID" javaType="String" jdbcType="VARCHAR"/>
      3. <result property="studentName"       column="STUDENT_NAME" javaType="String" jdbcType="VARCHAR"/>
      4. <result property="studentSex"        column="STUDENT_SEX"  javaType="int" jdbcType="INTEGER"/>
      5. <result property="studentBirthday"   column="STUDENT_BIRTHDAY"  javaType="Date" jdbcType="DATE"/>
      6. <result property="studentPhoto"  column="STUDENT_PHOTO" javaType="byte[]" jdbcType="BLOB" typeHandler="org.apache.ibatis.type.BlobTypeHandler" />
      7. <result property="placeId"           column="PLACE_ID" javaType="String" jdbcType="VARCHAR"/>
      8. <discriminator column="CLASS_ID" javaType="String" jdbcType="VARCHAR">
      9. <case value="20000001" resultType="liming.student.manager.data.model.StudentEntity" >
      10. <result property="classId" column="CLASS_ID" javaType="String" jdbcType="VARCHAR"/>
      11. </case>
      12. </discriminator>
      13. </resultMap>

Mybatis ResultMap(2)的更多相关文章

  1. mybatis resultmap标签type属性什么意思

    mybatis resultmap标签type属性什么意思? :就表示被转换的对象啊,被转换成object的类型啊 <resultMap id="BaseResultMap" ...

  2. mybatis - resultMap

    resultMap有比较强大的自动映射,下面是摘自mybatis中文官网的的片段: 当自动映射查询结果时,MyBatis会获取sql返回的列名并在java类中查找相同名字的属性(忽略大小写). 这意味 ...

  3. mybatis resultMap映射学习笔记

    这几天,百度mybatis突然看不到官网了,不知道百度怎么整的.特此贴出mybatis中文官网: http://www.mybatis.org/mybatis-3/zh/index.html 一个学习 ...

  4. Mybatis resultMap空值映射问题解决

    Mybatis在使用resultMap来映射查询结果中的列,如果查询结果中包含空值的列(不是null),则Mybatis在映射的时候,不会映射这个字段,例如 查询 name,sex,age,数据库中的 ...

  5. mybatis ResultMap详解

    前言 MyBatis是基于“数据库结构不可控”的思想建立的,也就是我们希望数据库遵循第三范式或BCNF,但实际事与愿违,那么结果集映射就是MyBatis为我们提供这种理想与现实间转换的手段了,而res ...

  6. 解决:oracle+myBatis ResultMap 类型为 map 时返回结果中存在 timestamp 时使用 jackson 转 json 报错

    前言:最近在做一个通用查询单表的组件,所以 sql 的写法就是 select *,然后 resultType="map" ,然后使用 jackson @ResponseBody 返 ...

  7. mybatis resultMap 映射配置

    现有数据库表: CREATE TABLE `dept_p` ( `DEPT_ID` ) NOT NULL, `DEPT_NAME` ) DEFAULT NULL, `PARENT_ID` ) DEFA ...

  8. [Mybatis]resultMap的使用总结

    resultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中. resultMap包含的元素的相关属性解释如下: <!--column不 ...

  9. Mybatis resultMap空值映射问题

    参考博客:https://www.oschina.net/question/1032714_224673 http://stackoverflow.com/questions/22852383/how ...

随机推荐

  1. NodeJ node.js Koa2 跨域请求

    Koa2 .3 跨域请求 Haisen's  需求分析 (localhost:8080 = 前端  [请求]  localhost:8081 = 服务器 ) 1.一个前台    一个服务器    前台 ...

  2. 12种开源Web安全扫描程序

    转自:https://blog.csdn.net/wh211212/article/details/78620963 赛门铁克的一个有趣的报告显示,76%的被扫描网站有恶意软件 如果您使用的是Word ...

  3. 安装mysql zip 安装包 Navicat连接

    笔者在安装mysql时一直出现各种问题,今天难得成功一次,决定记录一下,留作纪念与参考 安装第一步,下载mysql https://dev.mysql.com/downloads/mysql/ 以在w ...

  4. meven 配置

    配置meven 自定义文件[User Settings] D:\java\apache-maven-3.5.3\conf\settings.xml settings.xml 新增两端配置信息 < ...

  5. 小工具:生成半透明背景色的 CSS 代码,不影响子元素透明度

    工具:http://leegorous.net/tools/bg-alpha.html 工具介绍:http://leegorous.net/blog/2010/07/29/generate-css-c ...

  6. Leecode刷题之旅-C语言/python-202快乐数

    /* * @lc app=leetcode.cn id=202 lang=c * * [202] 快乐数 * * https://leetcode-cn.com/problems/happy-numb ...

  7. 顺序表删除值为 x 的元素

    思路: 不要去考虑删除的字眼,要考虑如何进行保存非 x 的值 这里提供两种解法,殊途同归: 1.将其中非 x 的元素统计并保存 2.统计为 x 的元素个数,并将非 x 的元素保存 注意事项: 注意这里 ...

  8. P1803 凌乱的yyy

    P1803 凌乱的yyy 题目背景 快noip了,yyy很紧张! 题目描述 现在各大oj上有n个比赛,每个比赛的开始.结束的时间点是知道的. yyy认为,参加越多的比赛,noip就能考的越好(假的) ...

  9. android学习十二 配置变化

    1.配置变化会终止当前活动,并重建活动 2.配置变化有    2.1  屏幕方向变化    2.2  语言变化    2.3   插到基座等   3. 配置变化应用程序不会清除,上下文对新活动依然有效 ...

  10. 开发发布npm module包

    开发发布npm module包 问题 在项目开发过程中,每当进入一个新的业务项目,从零开始搭建一套前端项目结构是一件让人头疼的事情,就要重新复制一个上一个项目的前端框架和组件代码库.其中很多功能的模块 ...