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映射文件中用#和$传递参数的特点, #是以占位符的形式来传递对应变量的参数值的,框架会对传入的参数做预编译的动作, 用$时会将传入的变量的参数值原样的传递过去,并且用$传递传递参数的时 ...
随机推荐
- Linux 常用命令记录
1.查看磁盘空间使用情况 df -[a i m] 或更多 df -lh 2.查看目录文件占用大小 du -sh * du --max-depth=1 -lh 3.内存使用qingkuang free ...
- Zookeeper为什么总是奇数个
zookeeper有这样一个特性: [集群中只要有超过过半的机器是正常工作的,那么整个集群对外就是可用的] 也就是说如果有2个zookeeper,那么只要有1个死了zookeeper就不能用了,因为1 ...
- emacs快捷键学习(一)--Linux最强大的编辑器
emacs是一个非常强大的编辑器.经常使用的快捷键总结例如以下: 退出emacs:ctrl+x ctrl+c 移动到下一屏:ctrl+v 移动到上一屏:alt+v 将光标所在行移动到屏幕中间:ctrl ...
- StringBuffer和StringBuilder使用方法比較
StringBuffer是字符串缓冲区,是一个容器. 特点: 1,长度是可变化的. 2,能够字节操作多个数据类型. 3,终于会通过toString方法变成字符串. C create U update ...
- 【录音】Android录音--AudioRecord、MediaRecorder
Android提供了两个API用于实现录音功能:android.media.AudioRecord.android.media.MediaRecorder. 网上有很多谈论这两个类的资料.现在大致总结 ...
- Java基础知识强化35:String类之String的其他功能
1. String类的其他功能: (1)替换功能: String replace(char old, char new) String replace(String old,String new) ( ...
- sql server里一些常用的查询
查看表的创建和更改时间: select * from sys.tables 查询数据库的创建时间: select * from sys.databases where name in ('数据 ...
- CentOS下配置SMTP
在服务器上配置一个SMTP邮件服务可能是在日常工作中经常会遇到的需要,比如在做一些简单测试的时候. 配置步骤无比简单,废话不说: 1,yum -y install mail 2,编辑/etc/mail ...
- JAVA设置环境变量和在DOS下运行java程序
在学校实训的这几天,老师带着我们开始深入的复习java.这是第一天的内容哦 对于“JAVA设置环境变量和在DOS下运行java程序”,许多初学者是陌生的,但了解这个却对后期的学习很重要. http:/ ...
- js获得url的参数
网上找的一段代码,非常好用,现在难以找到原作者,但是非常感谢!/** * 获取当前URL参数值 * @param name 参数名称 * @return 参数值 */ function ...