MyBatis的核心是其映射文件,SqlMap文件,里面配置了项目中用到了什么SQL语句,和数据库相关的逻辑都在这个映射文件里.顾名思义,映射文件就是对Java对象和SQL的映射.这里简单介绍一下映射文件中resultMap的用法:resultMap – 它描述如何将结果集映射到Java对象.
resultMap属性:type为java实体类;id为此resultMap的标识:<resultMap id="BaseResultMap" type="com.test.mybatis.vo.MybatisOrder" >

resultMap的子元素:

id – 一般对应到数据库中该行的ID,设置此项可以提高Mybatis性能.

result – 映射到JavaBean 的某个"简单类型"属性,String,int等.

association – 映射到JavaBean 的某个"复杂类型"属性,其他JavaBean类.

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

比如现在有一个Order表,Customer表和OrderItem表,它们之间的关系为:一个Order关联到一个Customer(单向关联),一个Order有多个OrderItem(双向关联).

对应的Java对象文件为,

  1. public class MybatisOrder {
  2. ....
  3. private Mybatiscustomer customer;
  4. private List<MybatisOrderItem> itemList;
  5. ....
  6. public class MybatisOrderItem {
  7. private MybatisOrder order;
  8. ...
public class MybatisOrder {
....
private Mybatiscustomer customer;
private List<MybatisOrderItem> itemList;
....
public class MybatisOrderItem {
private MybatisOrder order;
...

对应的mapper文件为:
MybatiscustomerMapper.xml:

  1. <resultMap id="AssociationSelectMap" type="com.test.mybatis.vo.MybatisOrder" >
  2. <id column="ORDERID" property="orderid" jdbcType="DECIMAL" />
  3. <result column="ORDERTYPE" property="ordertype" jdbcType="VARCHAR" />
  4. <result column="ORDERDATE" property="orderdate" jdbcType="DATE" />
  5. <association property="customer" column="CUSTOMERID"
  6. select="com.test.mybatis.mapper.MybatiscustomerMapper.getCustomerByID"/>
  7. <collection property="itemList" column="ORDERID" javaType="ArrayList" ofType="MybatisOrderItem"
  8. select="com.test.mybatis.mapper.MybatisOrderItemMapper.selectItemsByOrderID"/>
  9. </resultMap>
  10. <select id="getOrderByID" resultMap="AssociationSelectMap" parameterType="java.math.BigDecimal" >
  11. select *from MYBATISORDER where ORDERID = #{orderid,jdbcType=DECIMAL}
  12. </select>
<resultMap id="AssociationSelectMap" type="com.test.mybatis.vo.MybatisOrder" >
<id column="ORDERID" property="orderid" jdbcType="DECIMAL" />
<result column="ORDERTYPE" property="ordertype" jdbcType="VARCHAR" />
<result column="ORDERDATE" property="orderdate" jdbcType="DATE" />
<association property="customer" column="CUSTOMERID"
select="com.test.mybatis.mapper.MybatiscustomerMapper.getCustomerByID"/>
<collection property="itemList" column="ORDERID" javaType="ArrayList" ofType="MybatisOrderItem"
select="com.test.mybatis.mapper.MybatisOrderItemMapper.selectItemsByOrderID"/>
</resultMap>
<select id="getOrderByID" resultMap="AssociationSelectMap" parameterType="java.math.BigDecimal" >
select *from MYBATISORDER where ORDERID = #{orderid,jdbcType=DECIMAL}
</select>

MybatisOrderItemMapper.xml:

  1. <resultMap id="AssociationMap" type="com.test.mybatis.vo.MybatisOrderItem" >
  2. <id column="ITEMID" property="itemid" jdbcType="DECIMAL" />
  3. <result column="ITEMTYPE" property="itemtype" jdbcType="VARCHAR" />
  4. <result column="ITEMQUANTITY" property="itemquantity" jdbcType="VARCHAR" />
  5. <result column="ITEMCOST" property="itemcost" jdbcType="VARCHAR" />
  6. <association property="order" column="ORDERID"
  7. select="com.test.mybatis.mapper.MybatisOrderMapper.getOrderByID"/>
  8. </resultMap>
  9. <select id="selectItemByID" resultMap="AssociationMap" parameterType="java.math.BigDecimal" >
  10. select *from MYBATISORDERITEMwhere ITEMID = #{itemid,jdbcType=DECIMAL}
  11. </select>
  <resultMap id="AssociationMap" type="com.test.mybatis.vo.MybatisOrderItem" >
<id column="ITEMID" property="itemid" jdbcType="DECIMAL" />
<result column="ITEMTYPE" property="itemtype" jdbcType="VARCHAR" />
<result column="ITEMQUANTITY" property="itemquantity" jdbcType="VARCHAR" />
<result column="ITEMCOST" property="itemcost" jdbcType="VARCHAR" />
<association property="order" column="ORDERID"
select="com.test.mybatis.mapper.MybatisOrderMapper.getOrderByID"/>
</resultMap>
<select id="selectItemByID" resultMap="AssociationMap" parameterType="java.math.BigDecimal" >
select *from MYBATISORDERITEMwhere ITEMID = #{itemid,jdbcType=DECIMAL}
</select>

MybatiscustomerMapper.xml:因为不和别的表做关联,只有简单的id,result配置.

  1. <resultMap id="BaseResultMap" type="com.test.mybatis.vo.Mybatiscustomer" >
  2. <id column="ID" property="id" jdbcType="DECIMAL" />
  3. <result column="NAME" property="name" jdbcType="VARCHAR" />
  4. </resultMap>
  5. <select id="getCustomerByID" resultMap="BaseResultMap" parameterType="java.math.BigDecimal" >
  6. select *from MYBATISCUSTOMER where ID = #{id,jdbcType=DECIMAL}
  7. </select>
  <resultMap id="BaseResultMap" type="com.test.mybatis.vo.Mybatiscustomer" >
<id column="ID" property="id" jdbcType="DECIMAL" />
<result column="NAME" property="name" jdbcType="VARCHAR" />
</resultMap>
<select id="getCustomerByID" resultMap="BaseResultMap" parameterType="java.math.BigDecimal" >
select *from MYBATISCUSTOMER where ID = #{id,jdbcType=DECIMAL}
</select>

MybatisOrderMapper的getOrderByID会先从MYBATISORDER取数据,然后根据CUSTOMERID调用MybatiscustomerMapper.getCustomerByID,然后根据ORDERID调用MybatisOrderItemMapper.selectItemsByOrderID,对应每一条MYBATISORDER数据,都会分别访问另外两个表各一次.
通过将association和collection的select功能替换为resultMap,再用join方式的SQL可以用一条SQL语句将关联数据取出来:

  1. <resultMap id="AssociationResultMap" type="com.test.mybatis.vo.MybatisOrder" >
  2. <id column="ORDERID" property="orderid" jdbcType="DECIMAL" />
  3. <result column="ORDERTYPE" property="ordertype" jdbcType="VARCHAR" />
  4. <result column="ORDERDATE" property="orderdate" jdbcType="DATE" />
  5. <association property="customer" column="CUSTOMERID"
  6. resultMap="com.test.mybatis.mapper.MybatiscustomerMapper.BaseResultMap"/>
  7. <collection property="itemList" column="ORDERID" javaType="ArrayList"
  8. ofType="com.test.mybatis.vo.MybatisOrderItem"
  9. resultMap="com.test.mybatis.mapper.MybatisOrderItemMapper.BaseResultMap"/>
  10. </resultMap>
  11. <select id="getOrderAssociation" parameterType="String" resultMap="AssociationResultMap">
  12. SELECT *
  13. FROM mybatisOrder ord LEFT JOIN mybatiscustomer customer ON ord.customerId = customer.ID
  14. LEFT JOIN mybatisOrderItem item ON ord.orderid = item.orderid
  15. WHERE ord.orderid = #{id}
  16. </select>

MyBatis映射文件的resultMap如何做表关联的更多相关文章

  1. MyBatis学习(二)、SQL语句映射文件(1)resultMap

    二.SQL语句映射文件(1)resultMap SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyB ...

  2. MyBatis学习 之 二、SQL语句映射文件(1)resultMap

    目录(?)[-] 二SQL语句映射文件1resultMap resultMap idresult constructor association联合 使用select实现联合 使用resultMap实 ...

  3. MyBatis映射文件 相关操作

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

  4. MyBatis 映射文件

    Mybatis映射文件简介 1) MyBatis 的真正强大在于它的映射语句.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉 ...

  5. Mybatis映射文件完整模板参照

    Mybatis映射文件完整模板参照 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE map ...

  6. MyBatis 映射文件详解

    1. MyBatis 映射文件之<select>标签 <select>用来定义查询操作; "id": 唯一标识符,需要和接口中的方法名一致; paramet ...

  7. Mybatis映射文件中#取值时指定参数相关规则

    Mybatis映射文件中#取值时指定参数相关规则 在#{}中,除了需要的数值外,还可以规定参数的一些其他规则. 例如:javaType,jdbcType,mode(存储过程),numericScale ...

  8. SSM实战——秒杀系统之DAO层实体定义、接口设计、mybatis映射文件编写、整合Spring与Mybatis

    一:DAO实体编码 1:首先,在src目录下,新建org.myseckill.entity包,用于存放实体类: 2:实体类设计 根据前面创建的数据库表以及映射关系,创建实体类. 表一:秒杀商品表 对应 ...

  9. MyBatis映射文件中用#和$传递参数的特点

    在MyBatis映射文件中用#和$传递参数的特点, #是以占位符的形式来传递对应变量的参数值的,框架会对传入的参数做预编译的动作, 用$时会将传入的变量的参数值原样的传递过去,并且用$传递传递参数的时 ...

随机推荐

  1. C#request 请求响应

    /// <summary> /// 提交POST请求 /// </summary> /// <param name="url">提交地址< ...

  2. lesson6:jmeter和badboy配合使用

    由于jmeter不支持脚本的录制,只能手动设置,在某些集成型的压力测试时,使用不是很方便,这时可以和badboy一起配合使用,badboy支持网页操作的录制功能,并能把录制的操作导出为jmeter的脚 ...

  3. assertion的语法和语义

    .1) 语法表示 在语法上,为了支持assertion,Java增加了一个关键字assert.它包括两种表达式,分别如下: assert expression1; assert expression1 ...

  4. oracle递归函数

    oracle start with connect by 使用方法 oracle中 connect by prior 递归算法  Oracle中start with...connect by prio ...

  5. jquery之onchange事件

    $(function(){ $("#opreateHtml").window("close"); $("#deliveryGrid").da ...

  6. for-of循环

    /* 1. 遍历数组 2. 遍历Set 3. 遍历Map 4. 遍历字符串 5. 遍历伪数组 6. 可迭代的对象 */var arr = [2,3,4];for(let ele of arr) { c ...

  7. DataGrid简单数据绑定实例2

    1.Image列显示: 后台绑定: //获取文件夹下的图片 string path = @"K:\Picture\jpg"; private void Button_Click(o ...

  8. Oracle 分区表中索引失效

    当对分区表进行 一些操作时,会造成索引失效. 当有truncate/drop/exchange 操作分区  时全局索引 会失效. exchange 的临时表没有索引,或者有索引,没有用includin ...

  9. div+css不间断滚动字幕

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  10. uva 498 - Polly the Polynomial

    UVa 498: Polly the Polynomial | MathBlog #include <cstdio> #include <cstdlib> using name ...