前言

有好一阵没碰mybatis了,这次的项目基于性能考虑,选了mybatis,写着写着,发现有下面的需求,比如两表联查,取其中各一部分字段,怎么更方便地用vo来接,这里犯了难;

我想的是,因为这个sql联查的vo,能不能直接使用两个表的po来接呢,比如下面这种:

Users、SeatInformation都是对应了数据库两张表的po
@Data
public class UserSeatUnionQueryVO {
private Users users; private SeatInformation seatInformation;
}

折腾了2个小时,网上各种找不到类似需求,终于搞出来了,还是值得记录和分享。

一、两表关联,映射到如下类型vo(拷贝单表po属性,组合另一单表的po),怎么写

sql:


<select id="selectOnlineUserBySeatState" resultMap="UserSeatUnionQueryVOResultMap">
SELECT
u.`user_id`,u.`account_status`,s.*
FROM
users u,
seat_information s
WHERE u.`user_id` = s.`user_id`
AND u.`account_status` = 1
AND u.`delete_status` = 1
AND u.`center_id` = 0
AND s.`token` IS NOT NULL
AND s.`seat_state` = 1
AND s.delete_status = 1
</select>

假设我想映射的vo如下:

@Data
public class UserSeatUnionQueryVO { /**
* 用户Id
*/
@ApiModelProperty(value = "用户Id")
@TableId(value = "user_id", type = IdType.ID_WORKER)
private Long userId; /**
* 账号状态,-1停用,1启用
*/
@ApiModelProperty(value = "账号状态,-1停用,1启用")
private Integer accountStatus; /**
* 这里的SeatInformation是表seat_information对应的po
*/
private SeatInformation seatInformation;
}

则mapper中应该这样写:

UsersMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ceiec.cad.mapper.UsersMapper"> <!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.ceiec.cad.model.Users">
<id column="user_id" property="userId" />
<result column="account_status" property="accountStatus" />
</resultMap> <resultMap id="UserSeatUnionQueryVOResultMap" type="com.ceiec.cad.service.UserSeatUnionQueryVO">
<id column="user_id" property="userId" />
<result column="account_status" property="accountStatus" />
<association property="seatInformation" javaType="com.ceiec.cad.model.SeatInformation" resultMap="com.ceiec.cad.mapper.SeatInformationMapper.BaseResultMap"> </association> </resultMap> <select id="selectOnlineUserBySeatState" resultMap="UserSeatUnionQueryVOResultMap">
SELECT
u.`user_id`,u.`account_status`,s.*
FROM
users u,
seat_information s
WHERE u.`user_id` = s.`user_id`
AND u.`account_status` = 1
AND u.`delete_status` = 1
AND u.`center_id` = 0
AND s.`token` IS NOT NULL
AND s.`seat_state` = 1
AND s.delete_status = 1
</select>
</mapper>
SeatInformationMapper.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ceiec.cad.mapper.SeatInformationMapper"> <!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.ceiec.cad.model.SeatInformation">
<id column="seat_information_id" property="seatInformationId" />
//省略无关代码
</resultMap> </mapper>

二、两表关联,映射到如下类型vo(组合两表po),怎么写

上面的方案呢,假设A关联B,在vo里,相当于是把B组合进了A;我想的是,能不能新建一个vo,同时组合A和B呢,比如下面这样:

@Data
public class UserSeatUnionQueryVO {
private Users users; private SeatInformation seatInformation;
}

sql:

和方案一一样。

UsersMapper.xml:


<resultMap id="UserSeatUnionQueryVOResultMap" type="com.ceiec.cad.service.UserSeatUnionQueryVO">
<association property="users" javaType="com.ceiec.cad.model.Users" resultMap="com.ceiec.cad.mapper.UsersMapper.BaseResultMap"> </association>
<association property="seatInformation" javaType="com.ceiec.cad.model.SeatInformation" resultMap="com.ceiec.cad.mapper.SeatInformationMapper.BaseResultMap"> </association> </resultMap>

注意这里的 association元素中的resultMap字段,引用了其他Mapper文件的BaseResultMap

格式是:其他Mapper文件的namespace,加上resultMap的名字。

这里附上SeatInformationMapper.xml的内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ceiec.cad.mapper.SeatInformationMapper"> <!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.ceiec.cad.model.SeatInformation">
<id column="seat_information_id" property="seatInformationId" />
//省略无关
</resultMap> </mapper>

下面附上完整的usersMapper.xml的内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ceiec.cad.mapper.UsersMapper"> <!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.ceiec.cad.model.Users">
<id column="user_id" property="userId" />
<result column="account_status" property="accountStatus" />
</resultMap> <resultMap id="UserSeatUnionQueryVOResultMap" type="com.ceiec.cad.service.UserSeatUnionQueryVO">
<association property="users" javaType="com.ceiec.cad.model.Users" resultMap="com.ceiec.cad.mapper.UsersMapper.BaseResultMap"> </association>
<association property="seatInformation" javaType="com.ceiec.cad.model.SeatInformation" resultMap="com.ceiec.cad.mapper.SeatInformationMapper.BaseResultMap"> </association> </resultMap> <select id="selectOnlineUserBySeatState" resultMap="UserSeatUnionQueryVOResultMap">
SELECT
u.*,s.*
FROM
users u,
seat_information s
WHERE u.`user_id` = s.`user_id`
AND u.`account_status` = 1
AND u.`delete_status` = 1
AND u.`center_id` = 0
AND s.`token` IS NOT NULL
AND s.`seat_state` = 1
AND s.delete_status = 1
</select>
</mapper>

