mybatis IDEA——高级结果映射

在关系型数据库中,我们经常要处理一对一、 一对多的关系。比如一个用户可以拥有多个角色。

1、一对一映射

A.使用自动映射处理一对一关系

假设一个用户只拥有一个角色,因此先在SysUser类中增加SysRole字段

	private SysRole role; 
	public SysRole getRole() { 
		return role; 
	}
	public void setRole (SysRole role) { 
		this.role =  role; 
    }

使用自动映射就是通过别名让MyBatis 自动将值匹配到对应的字段上, 简单的别名映射如user_name对应userName。除此之外MyBatis 还支持复杂的属性映射, 可以多层嵌套,例如将role. role_name映射到role.roleName上。MyBatis 会先查找role属性,如果存在role属性就创建role对象,然后在role对象中继续查找roleName,将role name的值绑定到role对象的roleName属性上。

    <select id="queryUserAndRoleByUserid" resultType="SysUser">
        select u.id,
		   u.user_name userName,
		   u.user_password userPassword,
		   u.user_email userEmail,
		   u.create_time createTime,
		   r.id "role.id",
	       r.role_name "role.roleName",
	       r.enabled "role.enabled",
	       r.create_by "role.createBy",
	       r.create_time "role.createTime"
	     from sys_user u
	     inner join sys_user_role ur on u.id = ur.user_id
	     inner join sys_role r on r.id = ur.role_id
	     where u.id = #{id}
    </select>

测试类

    @Test
    public void testQueryUserAndRoleByUserid(){
        try(SqlSession session = this.getSqlSession()){
            SysUserDao dao = session.getMapper(SysUserDao.class);
            SysUser user =  dao.queryUserAndRoleByUserid(1001L);
            System.out.println(user);
        }
    }

日志

DEBUG [main] - ==>  Preparing: select u.id, u.user_name userName, u.user_password userPassword, u.user_email userEmail, u.create_time createTime, r.id "role.id", r.role_name "role.roleName", r.enabled "role.enabled", r.create_by "role.createBy", r.create_time "role.createTime" from sys_user u inner join sys_user_role ur on u.id = ur.user_id inner join sys_role r on r.id = ur.role_id where u.id = ? 
DEBUG [main] - ==> Parameters: 1001(Long)
TRACE [main] - <==    Columns: id, userName, userPassword, userEmail, createTime, role.id, role.roleName, role.enabled, role.createBy, role.createTime
TRACE [main] - <==        Row: 1001, test, 123456, [email protected], 2018-01-01 00:00:00.0, 2, 普通用户, 1, 1, 2018-01-01 00:00:00.0
DEBUG [main] - <==      Total: 1
SysUser{id=1001, userName='test', userPassword='123456', userEmail='[email protected]', createTime1=null, roles=null, role=SysRole{id=2, roleName='普通用户', enabled=1, createBy=1, createTime=Mon Jan 01 00:00:00 CST 2018}}

B.使用resultMap的association标签配置一对一映射

在resultMap中, association标签用于和一个复杂的类型进行关联,即用于一对一的关联配置。

association标签包含以下属性:
property:对应实体类中的属性名,必填项。
javaType: 属性对应的Java类型。
resultMap: 可以直接使用现有的resultMap,而不需要在这里配置。
columnPrefix:查询列的前缀,配置前缀后,在子标签配置result的column时可以省略前缀。

    <resultMap id="userRoleMap" extends="userMap" type="SysUser" >
		<association property="role" columnPrefix="role_" javaType="SysRole">
		    <id column="id"  property="id" />
		    <result column="role_name" property="roleName" />
		    <result column="enabled" property="enabled" />
		    <result column="create_by"  property="createBy" />
		    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
		</association>
	</resultMap>

可简化如下SysRoleMapper是根据数据库逆向生成的接口

    <resultMap id="userRoleMap" type="SysUser" extends="userMap">
        <association property="role" columnPrefix="role_"
                     resultMap="com.etc.dao.SysRoleMapper.BaseResultMap">
        </association>
    </resultMap>
    <select id="queryUserAndRoleByUserid2" resultMap="userRoleMap">
        select u.id,
        u.user_name,
        u.user_password,
        u.user_email,
        u.create_time,
        r.id "role_id",
        r.role_name "role_role_name",
        r.enabled "role_enabled",
        r.create_by "role_create_by",
        r.create_time "role_create_time"
        from sys_user u
        inner join sys_user_role ur on u.id = ur.user_id
        inner join sys_role r on r.id = ur.role_id
        where u.id = #{id}
    </select>

