记录下mybatis的集合查询中碰到的问题
描述下场景,比如一个人有多个qq号(假设一个人可以有重复的qq号)
数据库结构,有两张表:
people表
id | name |
1 | jack |
people_qq表
id | people_id | |
1 | 1 | 123456 |
2 | 1 | 234567 |
3 | 1 | 456789 |
4 | 1 | 123456 |
实体类:
import java.io.Serializable; import java.util.List; public class People implements Serializable{ private static final long serialVersionUID = -5935066186174346694L; private Long id; private String name; private List<String> qqs; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<String> getQqs() { return qqs; } public void setQqs(List<String> qqs) { this.qqs = qqs; } @Override public String toString() { return "People [id=" + id + ", name=" + name + ", qqs=" + qqs + "]"; } }
mapper接口:
import com.hnpicheng.mybatisissue.domain.People; public interface PeopleMapper { People selectPeopleById( Long id); }
测试代码:
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.hnpicheng.mybatisissue.domain.People; import com.hnpicheng.mybatisissue.mapper.PeopleMapper; public class App { public static void main( String[] args ) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-mybatis.xml"); PeopleMapper peopleMapper = context.getBean(PeopleMapper.class); People p = peopleMapper.selectPeopleById(1L); System.out.println(p); } }
PeopleMapper.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.hnpicheng.mybatisissue.mapper.PeopleMapper"> <resultMap id="peopleResultMap" type="People"> <id property="id" column="id" /> <result property="name" column="name" /> <collection property="qqs" ofType="string" javaType="list"> <result column="qq" /> </collection> </resultMap> <select id="selectPeopleById" resultMap="peopleResultMap"> select p.*,pq.qq from people p left join people_qq pq on p.id = pq.people_id where p.id = #{id} </select> </mapper>
测试结果,优点只要查一次,对于需要排重的查询业务,可以用这个方法:
DEBUG [main] - ==> Preparing: select p.*,pq.qq from people p left join people_qq pq on p.id = pq.people_id where p.id = ? DEBUG [main] - ==> Parameters: 1(Long) DEBUG [main] - <== Total: 4 People [id=1, name=jack, qqs=[123456, 234567, 456789]]
若果需要将重复数据查询出来,那么可以使用以下配置
<?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.hnpicheng.mybatisissue.mapper.PeopleMapper"> <resultMap id="peopleResultMap" type="People"> <id property="id" column="id" /> <result property="name" column="name" /> <collection property="qqs" column="id" select="selectQQByPeopleId"> <result column="qq" /> </collection> </resultMap> <select id="selectPeopleById" resultMap="peopleResultMap"> select * from people where id = #{id} </select> <select id="selectQQByPeopleId" resultType="string"> select qq from people_qq where people_id = #{id} </select> </mapper>
测试结果:
DEBUG [main] - ==> Preparing: select * from people where id = ? DEBUG [main] - ==> Parameters: 1(Long) DEBUG [main] - <== Total: 1 DEBUG [main] - ==> Preparing: select qq from people_qq where people_id = ? DEBUG [main] - ==> Parameters: 1(Long) DEBUG [main] - <== Total: 4 People [id=1, name=jack, qqs=[123456, 234567, 456789, 123456]]
附件中有项目源码
相关推荐
### Mybatis高级-resultMap之collection聚集 在MyBatis中,`collection`元素主要用于处理一对多的关系映射问题。本文将通过一个具体的示例来详细解释如何利用MyBatis的`collection`元素来实现一对多的数据关联。 #...
"Mybatis中Collection集合标签的使用详解" Mybatis是一款流行的持久层框架,它提供了多种方式来实现数据的持久化操作。在Mybatis中,Collection集合标签是其中一个非常重要的组件,它可以帮助开发者快速实现复杂的...
MyBatis 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis ...
MyBatis 动态插入 List 传入 List 参数的实例代码详解 MyBatis 是一款优秀的 ORM 工具,提供了许多实用的功能,其中之一便是动态插入 List,下面我们将通过实例代码详解 MyBatis 动态插入 List 传入 List 参数的...
在MyBatis中,处理集合参数如list、array以及map是非常常见的操作。这些参数通常用于构建动态SQL,特别是当需要在`IN`语句中使用多个值时。下面将详细解释如何在MyBatis中使用这些参数类型。 1. **List参数**: 当...
<foreach item="fund" collection="list"> (#{fund.id}, #{fund.fundName}, #{fund.fundCode}, #{fund.dateX}, #{fund.dataY}, #{fund.remarks}, #{fund.createBy}, #{fund.createDate}, #{fund.updateBy}, #{fund...
<foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} ``` 调用时传入List类型的参数: ```java List<Integer> ids = Arrays.asList(1, 2, 3); List<User> ...
在Mybatis中,可以通过在映射文件中定义`<collection>`元素来处理这种关系。`<collection>`元素通常包含`property`(映射实体类的属性名)、`select`(用于获取子记录的SQL语句ID)等属性。 2. **多对一关联**: ...
在MyBatis中,`<foreach>`标签是一个非常重要的元素,它主要用于动态SQL语句的构建,尤其是在处理集合数据类型如List、Array、Map时。`<foreach>`标签的使用可以极大地提高代码的可读性和可维护性,避免了传统的字符...
<foreach collection="list" item="obj" index="index" separator=","> (#{obj.id},#{obj.account},#{obj.password},#{obj.active},#{obj.status},#{obj.name},#{obj.gender},#{obj.active_date}, #{obj.expiry_...
在MyBatis的映射XML文件中,`<collection>`标签用于表示一对多的关系,它允许我们在一次查询中获取到一个对象的所有子对象,从而构建出树形结构。例如,如果我们有一个`Department`实体类,其中包含一个`List...
在 MyBatis 中,association 和 collection 是用于处理复杂结果集的重要工具。 * association:用于处理一个对象中包含另一个对象的情况,可以使用级联属性或 association 标签来封装结果集。 * collection:用于...
<foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} ``` `foreach`标签用于遍历`list`中的元素,并生成相应的`in`子句。 #### 五、多参数传递之注解方式 ...
<foreach collection="list" item="employees" separator=","> (#{employees.name}, #{employees.organizationId}, #{employees.positionId}) ``` 2. Employees 表操作接口 在 Employees 表操作接口中,...
在处理复杂数据传输时,MyBatis 提供了处理 List 和 Array 类型参数的方法。本文将详细讲解如何在 MyBatis 中实现通过 List 或 Array 传递参数来执行查询操作。 首先,当查询的参数只有一个,如一个 List<Long> 或 ...
List<InstanceModel> getInstanceModel(@Param("paramSQL") String sql); } ``` 3. **注意事项**: - **传入的SQL字符串**:必须按照"MyBatis能识别的格式"编写,如"select XXX as instanceid, XXX as instance...
如果希望延迟加载,可以在`<collection>`标签中设置`fetchType="lazy"`,但这需要MyBatis的二级缓存支持。 五、性能优化 1. 分页查询:在一对多映射中,如果从表数据量大,应考虑使用分页查询以减少内存消耗。 2. ...
public String listStudents(Model model) { List<Student> students = studentService.getAllStudents(); model.addAttribute("students", students); return "students"; } ``` 通过上述步骤,你就可以在...
public List<UserInfo> selectList(List<String> userIds); ``` 在XML中,可以使用foreach循环来遍历List中的每个元素: ```xml <select id="selectList" resultMap="BaseResultMap"> select * from user_info...