Mybatis中 ResultMap的collection配置一对多使用详解

摘要:
resultMap可以将各种查询数据映射到满足需求的对象。1.实现操作的基本过程调用Mapper接口方法→ → Mapper与xml文件中的ID对应的查询语句→ 查询语句配置resultMap属性→ 在resultMap标记中,配置查询表的字段与对象的属性之间的关系--集合部分如下所示。这两种类型填充了这里的集合部分--!

resultMap可以将查询到的多种数据,映射到一个符合要求的对象上。

  1.实现操作的基本流程

    调用Mapper接口的方法→→Mapper.xml文件中对应id的查询语句(接口的方法名=查询语句的id)→查询语句配置resultMap属性(属性值是其对应ResultMap标签的id)→在resultMap标签中,配置查到的表的字段与对象的属性的关系。

  2.主要总结一下collection的使用

    为了解决一对多类型的需求,使用collection标签来处理其中的“多”,常表现为在类中的属性为List<>

    2.1 resultMap部分:

      id - 唯一标识,不做赘述

      type - 映射的目标类型

        每一行都是一个 数据库表中字段 与 对象属性 的映射

        column - 数据库表中的字段

        property - pojo对象的对应属性

  <resultMap   type="com.example.server.bean.User">
        <id column="u_id" property="userId" jdbcType="INTEGER"/>
        <result column="u_name" property="userName" jdbcType="VARCHAR"/>
                <!--collection部分见下,两种类型就是把collection部分 分别填充在该处--!> 
    </resultMap>

    2.2 collection有两种配置方式

      1.嵌套数据

      2.嵌套查询

      两种方式的主要区别在于collection,和sql语句处

      

      2.2.1.嵌套数据

//collection:
//在collection标签(即”多“)的次级标签中,直接配置List<>中对象的映射
//pojoA中"List<pojoB> pojoBList" 则property处填pojoBList 
<collection property="pojoA的一个集合属性名" ofType="集合中的pojoB对象"/>
        <id column="表的字段(<>括号中的类的属性所对应的)" jdbcType="字段类型(数据库表的)" property="集合中对象的主键属性(javabean)" />
    <result column="表的字段(可以为任意表中的)" jdbcType="字段类型(数据库表的)" property="集合中的pojo对象的属性" />  
</collection>

// 例子
//Role对象包括 roleId roleName字段 ,对应数据库中表的字段是role_id role_name
<collection property="roleList" ofType="com.example.server.beans.Role"/>
        <id column="role_id" jdbcType="INTEGER" property="roleId" />
    <result column="role_Name" jdbcType="VARCHAR" property="roleName" />  
</collection>

//SQl:
//只有一段
<select resultMap="其语句查询出的数据从依照那个resultMap来映射"> //该处写的sql语句应是:查询出来的数据,包括collection以及resultMap中的各个表字段(即每个column) </select>

      2.2.2嵌套查询

//collection:
//不写次级标签,通过select实现嵌套查询
//pojoA中"List<pojoB> pojoBList" 则property处填pojoBList 
//column 是传入的参数(目前我也未搞懂,可以直接照传入属性值对应的表字段填写)
<collection property="pojoA的一个集合属性名" ofType="com.example.server.beans.PojoB" column="user_id" select="一个sql查询的id(sql_id)"/>

//SQl:
//应当有两段:
//1.是查询resutMap的属性(PojoA的其他属性)的语句,其应将resultType换为resultMapper //2.即为下列查询pojoB <select resultType = "com.example.server.beans.PojoB" parameterType = "INTEGER"> //该处写的sql语句应是:用user_id对应的pojo属性(即mapper接口中方法的传参)来查询出你所需要的PojoB的字段 的语句 </select>

(嵌套查询的collection 也还有两种,resultMap或者resultType 这里只写了后者,前者可在下列代码中的嵌套查询collectionPlanA中见到)

  配上一个没什么注释的xml文件代码--UserMapper.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.example.server.mapper.UserMapper">