测试类

    @Test
    public void testQueryUserAndRoleByUserid2(){
        try(SqlSession session = this.getSqlSession()){
            SysUserDao dao = session.getMapper(SysUserDao.class);
            SysUser user =  dao.queryUserAndRoleByUserid2(1001L);
            System.out.println(user);
        }
    }

日志

DEBUG [main] - Cache Hit Ratio [com.etc.dao.SysUserDao]: 0.0
Fri Sep 07 20:59:54 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
DEBUG [main] - ==>  Preparing: select u.id, u.user_name, u.user_password, u.user_email, u.create_time, r.id "role_id", r.role_name "role_role_name", r.enabled "role_enabled", r.create_by "role_create_by", r.create_time "role_create_time" from sys_user u inner join sys_user_role ur on u.id = ur.user_id inner join sys_role r on r.id = ur.role_id where u.id = ? 
DEBUG [main] - ==> Parameters: 1001(Long)
TRACE [main] - <==    Columns: id, user_name, user_password, user_email, create_time, role_id, role_role_name, role_enabled, role_create_by, role_create_time
TRACE [main] - <==        Row: 1001, test, 123456, [email protected], 2018-01-01 00:00:00.0, 2, 普通用户, 1, 1, 2018-01-01 00:00:00.0
Mon Jan 01 00:00:00 CST 2018
DEBUG [main] - <==      Total: 1
SysUser{id=1001, userName='test', userPassword='123456', userEmail='[email protected]', createTime1=Mon Jan 01 00:00:00 CST 2018, roles=null, role=SysRole{id=2, roleName='普通用户', enabled=1, createBy=1, createTime=Mon Jan 01 00:00:00 CST 2018}}

2、一对多映射

一个用户可以拥有多个角色,可以先对SysUser类进行修改:

    private List<SysRole> roles;

    public List<SysRole> getRoles() {
        return roles;
    }

    public void setRoles(List<SysRole> roles) {
        this.roles = roles;
    }

 将userRoleMap中的association修改为collection,propery修改为roleList即可。

    <resultMap id="userRoleListMap" type="SysUser" extends="userMap">
        <collection property="roles" columnPrefix="role_"
                     resultMap="com.etc.dao.SysRoleMapper.BaseResultMap">
        </collection>
    </resultMap>
    <select id="queryUserAndRoleByUserid3" resultMap="userRoleListMap">
        select u.id,
        u.user_name,
        u.user_password,
        u.user_email,
        u.create_time,
        r.id "role_id",
        r.role_name "role_role_name",
        r.enabled "role_enabled",
        r.create_by "role_create_by",
        r.create_time "role_create_time"
        from sys_user u
        inner join sys_user_role ur on u.id = ur.user_id
        inner join sys_role r on r.id = ur.role_id
        where u.id = #{id}
    </select>

测试类

    @Test
    public void testQueryUserAndRoleByUserid3(){
        try(SqlSession session = this.getSqlSession()){
            SysUserDao dao = session.getMapper(SysUserDao.class);
            List<SysUser> users =  dao.queryUserAndRoleByUserid3(1L);
            System.out.println(users);
        }
    }

日志

Fri Sep 07 21:08:56 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
DEBUG [main] - ==>  Preparing: select u.id, u.user_name, u.user_password, u.user_email, u.create_time, r.id "role_id", r.role_name "role_role_name", r.enabled "role_enabled", r.create_by "role_create_by", r.create_time "role_create_time" from sys_user u inner join sys_user_role ur on u.id = ur.user_id inner join sys_role r on r.id = ur.role_id where u.id = ? 
DEBUG [main] - ==> Parameters: 1(Long)
TRACE [main] - <==    Columns: id, user_name, user_password, user_email, create_time, role_id, role_role_name, role_enabled, role_create_by, role_create_time
TRACE [main] - <==        Row: 1, admin, 123456, [email protected], 2018-01-01 00:00:00.0, 1, 管理员, 1, 1, 2018-01-01 00:00:00.0
Mon Jan 01 00:00:00 CST 2018
TRACE [main] - <==        Row: 1, admin, 123456, [email protected], 2018-01-01 00:00:00.0, 2, 普通用户, 1, 1, 2018-01-01 00:00:00.0
DEBUG [main] - <==      Total: 2
[SysUser{id=1, userName='admin', userPassword='123456', userEmail='[email protected]', createTime1=Mon Jan 01 00:00:00 CST 2018, roles=[SysRole{id=1, roleName='管理员', enabled=1, createBy=1, createTime=Mon Jan 01 00:00:00 CST 2018}, SysRole{id=2, roleName='普通用户', enabled=1, createBy=1, createTime=Mon Jan 01 00:00:00 CST 2018}], role=null}]

猜你喜欢

转载自blog.csdn.net/Milan__Kundera/article/details/82502456