MyBatis映射文件的resultMap如何做表关联
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对象文件为,
- public class MybatisOrder {
- ....
- private Mybatiscustomer customer;
- private List<MybatisOrderItem> itemList;
- ....
- public class MybatisOrderItem {
- private MybatisOrder order;
- ...
public class MybatisOrder {
....
private Mybatiscustomer customer;
private List<MybatisOrderItem> itemList;
....
public class MybatisOrderItem {
private MybatisOrder order;
...
对应的mapper文件为:
MybatiscustomerMapper.xml:
- <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>
<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:
- <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>
<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配置.
- <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>
<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语句将关联数据取出来:
- <resultMap id="AssociationResultMap" 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"
- resultMap="com.test.mybatis.mapper.MybatiscustomerMapper.BaseResultMap"/>
- <collection property="itemList" column="ORDERID" javaType="ArrayList"
- ofType="com.test.mybatis.vo.MybatisOrderItem"
- resultMap="com.test.mybatis.mapper.MybatisOrderItemMapper.BaseResultMap"/>
- </resultMap>
- <select id="getOrderAssociation" parameterType="String" resultMap="AssociationResultMap">
- SELECT *
- FROM mybatisOrder ord LEFT JOIN mybatiscustomer customer ON ord.customerId = customer.ID
- LEFT JOIN mybatisOrderItem item ON ord.orderid = item.orderid
- WHERE ord.orderid = #{id}
- </select>
MyBatis映射文件的resultMap如何做表关联的更多相关文章
- MyBatis学习(二)、SQL语句映射文件(1)resultMap
二.SQL语句映射文件(1)resultMap SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyB ...
- MyBatis学习 之 二、SQL语句映射文件(1)resultMap
目录(?)[-] 二SQL语句映射文件1resultMap resultMap idresult constructor association联合 使用select实现联合 使用resultMap实 ...
- MyBatis映射文件 相关操作
一.MyBatis映射文件 1.简介 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行 ...
- MyBatis 映射文件
Mybatis映射文件简介 1) MyBatis 的真正强大在于它的映射语句.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉 ...
- Mybatis映射文件完整模板参照
Mybatis映射文件完整模板参照 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE map ...
- MyBatis 映射文件详解
1. MyBatis 映射文件之<select>标签 <select>用来定义查询操作; "id": 唯一标识符,需要和接口中的方法名一致; paramet ...
- Mybatis映射文件中#取值时指定参数相关规则
Mybatis映射文件中#取值时指定参数相关规则 在#{}中,除了需要的数值外,还可以规定参数的一些其他规则. 例如:javaType,jdbcType,mode(存储过程),numericScale ...
- SSM实战——秒杀系统之DAO层实体定义、接口设计、mybatis映射文件编写、整合Spring与Mybatis
一:DAO实体编码 1:首先,在src目录下,新建org.myseckill.entity包,用于存放实体类: 2:实体类设计 根据前面创建的数据库表以及映射关系,创建实体类. 表一:秒杀商品表 对应 ...
- MyBatis映射文件中用#和$传递参数的特点
在MyBatis映射文件中用#和$传递参数的特点, #是以占位符的形式来传递对应变量的参数值的,框架会对传入的参数做预编译的动作, 用$时会将传入的变量的参数值原样的传递过去,并且用$传递传递参数的时 ...
随机推荐
- js让菜单栏一直悬浮在顶部,经典代码
js让菜单栏一直悬浮在顶部,经典代码 很简单,你只需要把下面代码放到js中:$(function(){ //获取要定位元素距离浏览器顶部的距离 var na ...
- Matplotlib下载地址
http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib
- 冷门却使用的 javascript 技巧
前端已经被玩儿坏了!像用近似乱码的 javascript 拼一个图形,并且能够正常执行等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬 ...
- ios8中百度推送接收不到
ios8中百度推送接收类型会有所改变: //消息推送注冊 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) { ...
- ios 绘制wav波形图
最近研究了如何在iOS上绘制wav波形图.查了很多资料,都没能找到一个很完整的介绍,我这里总结一下一些经验. 首先需要了解wav的这3个重要指标:采样率.采样位数.声道数.下面以16KHz, 16Bi ...
- Java多线程练习
国际惯例,先贴出代码 package jiankong; import java.util.Date; public class jiankong { public static void main( ...
- lvs+keepalived+nginx+tomcat
# 拓扑如下所示 # 节点分布情况 LVS-dr-master eth0: 192.168.146.141 LVS-dr-slave eth0: 192.168.146.142 nginx1: eth ...
- C#--接口的实现
接口: 不允许使用访问修饰符,所有接口成员都是公共的. 接口成员不能包含代码体. 接口不能定义字段成员. 接口成员不能使用关键字static,vritual,abstract,sealed来定义. 类 ...
- 导出数据库中所有数据到Excle中
Workbook wb = new HSSFWorkbook();//创建工作簿 Connection conn = DataSourceUtils.getDataSource().getConnec ...
- MongoDB 介绍及Windows下安装
一.MongoDB简介 MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式.Mongo使用C++ ...