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. [Qt]No relevant classes found.

    [Qt]No relevant classes found. 我把两个文件加入工程的时候,再编译就出现了No relevant classes found.这个bug.百度了下,找到了答案,参考链接: ...

  2. WPF中判断组合键

    1.写在主窗口,private void window_KeyDown(object sender, KeyEventArgs e) 事件中,2.如果是弹出窗口,那么在生成弹出窗口的代码中frm.Ke ...

  3. HBase总结(十二)Java API 与HBase交互实例

    HBase提供了Java Api的訪问接口,掌握这个就跟Java应用使用RDBMS时须要JDBC一样重要 import java.io.IOException; import org.apache.h ...

  4. void*指针

    C++提供了一种特殊的指针类型void*,它可以保存任何类型对象的地址: void*表明该指针与一地址值相关,但不清楚存储在此地址上的对象的类型. void*指针只支持几种有限的操作: 1)与另一个指 ...

  5. (转)jQuery验证控件jquery.validate.js使用说明+中文API

    官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery plugin: Validation 使用说明 转载 ...

  6. servlet 具体实现

    1)servlet 具体实现 1.在GenericServlet中声明了一个ServletConfig类型的成员变量,在init(ServletConfig)方法中对其进行了初始化 2.利用servl ...

  7. OpenCV——改变图像大小

    , , int interpolation=INTER_LINEAR ) dsize与fx和fy必须不能同时为零,也就是说要么dsize不为零而fx与fy同时可以为0,要么dsize为0而fx与fy不 ...

  8. q3 bsp随笔(2)

    看完了q3的port生成,以及pvs的生成 做个记录 由于q3 bsp树生成时,将场景中所有的brush平面都参与, 所以就可用bsp树的分割平面来切分port port从根节点开始,初始windin ...

  9. VS2013配合EgretVS开发简单塔防游戏

    VS2013配合EgretVS开发简单塔防游戏(1) - 环境配置 VS2013配合EgretVS开发简单塔防游戏(2) – 原型设计 VS2013配合EgretVS开发简单塔防游戏(3) – 精灵动 ...

  10. Python 番外 消息队列设计精要

    消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.当今市面上有很多主流的消息中间件,如老牌的Active ...