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映射文件中用#和$传递参数的特点, #是以占位符的形式来传递对应变量的参数值的,框架会对传入的参数做预编译的动作, 用$时会将传入的变量的参数值原样的传递过去,并且用$传递传递参数的时 ...
随机推荐
- zeptoJS:如何像jQuery一样,让滚动变得优雅?
利用jQuery的animate() 方法,我们很容易实现滚动条的平滑滚动效果: $(function() { $('#top').click( function (e) { $('html, bod ...
- WinXP 无线提示“区域中找不到无线网络”的一种可能原因!
貌似WinXP还是无限经典,我也一直还在用,不知道哪天才会放弃.这次遇见的问题,或许也有XP爱好者也遇得见,记下点文字备忘.----------------------- 单调的切割线 ------- ...
- android屏蔽状态栏显示
framework/base/packages/SystemUI/res/layout/status_bar_expanded.xml 要屏蔽哪个设置哪个属性为: android:visibility ...
- MongoDB Connector for Hadoop
MongoDB Connector for Hadoop https://github.com/mongodb/mongo-hadoop Purpose The MongoDB Connector f ...
- 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 ...
- linux wc命令
Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项]文件... 2.命令功能: 统计指定文件中的字节数. ...
- linux/unix运行级别
在SYSTEM V 风格的UNIX系统中,系统被分为不同的运行级别,这和BSD分支的UNIX有所不同,常用的为0~6七个级别:0关机 1单用户 2不带网络的多用户 3带网络的多用户 4保留,用户可以自 ...
- OpenCV——改变图像大小
, , int interpolation=INTER_LINEAR ) dsize与fx和fy必须不能同时为零,也就是说要么dsize不为零而fx与fy同时可以为0,要么dsize为0而fx与fy不 ...
- C/C++语言中const的用法
1. const 在C和C++中的区别 C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中. 所 ...
- 《HTML5经典坦克大战》游戏(代码)
前几天粗略地学了HTML5,然后就用它写了一个<经典坦克大战>游戏. 现在想分享一下我写的代码,写得不好请大家多多指教. 给大家推荐一个网站,这个网站是为大学生而做,为方便学习编程的同学而 ...