前言

有好一阵没碰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. 一篇文章教会你jQuery应用

    一 认识jQuery jQuery是JavaScript Query的缩写形式.jQuery是一款非常优秀的JavaScript库,即便是MVVM框架盛行的今天,也有超过半数的网页及应用直接或间接的使 ...

  2. Js获取宽高度的归纳集锦总结

    首先,先吓唬一下我们的小白们!在js中的描述宽高的可以细分有22种.属性根据不同的兼容性也分为五种 window.innerWidth //除去菜单栏的窗口宽度,与浏览器相关 window.inner ...

  3. 总结下var、let 和 const 的区别

    一.var变量 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  4. 信息传递 NOIP2015 day1 T2

    题文: 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一轮 ...

  5. 关于Python读写Excel

    关于Excel的读写本人最近看到一篇不错的文章话不多少直接连接https://blog.csdn.net/qq_41185868/article/details/80469355

  6. wamp server mysql数据库中事件不执行的解决办法

    先看看看event 事件是否开启 直接执行下列语句即可, show variables like '%sche%'; 如没开启,则开启. (需要数据库超级权限) set global event_sc ...

  7. MySQL学习(二)索引原理及其背后的数据结构

    首先区分几个概念: 聚集索引 主索引和辅助索引(即二级索引) innodb中每个表都有一个聚簇索引(clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引(sec ...

  8. 破阵九解:Node和浏览器之事件循环/任务队列/异步顺序/数据结构

    前言 本文内容比较长,请见谅.如有评议,还请评论区指点,谢谢大家! >> 目录 开门见山:Node和浏览器的异步执行顺序问题 两种环境下的宏任务和微任务(macrotask &&a ...

  9. drf框架接口文档

    drf框架接口文档 REST framework可以自动帮助我们生成接口文档. 接口文档以网页的方式呈现. 自动接口文档能生成的是继承自APIView及其子类的视图. 一.安装依赖 pip insta ...

  10. shark恒破解笔记3-EAX决定胜负

    PEID查壳 od载入 输入假的注册码 查找出错字符串 往上查找是否有关键跳转和关键call 可以看到此处有个je跳转 实现了跳转,并且跳过了我们注册成功的地址 网上查找这个跳转的关键call,这个c ...