<!-- 嵌套数据,ResultMap --> <select resultMap="UserRolesMap"> SELECT u.u_id, u.`u_name`, r.r_id, r.`r_name` FROM t_user u, t_role r, t_role_user ru WHERE ru.role_id = r.r_id AND ru.user_id = u.u_id AND u.u_id = #{userId} </select>
<!-- 嵌套数据,association或者collection中无select --> <resultMap type="com.example.server.bean.User"> <id column="u_id" property="userId" jdbcType="INTEGER"/> <result column="u_name" property="userName" jdbcType="VARCHAR"/> <!-- <result column="password" property="password" jdbcType="VARCHAR"/>--> <collection property="roleList" javaType="java.util.List" ofType="com.example.server.bean.Role" > <id column="r_id" property="roleId" jdbcType="INTEGER"/> <id column="r_name" property="roleName" jdbcType="VARCHAR"/> </collection> </resultMap> <!--嵌套查询 ResultMap--> <select resultMap="UserRolesMap_1"> SELECT u_id , `u_name` FROM t_user WHERE u_id = #{userId} </select> <!--collection嵌套查询--> <resultMap type="com.example.server.bean.User"> <id column="u_id" property="userId"/> <result column="u_name" property="userName"/> <!-- collection一对多,property是List属性的名字,ofType是List<>中的类型 column是传入的参数--> <!-- select执行的是一个语句--> <collection property="roleList" ofType="com.example.server.bean.Role" column="u_id" select="findRoleListByUserId"/> </resultMap> <!-- 嵌套查询collection plan A-->   <!-- 嵌套查询RoleList select中的三个属性(id resultMap parameterType)都不能少-->   <!--As后是对应pojo中的属性名 有resultMap指定映射关系时就不用AS去对应属性名了--> <select resultMap="getRoleListByUserIdMap" parameterType="INTEGER"> SELECT r.r_id , r.r_name FROM t_role r, t_role_user ru WHERE r.r_id = ru.role_id AND ru.user_id = #{userId} </select> <resultMap type="com.example.server.bean.Role"> <id column="r_id" property="roleId"/> <result column="r_name" property="roleName"/> </resultMap> <!-- 嵌套查询collection plan B-->   <!-- <select resultType="com.example.server.bean.Role" parameterType="INTEGER">-->   <!-- SELECT r.r_id AS roleId, r.r_name AS roleName-->   <!-- FROM t_role r, t_role_user ru-->   <!-- WHERE r.r_id = ru.role_id-->   <!-- AND ru.user_id = #{userId}-->   <!-- </select>-->

      错误欢迎指正,多多学习

免责声明:文章转载自《Mybatis中 ResultMap的collection配置一对多使用详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇几个Android云测试Maven适配多种运行环境的打包方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mybatis源码分析(1)-----sqlSessionFactory创建

1. 首先了解一下mybatis,包含核心jar ,以及spring相关jar. <!-- Mybatis相关组件 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifact...

MySQL快速回顾:高级查询操作

8.1 排序数据 检索出的数据并不是以纯粹的随机顺序显示的。如果不排序,数据一般将以它在底层表中出现的顺序显示。这可以是数据最初添加到表中的顺序。但是,如果数据后来进行过更新或删除,则此顺序将会受到MySQL重用回收存储空间的影响。因此,如果不明确控制的话,不能依赖该排序顺序。 关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序...

Oracle视图和PL SQL编程.

Oracle中的视图 在Oracle数据库中视图是数据库中特有的对象。视图主要用于数据查询,它不会存储数据(物化视图除外)。这是视图和数据表的重要区别。 视图的数据来源于一个或等多个表中的数据,可以利用视图进行查询、插入、更新和删除数据,操作视图就是间接操作数据库表。 通常情况下,视图主要用于查询,不提倡通过视图而更新与视图相关的表,因为视图中的数据只是一...

selenium select下拉选择框定位处理的两种方式

一、前言      总结一下python+selenium select下拉选择框定位处理的两种方式,以备后续使用时查询; 二、直接定位(XPath) 使用Firebug找到需要定位到的元素,直接右键复制XPath,使用find_element_by_xpath定位; driver = webdriver.Firefox() driver.get("htt...

select 下拉框的样式改变

最近在做地图遇到一个很有意思的事情,就是select下拉框的样式改变 /*第一种,改变下拉框样式*/ select { /*Chrome和Firefox里面的边框是不一样的,所以复写了一下*/ border: solid 1px #000; /*很关键:将默认的select选择框样式清除*/ appearance:none; -moz-appearance...

MyBatis + PageHelper

1. 引入分页插件 在 pom.xml 中添加如下依赖: <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>最新版...