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. JS(二)

    对象里面的属性和方法比较多啊,不容易记住,需要多实践: 1.将一串字符串的顺序颠倒,并实现首尾字母大写的两种方法: <!DOCTYPE html> <html lang=" ...

  2. js让菜单栏一直悬浮在顶部,经典代码

    js让菜单栏一直悬浮在顶部,经典代码 很简单,你只需要把下面代码放到js中:$(function(){                //获取要定位元素距离浏览器顶部的距离        var na ...

  3. javascript中this、apply、call、bind的用法和区别

    参考阮一峰文章链接:http://javascript.ruanyifeng.com/oop/basic.html#toc10

  4. chrome devtools 实用快捷键

    Ctrl + O:查找资源,非常使用 Ctrl + Shift + C:切换审查元素模式与浏览器窗口模式 Ctrl + Shift + F:在源代码中搜索 Ctrl + G:跳转到指定行

  5. Eclipse设置保存时自动给变量加final

    也是针对checkstyle的,在代码检查规范时,所有的变量必须是final.为了解决这个问题,通过以下的设置可以在eclipse保存时,自动给没有加final的变量加上final. Window-& ...

  6. 自定义listView添加滑动删除功能

    今天研究了一下android里面的手势,结合昨天学习的自定义View,做了一个自定义的listview,继承自listView,添加了条目的滑动手势操作,滑动后出现一个删除按钮,点击删除按钮,触发一个 ...

  7. [转载]ios app 发布遇到的问题uinewsstandapp=true

    原文地址:ios app 发布遇到的问题uinewsstandapp=true 作者:Capacity To include newsstand features, the info.plist mu ...

  8. [Angular 2] Using Array ...spread to enforce Pipe immutability

    Pipes need a new reference or else they will not update their output. In this lesson you will use th ...

  9. exit和abort都是用来终止程序的函数

    exit会做一些释放工作:释放所有的静态的全局的对象,缓存,关掉所有的I/O通道,然后终止程序.如果有函数通过atexit来注册,还会调用注册的函数.不过,如果atexit函数扔出异常的话,就会直接调 ...

  10. C++类的const成员函数、默认的构造函数、复制形参调用函数(转)

    C++类的const成员函数 double Sales_item::avg_price() const { } const关键字表明这是一个const成员函数,它不可以修改Sales_item类的成员 ...