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. myPagination5.0 分页简单实例

    记得最開始做分页採用的ThreadLocal对象,后面发现有有了更简便的方法,直接使用插件,不但简单.并且高效! 採用的版本号为myPagination5.0,可以解决client多条件无刷新动态分页 ...

  2. [ES6] WeakMap vs Map

    WeakMap: is a type of Map where only objects can be passed as keys. Primitive data type -- such are ...

  3. 设计模式(Java版)-创建型模式之简单工厂模式

    前言:这段时间在学习设计模式,本人也是小菜一枚(所以写的如果有错误的地方请大大们给予指出).这个东西也是我一直想学习的,从点点滴滴做起,记录下自己每天的领悟! 一.工厂模式的动机 在软件系统中,经常面 ...

  4. XML的DOM、SAX、DEMO4J及DEMO4J整合Path的代码例子

    1.DMO解析 package cn.itcast.xml.dom; import java.io.File; import javax.xml.parsers.DocumentBuilder; im ...

  5. IIS7的安装详解

    IIS7安装流程规范 1,   IIS常用的功能模块介绍: 1)         静态内容:可发布静态 Web 文件格式,比如 HTML 页面和图像文件. 2)         默认文档:允许您配置当 ...

  6. DNN Module - Responsive Html Tabs 3 介绍

    Responsive Html Tabs 模块可以运行于DNN7及以上版本,支持响应式.用户界面较为友好,可以插入自定义的HTML. Demo This is a user-friendly, ful ...

  7. 【socket.io研究】1.官网的一些相关说明,概述

    socket.io是什么? 官网的解释是一个实时的,基于事件的通讯框架,可以再各个平台上运行,关注于效率和速度. 在javascript,ios,android,java中都实现了,可以很好的实现实时 ...

  8. 使用angularjs中ng-repeat的$even与$odd属性时的注意事项

    JavaScript中数组的索引是从0开始的,因此我们再取奇偶的时候需要用!$even和!$odd来将$even和$odd的布尔值反转 下面给出一个实例: 使用$odd和$even来制作一个红蓝相间的 ...

  9. C# HashSet类(复杂)对象的去重

    public class Student { public string Id { get; set; } public string Name { get; set; } public overri ...

  10. 在预装win8的电脑上换win7系统讲解

    现在买电脑,如果电脑预装的系统是win8系统,那么这个电脑的默认启动模式应该就是UEFI模式,现在UEFI模式正在逐渐取代传统模式.UEFI启动需要一个独立的分区,它将系统启动文件和操作系统本身隔离, ...