Mybatis中 ResultMap的collection配置一对多使用详解
resultMap可以将查询到的多种数据,映射到一个符合要求的对象上。
1.实现操作的基本流程
调用Mapper接口的方法→→Mapper.xml文件中对应id的查询语句(接口的方法名=查询语句的id)→查询语句配置resultMap属性(属性值是其对应ResultMap标签的id)→在resultMap标签中,配置查到的表的字段与对象的属性的关系。
2.主要总结一下collection的使用
为了解决一对多类型的需求,使用collection标签来处理其中的“多”,常表现为在类中的属性为List<>
2.1 resultMap部分:
id - 唯一标识,不做赘述
type - 映射的目标类型
每一行都是一个 数据库表中字段 与 对象属性 的映射
column - 数据库表中的字段
property - pojo对象的对应属性
<resultMap id="UserRolesMap" 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 id="它的id" 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 id = "sql_id" 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 id="getRolesByUserId" 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 id="UserRolesMap" 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 id="getRolesByUserId_1" resultMap="UserRolesMap_1"> SELECT u_id , `u_name` FROM t_user WHERE u_id = #{userId} </select> <!--collection嵌套查询--> <resultMap id="UserRolesMap_1" 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 id="findRoleListByUserId" 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 id="getRoleListByUserIdMap" type="com.example.server.bean.Role"> <id column="r_id" property="roleId"/> <result column="r_name" property="roleName"/> </resultMap> <!-- 嵌套查询collection plan B--> <!-- <select id="findRoleListByUserId" 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>-->
错误欢迎指正,多多学习