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. zeptoJS:如何像jQuery一样,让滚动变得优雅?

    利用jQuery的animate() 方法,我们很容易实现滚动条的平滑滚动效果: $(function() { $('#top').click( function (e) { $('html, bod ...

  2. WinXP 无线提示“区域中找不到无线网络”的一种可能原因!

    貌似WinXP还是无限经典,我也一直还在用,不知道哪天才会放弃.这次遇见的问题,或许也有XP爱好者也遇得见,记下点文字备忘.----------------------- 单调的切割线 ------- ...

  3. android屏蔽状态栏显示

    framework/base/packages/SystemUI/res/layout/status_bar_expanded.xml 要屏蔽哪个设置哪个属性为: android:visibility ...

  4. MongoDB Connector for Hadoop

    MongoDB Connector for Hadoop https://github.com/mongodb/mongo-hadoop Purpose The MongoDB Connector f ...

  5. HDU 5067-Harry And Dig Machine(DFS)

    Harry And Dig Machine Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  6. linux wc命令

    Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项]文件... 2.命令功能: 统计指定文件中的字节数. ...

  7. linux/unix运行级别

    在SYSTEM V 风格的UNIX系统中,系统被分为不同的运行级别,这和BSD分支的UNIX有所不同,常用的为0~6七个级别:0关机 1单用户 2不带网络的多用户 3带网络的多用户 4保留,用户可以自 ...

  8. OpenCV——改变图像大小

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

  9. C/C++语言中const的用法

    1. const 在C和C++中的区别     C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中. 所 ...

  10. 《HTML5经典坦克大战》游戏(代码)

    前几天粗略地学了HTML5,然后就用它写了一个<经典坦克大战>游戏. 现在想分享一下我写的代码,写得不好请大家多多指教. 给大家推荐一个网站,这个网站是为大学生而做,为方便学习编程的同学而 ...