resultMap
resultMap是Mybatis最强大的元素
它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中。
<!--column不做限制,可以为任意表的字段,而property须为type 定义的pojo属性-->
<resultMap id="唯一的标识" type="映射的pojo对象">
<id column="表的主键字段,或者可以为查询语句中的别名字段" jdbcType="字段类型" property="映射pojo对象的主键属性" />
<result column="表的一个字段(可以为任意表的一个字段)" jdbcType="字段类型" property="映射到pojo对象的一个属性(须为type定义的pojo对象中的一个属性)"/>
<association property="pojo的一个对象属性" javaType="pojo关联的pojo对象">
<id column="关联pojo对象对应表的主键字段" jdbcType="字段类型" property="关联pojo对象的主席属性"/>
<result column="任意表的字段" jdbcType="字段类型" property="关联pojo对象的属性"/>
</association>
<!-- 集合中的property须为oftype定义的pojo对象的属性-->
<collection property="pojo的集合属性" ofType="集合中的pojo对象">
<id column="集合中pojo对象对应的表的主键字段" jdbcType="字段类型" property="集合中pojo对象的主键属性" />
<result column="可以为任意表的字段" jdbcType="字段类型" property="集合中的pojo对象的属性" />
</collection>
</resultMap>
- 这里定义一个例子
用户 ---- 角色 ---- 权限 (一个用户对应一个角色(管理者 或 游客 ) , 一个角色有多个权限 (增删改查) )
用户类
//User属性:1、唯一ID 2、用户名 3、密码 4、拥有的Role
public class User {
private Integer uid;
private String username;
private String password;
private Role role;
}
省略 get set-------
角色类
//Role存在:1、唯一ID 2、角色名 3、角色拥有的权限 4、拥有该角色的用户(可以不需要)
public class Role {
private Integer rid;
private String rname;
private Set<Permission> permissions = new HashSet<>(); //该集合用来存储各个权限
}
省略 get set-------
权限类
//Permission存在:1、唯一ID 2、权限名 3、。。。
public class Permission {
private Integer pid;
private String name;
private String url;
}
省略 get set-------
Mapper.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">
<!-- namespace必须是唯一的,建议用该文件所在的包路径全类名 -->
<mapper namespace="IOC.Mybatis_spring.UserMapper">
<resultMap id="userMap2" type="IOC.Mybatis_spring.pojo.User">
<id property="uid" column="uid"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<association property="role" resultMap="roleMap"/> <!--直接引用rolemap-->
</resultMap>
<!--角色对象的Type 定义java Bean的属性与数据库的列之间的映射 -->
<resultMap id="roleMap" type="IOC.Mybatis_spring.pojo.Role">
<id property="rid" column="rid"/>
<result property="rname" column="rname"/>
<collection property="permissions" resultMap="permissMap"/> <!--直接引用permissMap-->
</resultMap>
<!-- 权限对象的Type 定义java Bean的属性与数据库的列之间的映射 -->
<resultMap id="permissMap" type="IOC.Mybatis_spring.pojo.Permission">
<id property="pid" column="pid"/>
<result property="name" column="name"/>
<result property="url" column="url"/>
</resultMap>
<select id="select" parameterType="string" resultMap="userMap2">
SELECT
u.*,r.*,p.*
FROM
USER u
JOIN user_role ur ON ur.uid = u.uid -- 用户id 等于 ur中间表的用户id --
JOIN role r ON r.rid = ur.rid -- 角色id 等于 ur中间表的角色id --
JOIN permission_role pr ON r.rid = pr.rid -- 角色id 等于 pr中间表的角色id --
JOIN permission p ON p.pid = pr.pid -- 权限id 等于 pr中间表的权限id --
AND u.uid =#{id} -- 当获取到用户的ID,就可以推算出角色表和权限表,最后知道角色是什么,权限是什么 --
</select>
</mapper>
疑点: 网上说的 association 是一对一 ,collection 是一对多, 但是我发现使用哪个都可以 …