展示下效果:

可以看到,最后这种,这么写没问题。

三、官网文档

我在官网看了半天,后来才找到类似的例子:

https://mybatis.org/mybatis-3/sqlmap-xml.html

因为文档很长,上面这个图,大家可以通过打开上面的网址后,搜索 Multiple ResultSets for Association到达该位置。

Mybatis中多表关联时,怎么利用association优雅写resultMap来映射vo的更多相关文章

  1. MyBatis 中两表关联查询MYSQL (14)

    MyBatis 中两表关联查询MYSQL 1.创建数据库表语句 2.插入测试数据 3.pom文件内容 <?xml version="1.0" encoding="U ...

  2. RDIFramework.NET 中多表关联查询分页实例

    RDIFramework.NET 中多表关联查询分页实例 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案.该框架以SOA范式作为 ...

  3. Mybatis中多表联查,查询出来的字段出现重名,造成数据异常的解决方法!

    在做一对多出现的问题,引发的思考:当数据库表中,主表的主键id和明细表的中的字段名相同时怎么办?Mybatis进行自动映射赋值的时候会不会出现异常?                      注意:M ...

  4. fastadmin中关联表时A为主表,想让B表和C表关联时怎么办?

    $sql = Db::connect('数据库')->table('C表')->where('status', 'normal')->field('字段 别称[不可与其他表重复]') ...

  5. MyBatis之多表关联查询

    1使用resultType.ResultMap处理返回结果 处理返回结果 resultType:指定返回值结果的完全限定名,处理多表查询的结果. 多表查询需要定义vo封装查询的结果. 需求:查询部门和 ...

  6. Mybatis 中在传参时,${} 和#{} 的区别

    介绍 MyBatis中使用parameterType向SQL语句传参,parameterType后的类型可以是基本类型int,String,HashMap和java自定义类型. 在SQL中引用这些参数 ...

  7. Yii2中多表关联查询(hasOne、hasMany、join、joinwith)

    表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order      (id  order_name  customer_id ...

  8. Mybatis中分表插件shardbatis使用说明

    Mybatis中实现分表,有个很简单的插件,叫shardbatis,使用maven构建的工程,可以在pom.xml中添加依赖性即可: <!-- 分库分表插件 --> <depende ...

  9. EF4中多表关联查询Include的写法

    大家好,好久没有写作了,最近遇到了个问题,最终是靠自己的尝试写出来的,希望可以帮到有需要的人. 在我们查询时通常会遇到多级表关联的情况,很多时候有人会想写一个from LINQ语句来解决,那么冗长的代 ...

随机推荐

  1. day 23

    目录 面向对象总复习 面向对象总复习 面向过程编程思想: ​ 核心是过程,过程指的是做事情的步骤,即先干什么再干什么. ​ 基于该编程思想编程,就好比一条流水线,一种机械式的思维方式. 面向对象编程思 ...

  2. Java8 Period.between方法坑及注意事项

    在使用Java8 新特性中关于Period.between的方法时需注意该方法获取日期的区间问题. @Test public void test1(){ LocalDate from = LocalD ...

  3. 用java求整数和

    public class JavaAppArguments {      /**      * @param args     */       public static void main(Str ...

  4. python程序调用C/C++代码

    这篇用来记录在些模拟Canoe生成CAN数据桢工具时遇到的问题, 生成CAN数据桢,主要分为两个关注点: 1.如何从can信号名获取到can信号的ID长度以及信号的起始位,并将信号值按照一定的规则填写 ...

  5. pycharm 安装第三方包步骤

    pycharm 安装第三方包步骤: 完成.

  6. 实验吧之【who are you?】(时间盲注)补充

    第二种方法 使用brup进行盲注  也是一个道理 不多贴了 这里提一下  burp怎么判断超时 Options->Connections->Tiimeouts->Normal这一空 ...

  7. Javascript之傻傻理不清的原型链、prototype、__proto__

    新人学习Javascript,其中的原型链一直是云里雾里,不得要领,查了很多相关资料,觉得这遍讲得最为清晰易懂,特转载分享,共同学习. 1. JavaScript内置对象 所谓的内置对象 指的是:Ja ...

  8. Twitter-Snowflake:自增ID算法

    简介 Twitter 早期用 MySQL 存储数据,随着用户的增长,单一的 MySQL 实例没法承受海量的数据,后来团队就研究如何产生完美的自增ID,以满足两个基本的要求: 每秒能生成几十万条 ID ...

  9. javascript学习总结之对象的深拷贝和浅拷贝

    前言 最近在写ES6的文章的时候发现重复遇到关于javascript深拷贝和浅拷贝的问题,然后查找了一些资料,根据资料和自己的理解做了以下笔记,毕竟javascript关于深拷贝和浅拷贝的问题在一些面 ...

  10. Vue系列---源码调试(二)

    我们要对Vue源码进行分析,首先我们需要能够对vue源码进行调式(这里的源码调式是ES6版本的,不是打包后的代码),因此首先我们要去官方github上克隆一份vue项目下来,如下具体操作: 1. cl ...