resultMap标签中里的collection标签详解

目录
  • resultMap标签中的collection标签
    • collection(一对多)
  • collection标签中各属性的说明

resultMap标签中的collection标签

collection(一对多)

元素的作用和association元素的作用差不多一样,事实上,它们非常类似,也是映射到JavaBean的某个“复杂类型” 属性,只不过这个属性是一个集合列表,即JavaBean内部嵌套一个复杂数据类型(集合)。和使用association元素一样,我们使用嵌套查询, 或者从连接中嵌套结果集。

下面通过一个示例来演示coeltien 的具体应用,示例需求获取指定用户的相关的信息和地址列表。

我们有实体类Employee如下:

package com.xyj.entity;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {
	private int eid;
	private String ename;
	private String epwd;
	private String address;
	private String tel;
	private List<Sport> sports;//职员所参加的所有运动项目
}

员工间举行了一个小型运动会,又有Sport实体类如下:

package com.xyj.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Sport {
    private int sportId;
    private String sportName;
    private String sportScore;
}

可知一个员工可以参加多个运动项目,所以我们的Employee对象内部嵌套了一个复杂数据类型的属性,sports,接下来在EmpDao接口中添加根据职员id获取职员参加的项目列表的方法,代码如下:

List<Employee> findSportsInfoByEmpId(@Param("eid")Integer id);

修改对应的映射文件,由于Employee内部嵌套了集合对象,因此需要使用collection来实现结果映射,实例代码如下:

<select id="findSportsInfoByEmpId" resultMap="empmap">
        select e.*,s.*
        from employee as e,sport as s
        where e.eid=s.eid
        and e.eid=#{eid}
    </select>
    
    <resultMap type="Employee" id="empmap">
        <id property="eid" column="eid"/>
        <result property="ename" column="ename"/>
        <result property="epwd" column="epwd"/>
        <result property="address" column="address"/>
        <result property="tel" column="tel"/>
        <!-- collection描述一对多的关系,ofType是集合所包含的类型,可以写完整Java类名或别名  -->
        <collection property="sports" ofType="Sport">
            <id property="sportId" column="sportid"/>
            <result property="sportName" column="sportname"/>
            <result property="sportScore" column="sportscore"/>
        </collection>
    </resultMap>

最后进行测试,查看结果是否正确:

@org.junit.Test
    public void test() {
        SqlSession session = MyBatisUtils.getSqlSession();
        EmpDao ed = session.getMapper(EmpDao.class);
        List<Employee> list = ed.findSportsInfoByEmpId(1);
        for (Employee emp : list) {
            for (Sport e : emp.getSports()) {
                System.out.println(e);
            }
        }
    }

运行结果:

查询成功,但是我们的collection标签写在resultMap标签的内部,不能达到复用,当然是可以复用的,只需修改代码如下:

<select id="findSportsInfoByEmpId" resultMap="empmap">
		select e.*,s.*
		from employee as e,sport as s
		where e.eid=s.eid
		and e.eid=#{eid}
	</select>

	<resultMap type="Employee" id="empmap">
		<id property="eid" column="eid"/>
		<result property="ename" column="ename"/>
		<result property="epwd" column="epwd"/>
		<result property="address" column="address"/>
		<result property="tel" column="tel"/>
		<collection property="sports" ofType="Sport" resultMap="sportmap"></collection>
	</resultMap>

	<resultMap type="Sport" id="sportmap">
		<id property="sportId" column="sportid"/>
		<result property="sportName" column="sportname"/>
		<result property="sportScore" column="sportscore"/>
	</resultMap>

collection标签中各属性的说明

