前言

有好一阵没碰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. # Ubuntu16.04安装nvidia驱动+CUDA+cuDNN

    Ubuntu16.04安装nvidia驱动+CUDA+cuDNN 准备工作 1.查看GPU是否支持CUDA lspci | grep -i nvidia 2.查看Linux版本 uname -m &a ...

  2. python 基本排序算法

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/9/15 下午5:06 # @Author : lb # @File : so ...

  3. 运维自动化神器ansible之user模块

    运维自动化神器ansible之user模块 一.概述   user模块 可管理远程主机上的 用户,比如创建用户.修改用户.删除用户.为用户创建密钥对等操作. 二.参数介绍   name: 用于指定操作 ...

  4. SpringBoot系列教程web篇之过滤器Filter使用指南扩展篇

    前面一篇博文介绍了在 SpringBoot 中使用 Filter 的两种使用方式,这里介绍另外一种直接将 Filter 当做 Spring 的 Bean 来使用的方式,并且在这种使用方式下,Filte ...

  5. margin与padding的区别与用法—以及出现bug的解决方法

    margin(外边距) padding(内边距)   一.语法结构 (1)margin-left:10px; 左外边距 (2)margin-right:10px; 右外边距 (3)margin-top ...

  6. c++11::std::remove_reference

    引用移除 : remove_reference 引用折叠规则 A& & 折叠成 A&  A& && 折叠成 A&  A&& &a ...

  7. 【译】Source Maps浅析

    Time:2019/10/27~2019/10/29 Link: 原文链接 译文开始: 对网站进行性能优化对一个最容易的方法就是把JS和CSS进行打包压缩.但是当你需要调试这些压缩文件中的代码的时候, ...

  8. Mybaits 源码解析 (五)----- 面试源码系列:Mapper接口底层原理(为什么Mapper不用写实现类就能访问到数据库?)

    刚开始使用Mybaits的同学有没有这样的疑惑,为什么我们没有编写Mapper的实现类,却能调用Mapper的方法呢?本篇文章我带大家一起来解决这个疑问 上一篇文章我们获取到了DefaultSqlSe ...

  9. Spring Cloud Feign初接触

    最近想使用下Feign,然后简单了解了一下,简单的搭了个demo. 首先简单介绍一下Feign,它是一个Http请求客户端,类似HttpClient,具体里面实现还没去看,知道它是一个请求客户端就行, ...

  10. Unity调用Android

    1.Unity调用Android 根据unity用户手册,unity可以采用native code(c/c++),但是也提供了C#调用方法,本文对此进行简单讲解. 2.Unity获取android类 ...