mybatis中collection association优化使用及多参数传递
mybatis都会用,但要优雅的用就不是那么容易了
今天就简单举例,抛砖引玉,供大家探讨
1.主表
CREATE TABLE `test_one` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nickname` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
对应的java实体类如下(自动生成的代码,省略get set)
@JsonIgnoreProperties(ignoreUnknown = true, value = {"handler"})
public class TestOne implements Serializable {
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String nickname;
    @JsonIgnoreProperties(ignoreUnknown = true, value = {"testOne"})
    private List<TestTwo> testTwos = new LinkedList<>();
注意:JsonIgnoreProperties请忽略,这是解决对象间循环依赖在json序列化时出错的,不在本次内容中
2.从表
CREATE TABLE `test_two` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nickname` varchar(255) NOT NULL,
`one_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `test_two_ibfk_1` (`one_id`),
CONSTRAINT `test_two_ibfk_1` FOREIGN KEY (`one_id`) REFERENCES `test_one` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
对应的java实体类如下(自动生成的代码,省略get set)
@JsonIgnoreProperties(ignoreUnknown = true, value = {"handler"})
public class TestTwo implements Serializable {
    private Integer id;
    private String nickname;
    private Integer oneId;
    @JsonIgnoreProperties(ignoreUnknown = true, value = {"testTwos"})
    private TestOne testOne;
注意:JsonIgnoreProperties请忽略,这是解决对象间循环依赖在json序列化时出错的,不在本次内容中
细心的同学发现,两个表用同名字段,后续会告诉为什么这么举例,而且这种情况项目中是非常常见的
3.TestOneMapper.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="info.zycloud.xcx.merchant.dao.TestOneMapper">
<resultMap id="BaseResultMap" type="info.zycloud.xcx.merchant.model.TestOne">
<constructor>
<idArg column="id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
<arg column="nickname" javaType="java.lang.String" jdbcType="VARCHAR"/>
</constructor>
</resultMap> <!--一次查询查出collection-->
这里会一次查询就查询出主对象和关联的list对象, 查询语句是一个join语句
<resultMap id="OnceQueryBaseResultMap" type="info.zycloud.xcx.merchant.model.TestOne" extends="BaseResultMap">
<collection property="testTwos" resultMap="info.zycloud.xcx.merchant.dao.TestTwoMapper.BaseResultMap"
columnPrefix="two_"/> 由于两个表有同名字段,所以需要做区分,这里可以采用前缀,就可以共用之前的ResultMap了
</resultMap>
<select id="onceQuery4Collection" resultMap="OnceQueryBaseResultMap">
SELECT
one.*, 为什么要用*,是为了防止主表字段变了,因为这里是引用的生成的baseresultMap
two.id AS two_id,
two.nickname AS two_nickname,
two.one_id AS two_one_id
FROM
`test_one` one
LEFT JOIN test_two two ON one.id = two.one_id
</select> <!-- 多次查询查出collection-->
<resultMap id="MultipleQueryBaseResultMap" type="info.zycloud.xcx.merchant.model.TestOne" extends="BaseResultMap">
<collection property="testTwos" column="{oneId=id,nickname=nickname}" 多参数时在column中用"{}"将参数包起来, =左侧的为mapper中定义的param, =右侧为主查询的数据库字段名
select="info.zycloud.xcx.merchant.dao.TestTwoMapper.selectByOneId"/>
</resultMap> <select id="multipleQuery4Collection" parameterType="java.lang.Integer" resultMap="MultipleQueryBaseResultMap">
select
<include refid="Base_Column_List"/>
from test_one
where id = #{id,jdbcType=INTEGER}
</select> </mapper>
对应的接口定义
 public interface TestOneMapper {
     List<TestOne> onceQuery4Collection();
     TestOne multipleQuery4Collection(Integer id);
 }
3.TestTwoMapper.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="info.zycloud.xcx.merchant.dao.TestTwoMapper">
<resultMap id="BaseResultMap" type="info.zycloud.xcx.merchant.model.TestTwo">
<constructor>
<idArg column="id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
<arg column="nickname" javaType="java.lang.String" jdbcType="VARCHAR"/>
<arg column="one_id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
</constructor>
</resultMap> <select id="selectByOneId" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from test_two
where one_id=#{oneId} and nickname =#{nickname}
</select>
</mapper>
 public interface TestTwoMapper {
     List<TestTwo> selectByOneId(@Param("oneId") Integer oneId, @Param("nickname") String nickname);
 }
解释了然后我们执行看下效果:
onceQuery4Collection:

multipleQuery4Collection:

mybatis中collection association优化使用及多参数传递的更多相关文章
- Mybatis中使用association进行关联的几种方式
		
这里以一对一单向关联为例.对使用或不使用association的配置进行举例. 实体类: @Data @ToString @NoArgsConstructor public class IdCard ...
 - mybatis中collection和association的作用以及用法
		
deptDaoMapper.xml 部门对应员工(1对多的关系) <resultMap type="com.hw.entity.Dept" id="deptinfo ...
 - Mybatis中collection和association的使用区别
		
1. 关联-association2. 集合-collection 比如同时有User.java和Card.java两个类 User.java如下: public class User{ privat ...
 - Mybatis中使用association及collection进行自关联示例(含XML版与注解版)
		
XML版本: 实体类: @Data @ToString @NoArgsConstructor public class Dept { private Integer id; private Strin ...
 - Mybatis中使用association及collection进行一对多双向关联示例(含XML版与注解版)
		
XML版本: 实体类: package com.sunwii.mybatis.bean; import java.util.ArrayList; import java.util.List; impo ...
 - Mybatis中 collection 和 association 的区别
		
public class A{ private B b1; private List<B> b2;} 在映射b1属性时用association标签,(一对一的关系) 映射b2时用colle ...
 - Mybatis中 collection 和 association 的区别?
		
public class A{ private B b1; private List<B> b2;} 在映射b1属性时用association标签,(一对一的关系) 映射b2时用colle ...
 - Mybatis中collection与association的区别
		
association是多对一的关系 collection是一个一对多的关系
 - myBatis中 collection 或 association 联合查询 中column 传入多个参数值
		
下面是一个树形结构表自连接 联合查询 Demo <resultMap id="BaseResultMap" type="com.maidan.daas.entit ...
 
随机推荐
- 浅析ebtables的概念和一些基本应用
			
一.ebtables 是什么? ebtables和iptables类似,都是Linux系统下网络数据包过滤的配置工具. 为什么叫配置工具呢? 是因为他们只制定规则,具体的实施者是内核!也就是说 ...
 - deepin 15.11 安装 pyenv
			
GitHub:官方环境:https://github.com/pyenv/pyenv/wiki/Common-build-problems GitHub:官方文档:https://github.com ...
 - 「每日五分钟,玩转JVM」:线程共享区
			
前言 上一篇中,我们了解了JVM中的线程独占区,这节课我们就来了解一下JVM中的线程共享区,JVM中的线程共享区是跟随JVM启动时一起创建的,包括堆(Heap)和方法区()两部分,而线程独占区的程序计 ...
 - shell中if的各种判断
			
shell编程中使用到得if语句内判断参数 –b当file存在并且是块文件时返回真 -c当file存在并且是字符文件时返回真 -d当pathname存在并且是一个目录时返回真 -e当pathname指 ...
 - C# Memcache集群原理、客户端配置详细解析
			
概述 memcache是一套开放源的分布式高速缓存系统.由服务端和客户端组成,以守护程序(监听)方式运行于一个或多个服务器中,随时会接收客户端的连接和操作.memcache主要把数据对象缓存到内存中, ...
 - 使用SVN钩子强制提交日志和限制提交文件类型
			
Subversion本身有很好的扩展性,用户可以通过钩子实现一些自定义的功能.所谓钩子实际上是一种事件机制,当系统执行到某个特殊事件时,会触发我们预定义的动作,这样的特殊事件在Subversion里有 ...
 - 海量数据搜索---demo展示百度、谷歌搜索引擎的实现
			
在我们平常的生活工作中,百度.谷歌这些搜索网站已经成为了我们受教解惑的学校,俗话说得好,“有问题找度娘”.那么百度是如何在海量数据中找到自己需要的数据呢?为什么它搜索的速度如此之快?我们都知道是因为百 ...
 - 从入门到入土的JS 随笔day02 新手向
			
讲讲自增自减和循环语句及三元一次表达式: 一.自增自减实际上就是按照顺序来解读代码, 例如,a++;代表了a先进行了计算,运算完毕后,才进行增加: ++a呢,则是先进行了自增,值加一后再进行运算: 如 ...
 - P2774 方格取数问题 网络最大流 割
			
P2774 方格取数问题:https://www.luogu.org/problemnew/show/P2774 题意: 给定一个矩阵,取出不相邻的数字,使得数字的和最大. 思路: 可以把方格分成两个 ...
 - POJ 1182 食物链(经典并查集) (多组输入有时乱加也会错!)
			
多组输入有时乱加也会错! 这次用多组输入竟然,不用竟然对了,所以以后做题目,若是答案错误,先看加上或者删掉多组输入,看对不对 食物链 Time Limit: 1000MS Memory Lim ...