<result column="name" property="name"/>
<!--
collection定义一个子集合对象返回
ofType:指定集合里面元素的类型
property属性设置集合的属性名
-->
<collection property="passengers" ofType="Passenger">
<!--
id指的是主键,
column是数据库中的列,可以是别名
property映射的是实体类中的属性
result是普通列(非主键)
-->
<id column="pid" property="id"/>
<result column="pname" property="name"/>
</collection>
</resultMap>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

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

    mybatis简单的CURD就不用多说了,网上相关博客文档一大堆.分析一下Mybatis里面的collection聚集查询. 假设一个班级有多名学生为例,通过班级号查询出该班级的信息,和班级里面的所有学生的信息,一般的做法就是通过班级号把班级的信息查询出来,再通过班级ID号把该班级里面的所有学生查询出来,我们不用这种通用的方法 1.班级实体类可以定义为这样: import java.util.List; public class ClazzEntity { private int clazzID

  • Mybatis中resultMap的使用总结

    Mybatis的介绍以及使用:http://www.mybatis.org/mybatis-3/zh/index.html resultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中. resultMap包含的元素: <!--column不做限制,可以为任意表的字段,而property须为type 定义的pojo属性--> <resultMap id="唯一的标识" type="映射的pojo对象&

  • mybatis中resultMap 标签的使用教程

    MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动.创建connection.创建statement.手动设置参数.结果集检索等jdbc繁杂的过程代码. MyBatis特点: 1.开源的优秀持久层框架 2.SQL语句与代码分离 3.面向配置的编程 4.良好支持复杂数据映射 5.动态SQL resultMap 标签: 用来描述如何从数据库结果集中来加载对象 (敲黑板!!)主管数据库的字段和实体类属性的匹配,

  • resultMap标签中里的collection标签详解

    目录 resultMap标签中的collection标签 collection(一对多) collection标签中各属性的说明 resultMap标签中的collection标签 collection(一对多) 元素的作用和association元素的作用差不多一样,事实上,它们非常类似,也是映射到JavaBean的某个“复杂类型” 属性,只不过这个属性是一个集合列表,即JavaBean内部嵌套一个复杂数据类型(集合).和使用association元素一样,我们使用嵌套查询, 或者从连接中嵌套

  • spring bean标签中的init-method和destroy-method详解

    目录 1 背景介绍 2 init-method 3 destroy-method 4 总结 1 背景介绍 在很多项目中,经常在xml配置文件中看到init-method 或者 destroy-method .因此整理收集下,方便以后参考和学习.可以使用 init-method 和 destroy-method 在bean 配置文件属性用于在bean初始化和销毁某些动作时.这是用来替代 InitializingBean和DisposableBean接口. init-method 用于指定bean的

  • 对Xpath 获取子标签下所有文本的方法详解

    在爬虫中遇见这种怎么办 想提取名称, 但是 名称不在一个标签里 使用xpath string()方法 例如 data.xpath("string(path)") path -- 你xpath提取的路径 这里提取到父标签 string() 方法会提取子标签多有的文本内容. 以上这篇对Xpath 获取子标签下所有文本的方法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • python3中sorted函数里cmp参数改变详解

    今天在刷leetcode的时候,对于179题返回最大数,用python2中的sorted(cmp)会很方便,但是在python3中这一参数被取消了,经过查找,发现应该借助functools中的cmp_to_key函数,直接贴代码 import functools def cmp(a,b): if a > b : return -1 elif a < b : return 1 else: return 0 nums = [1,2,3,4,5,6] sorted_nums = sorted(num

  • Android studio git创建与删除标签(Tag)的教程详解

    git上的标签一般是用于标记版本,当发布新版本后,便将该版本的代码打上Tag,用以区别及管理 使用标签前需要先将代码提交到远程仓库上 创建并提交Tag 远程端提交后: 使用Git 命令删除Tag Android Studio上没发现界面化的删除Tag操作 定位到项目根路径(该项目.git 文件夹所在处) 右键打开Git Bash 输入 git tag 查看本地tag 输入 git tag -d v1.0.3 删除本地名为"v1.0.3"的Tag 输入 git push origin –

  • Mybatis中Mapper映射文件使用详解

    紧接上文所述,在这篇文章中我将对Mapper映射文件进行详细的说明. Mapper映射文件是一个xml格式文件,必须遵循相应的dtd文件规范,如ibatis-3-mapper.dtd.我们先大体上看看支持哪些配置?如下所示,从Eclipse里截了个屏: 从上图可以看出,映射文件是以<mapper>作为根节点,在根节点中支持9个元素,分别为insert.update.delete.select(增删改查);cache.cache-ref.resultMap.parameterMap.sql. 下

  • JSP中EL表达式的用法详解(必看篇)

    EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有EL都是以${为起始.以}为结尾的.上述EL范例的意思是:从Session的范围中,取得 用户的性别.假若依照之前JSP Scriptlet的写法如下: User user =(User)session.getAttribute("user"); String sex =user.getSex( );

  • java开发中遇到的异常汇总详解

    异常 算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeArrayException 数组下标越界异常:ArrayIndexOutOfBoundsException 违背安全原则异常:SecturityException 文件已结束异常:EOFException 文件未找到异常:FileNotFoundException 字符串转换为数字异常:Numb

  • 在vue 中使用 less的教程详解

    1.安装 npm install --save-dev less less-loader npm install --save-dev style-loader css-loader 先在index.html页面head标签内插入这段代码 <script> (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? 'orientationchange'

  • Android使用Realm数据库实现App中的收藏功能(代码详解)

    前 言 App数据持久化功能是每个App必不可少的功能,而Android最常用的数据持久化方式主要有以下的五种方式: 使用SharedPreferences存储数据: 文件存储数据: SQLite数据库存储数据: 使用ContentProvider存储数据: 网络存储数据. 其中前四种都是缓存数据到本地,这篇主要讲的是使用第三种方式来实现App中的收藏功能,不过不用Android原生自带SQLite数据库来存储数据,而是使用第三方的Realm数据库来来存储数据. Realm 本质上是一个嵌入式数

随机推荐