`
jaychang
  • 浏览: 736601 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类
最新评论

mybatis collection list string

 
阅读更多

 记录下mybatis的集合查询中碰到的问题

 描述下场景,比如一个人有多个qq号(假设一个人可以有重复的qq号)

 

数据库结构,有两张表:

people表

id name
1 jack

people_qq表

id people_id qq
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]]

 

附件中有项目源码

分享到:
评论
1 楼 GGGGeek 2017-09-26  
找了一会儿,感觉mybatis应该没有这种操作,直到发现博主的博客

相关推荐

    Mybatis高级-resultMap之collection聚集

    ### Mybatis高级-resultMap之collection聚集 在MyBatis中,`collection`元素主要用于处理一对多的关系映射问题。本文将通过一个具体的示例来详细解释如何利用MyBatis的`collection`元素来实现一对多的数据关联。 #...

    Mybatis中Collection集合标签的使用详解

    "Mybatis中Collection集合标签的使用详解" Mybatis是一款流行的持久层框架,它提供了多种方式来实现数据的持久化操作。在Mybatis中,Collection集合标签是其中一个非常重要的组件,它可以帮助开发者快速实现复杂的...

    springmybatis

    MyBatis 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis ...

    mybatis动态插入list传入List参数的实例代码

    MyBatis 动态插入 List 传入 List 参数的实例代码详解 MyBatis 是一款优秀的 ORM 工具,提供了许多实用的功能,其中之一便是动态插入 List,下面我们将通过实例代码详解 MyBatis 动态插入 List 传入 List 参数的...

    MyBatis传入集合 list 数组 map参数的写法

    在MyBatis中,处理集合参数如list、array以及map是非常常见的操作。这些参数通常用于构建动态SQL,特别是当需要在`IN`语句中使用多个值时。下面将详细解释如何在MyBatis中使用这些参数类型。 1. **List参数**: 当...

    mybatis 批量将list数据插入到数据库的实现

    &lt;foreach item="fund" collection="list"&gt; (#{fund.id}, #{fund.fundName}, #{fund.fundCode}, #{fund.dateX}, #{fund.dataY}, #{fund.remarks}, #{fund.createBy}, #{fund.createDate}, #{fund.updateBy}, #{fund...

    Mybatis多参数查询与列表查询不同方式实现

    &lt;foreach item="item" index="index" collection="list" open="(" separator="," close=")"&gt; #{item} ``` 调用时传入List类型的参数: ```java List&lt;Integer&gt; ids = Arrays.asList(1, 2, 3); List&lt;User&gt; ...

    mybatis关联查询问题(一对多、多对一)

    在Mybatis中,可以通过在映射文件中定义`&lt;collection&gt;`元素来处理这种关系。`&lt;collection&gt;`元素通常包含`property`(映射实体类的属性名)、`select`(用于获取子记录的SQL语句ID)等属性。 2. **多对一关联**: ...

    测试mybatis里foreach用法

    在MyBatis中,`&lt;foreach&gt;`标签是一个非常重要的元素,它主要用于动态SQL语句的构建,尤其是在处理集合数据类型如List、Array、Map时。`&lt;foreach&gt;`标签的使用可以极大地提高代码的可读性和可维护性,避免了传统的字符...

    MyBatis批量插入Update

    &lt;foreach collection="list" item="obj" index="index" separator=","&gt; (#{obj.id},#{obj.account},#{obj.password},#{obj.active},#{obj.status},#{obj.name},#{obj.gender},#{obj.active_date}, #{obj.expiry_...

    mybatis 父子级树形结构查询

    在MyBatis的映射XML文件中,`&lt;collection&gt;`标签用于表示一对多的关系,它允许我们在一次查询中获取到一个对象的所有子对象,从而构建出树形结构。例如,如果我们有一个`Department`实体类,其中包含一个`List...

    mybatis知识点.docx

    在 MyBatis 中,association 和 collection 是用于处理复杂结果集的重要工具。 * association:用于处理一个对象中包含另一个对象的情况,可以使用级联属性或 association 标签来封装结果集。 * collection:用于...

    MyBatis传入多个参数的问题

    &lt;foreach item="item" index="index" collection="list" open="(" separator="," close=")"&gt; #{item} ``` `foreach`标签用于遍历`list`中的元素,并生成相应的`in`子句。 #### 五、多参数传递之注解方式 ...

    Mybatis实现多表联合查询和批量插入

    &lt;foreach collection="list" item="employees" separator=","&gt; (#{employees.name}, #{employees.organizationId}, #{employees.positionId}) ``` 2. Employees 表操作接口 在 Employees 表操作接口中,...

    Mybatis 传输List的实现代码

    在处理复杂数据传输时,MyBatis 提供了处理 List 和 Array 类型参数的方法。本文将详细讲解如何在 MyBatis 中实现通过 List 或 Array 传递参数来执行查询操作。 首先,当查询的参数只有一个,如一个 List&lt;Long&gt; 或 ...

    详解MyBatis直接执行SQL查询及数据批量插入

    List&lt;InstanceModel&gt; getInstanceModel(@Param("paramSQL") String sql); } ``` 3. **注意事项**: - **传入的SQL字符串**:必须按照"MyBatis能识别的格式"编写,如"select XXX as instanceid, XXX as instance...

    MyBatis一对多映射

    如果希望延迟加载,可以在`&lt;collection&gt;`标签中设置`fetchType="lazy"`,但这需要MyBatis的二级缓存支持。 五、性能优化 1. 分页查询:在一对多映射中,如果从表数据量大,应考虑使用分页查询以减少内存消耗。 2. ...

    MyBatis一对多的代码

    public String listStudents(Model model) { List&lt;Student&gt; students = studentService.getAllStudents(); model.addAttribute("students", students); return "students"; } ``` 通过上述步骤,你就可以在...

    Mybatis框架 mapper.xml文件中parameterType传递参数常用的几种方式.pdf

    public List&lt;UserInfo&gt; selectList(List&lt;String&gt; userIds); ``` 在XML中,可以使用foreach循环来遍历List中的每个元素: ```xml &lt;select id="selectList" resultMap="BaseResultMap"&gt; select * from user_info...

Global site tag (gtag.js) - Google Analytics