drop database if exists simple;
create database simple; use simple;
drop table if exists sys_user;
create table sys_user
(
id bigint not null auto_increment comment '用户ID',
user_name varchar(50) comment '用户名',
user_password varchar(50) comment '密码',
user_email varchar(50) comment '邮箱',
user_info text comment '简介',
head_img blob comment '头像',
create_time datetime comment '创建时间',
primary key (id)
);
alter table sys_user comment '用户表'; drop table if exists sys_role;
create table sys_role(
id bigint not null auto_increment comment '角色ID',
role_name varchar(50) comment '角色名',
enabled int comment '有效标志',
create_by bigint comment '创建人',
create_time datetime comment '创建时间',
primary key (id)
);
alter table sys_role comment '角色表'; drop table if exists sys_privilege;
create table sys_privilege
(
id bigint not null auto_increment comment '权限ID',
privilege_name varchar(50) comment '权限名称',
privilege_url varchar(50) comment '权限URL',
primary key (id)
);
alter table sys_privilege comment '权限表'; drop table if exists sys_user_role;
create table sys_user_role
(
user_id bigint comment '用户ID',
role_id bigint comment '角色ID'
);
alter table sys_user_role comment '用户角色关联表'; drop table if exists sys_role_privilege;
create table sys_role_privilege
(
role_id bigint comment '用户ID',
privilege_id bigint comment '角色ID'
);
alter table sys_role_privilege comment '角色权限关联表';

假如1个用户只能有1种角色sys_user和sys_role是通过sys_user_role一对一关联;

1.使用自动映射处理一对一关系;优点:当一定会使用到嵌套结果时使用。

  1.在SysUser.class model中增加SysRole的对象。

private SysRole role;

  2.在查询的xml Mapper文件中对查询出的role属性写出对应的属性名称。

 <select id="selectUserAndById" resultType="test.model.SysUser">
select
u.id,
u.user_name userName,
u.user_password userPassword,
u.user_email userEmail,
u.create_time createTime,
u.user_info userInfo,
u.head_img headImg,
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 ur.user_id=r.id where u.id=#{id}
</select>

2.使用resultMap配置一对一映射

<?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="test.dao.SysUserMapper">
<resultMap id="BaseResultMap" type="test.model.SysUser">
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="user_name" jdbcType="VARCHAR" property="userName" />
<result column="user_password" jdbcType="VARCHAR" property="userPassword" />
<result column="user_email" jdbcType="VARCHAR" property="userEmail" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="user_info" jdbcType="LONGVARCHAR" property="userInfo" />
<result column="head_img" jdbcType="LONGVARBINARY" property="headImg" /> </resultMap> <resultMap type="test.model.SysUser" id="userRoleResultMap" extends="BaseResultMap">
<!-- role相关属性 -->
<result column="role_id" jdbcType="BIGINT" property="role.id" />
<result column="role_name" jdbcType="VARCHAR" property="role.roleName" />
<result column="enabled" jdbcType="INTEGER" property="role.enabled" />
<result column="create_by" jdbcType="BIGINT" property="role.createBy" />
<result column="role_create_time" jdbcType="TIMESTAMP" property="role.createTime" />
</resultMap>

<!-- 注意返回 resultMap="userRoleResultMap"-->
<select id="selectUserAndById" resultMap="userRoleResultMap">
select
u.id,
u.user_name,
u.user_password,
u.user_email,
u.create_time,
u.user_info,
u.head_img,
r.id role_id,
r.role_name role_name,
r.enabled enabled,
r.create_by 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 ur.user_id=r.id where u.id=#{id}
</select>
</mapper>

3.使用resultMap的associaction标签配置一对一映射

<?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="test.dao.SysUserMapper">
<resultMap id="BaseResultMap" type="test.model.SysUser">
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="user_name" jdbcType="VARCHAR" property="userName" />
<result column="user_password" jdbcType="VARCHAR" property="userPassword" />
<result column="user_email" jdbcType="VARCHAR" property="userEmail" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="user_info" jdbcType="LONGVARCHAR" property="userInfo" />
<result column="head_img" jdbcType="LONGVARBINARY" property="headImg" /> </resultMap> <!-- 继承上面的UserResultMap -->
<resultMap type="test.model.SysUser" id="userRoleResultMap" extends="BaseResultMap">
<!-- role相关属性 -->
<!-- 对应的ResultMap在test.dao.SysRoleMapper这个命名控件中-->
<association property="role" columnPrefix="role_" resultMap="test.dao.SysRoleMapper.BaseResultMap"></association>
</resultMap> <select id="selectUserAndById" resultMap="userRoleResultMap">
select
u.id,
u.user_name,
u.user_password,
u.user_email,
u.create_time,
u.user_info,
u.head_img,
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 ur.user_id=r.id where u.id=#{id}
</select>
<mapper/>
<mapper namespace="test.dao.SysRoleMapper">
<resultMap id="BaseResultMap" type="test.model.SysRole">
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="role_name" jdbcType="VARCHAR" property="roleName" />
<result column="enabled" jdbcType="INTEGER" property="enabled" />
<result column="create_by" jdbcType="BIGINT" property="createBy" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
</resultMap>
</mapper>

4.association标签的嵌套查询 (子查询)

fetchType="lazy";还需要在配置文件中加
<settings>
<setting name="logImpl" value="LOG4J"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<!-- SysUserMapper.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="test.dao.SysUserMapper">
<resultMap id="BaseResultMap" type="test.model.SysUser">
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="user_name" jdbcType="VARCHAR" property="userName" />
<result column="user_password" jdbcType="VARCHAR" property="userPassword" />
<result column="user_email" jdbcType="VARCHAR" property="userEmail" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="user_info" jdbcType="LONGVARCHAR" property="userInfo" />
<result column="head_img" jdbcType="LONGVARBINARY" property="headImg" /> </resultMap> <!-- 继承上面的UserResultMap -->
<resultMap type="test.model.SysUser" id="userRoleResultMap" extends="BaseResultMap">
<!-- role相关属性 -->
<!-- 对应的ResultMap在test.dao.SysRoleMapper这个命名控件中 注意这里没有resultMap="" -->
<association property="role" column="{id=role_id}" fetchType="lazy" select="test.dao.SysRoleMapper.selectRoleById"></association>
</resultMap> <select id="selectUserAndById" resultMap="userRoleResultMap">
select
u.id,
u.user_name,
u.user_password,
u.user_email,
u.create_time,
u.user_info,
u.head_img,
ur.role_id
from sys_user u inner join sys_user_role ur on u.id=ur.user_id
where u.id=#{id}
</select>
</mapper>
<!--- RoleMapper.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="test.dao.SysRoleMapper">
<resultMap id="BaseResultMap" type="test.model.SysRole">
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="role_name" jdbcType="VARCHAR" property="roleName" />
<result column="enabled" jdbcType="INTEGER" property="enabled" />
<result column="create_by" jdbcType="BIGINT" property="createBy" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
</resultMap> <select id="selectRoleById" resultMap="BaseResultMap">
select * from sys_role where id=#{id}
</select>
</mapper>

测试不能用debug看效果;

单元测试

package com.watermelon.test;

import org.apache.ibatis.session.SqlSession;
import org.junit.Assert;
import org.junit.Test; import test.dao.SysUserMapper;
import test.model.SysUser; public class SysUserMappertest extends BaseMapperTest{ @Test
public void testSelectUserAndById() {
SqlSession sqlSession = getSqlSession();
SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);
SysUser user = sysUserMapper.selectUserAndById(1L);
Assert.assertNotNull(user);
System.out.println("调用user.getRole()");
Assert.assertNotNull(user.getRole());
}
}

直接运行效果:

DEBUG [main] - ==>  Preparing: select u.id, u.user_name, u.user_password, u.user_email, u.create_time, u.user_info, u.head_img, ur.role_id from sys_user u inner join sys_user_role ur on u.id=ur.user_id where u.id=?
DEBUG [main] - ==> Parameters: 1(Long)
TRACE [main] - <== Columns: id, user_name, user_password, user_email, create_time, user_info, head_img, role_id
TRACE [main] - <== Row: 1, admin, 123456, admin@mybats.tk, 2017-09-25 15:55:15.0, <<BLOB>>, <<BLOB>>, 1
DEBUG [main] - <== Total: 1
调用user.getRole()

DEBUG [main] - ==> Preparing: select * from sys_role where id=?
DEBUG [main] - ==> Parameters: 1(Long)
TRACE [main] - <== Columns: id, role_name, enabled, create_by, create_time
TRACE [main] - <== Row: 1, 管理员, 1, 1, 2017-09-25 15:55:59.0
DEBUG [main] - <== Total: 1

debug效果:

注:虽然这个方法已经满足了我们的要求,但是有些时候还是需要在触发某些方法时将所有的数据都加载进来。

可以调用对象的“equals,clone,hashCode,toString”.等方法。

@Test
public void testSelectUserAndById() {
SqlSession sqlSession = getSqlSession();
SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);
SysUser user = sysUserMapper.selectUserAndById(1L);
Assert.assertNotNull(user);
// String s = "";
// s.equals(null);
//上面不行,必须是返回对象的方法
user.equals(null);
System.out.println("调用user.getRole()");
Assert.assertNotNull(user.getRole());
}

结果:

DEBUG [main] - ==>  Preparing: select u.id, u.user_name, u.user_password, u.user_email, u.create_time, u.user_info, u.head_img, ur.role_id from sys_user u inner join sys_user_role ur on u.id=ur.user_id where u.id=?
DEBUG [main] - ==> Parameters: 1(Long)
TRACE [main] - <== Columns: id, user_name, user_password, user_email, create_time, user_info, head_img, role_id
TRACE [main] - <== Row: 1, admin, 123456, admin@mybats.tk, 2017-09-25 15:55:15.0, <<BLOB>>, <<BLOB>>, 1
DEBUG [main] - <== Total: 1
DEBUG [main] - ==> Preparing: select * from sys_role where id=?
DEBUG [main] - ==> Parameters: 1(Long)
TRACE [main] - <== Columns: id, role_name, enabled, create_by, create_time
TRACE [main] - <== Row: 1, 管理员, 1, 1, 2017-09-25 15:55:59.0
DEBUG [main] - <== Total: 1
调用user.getRole()

MyBatis高级查询 一对一映射的更多相关文章

  1. MyBatis高级查询

    -------------------------siwuxie095 MyBatis 高级查询 1.MyBatis 作为一个 ORM 框架,也对 SQL 的高级查询做了支持, MyBatis 高级查 ...

  2. MyBatis 高级查询环境准备(八)

    MyBatis 高级查询 之前在学习 Mapper XML 映射文件时,说到 resultMap 标记是 MyBatis 中最重要最强大也是最复杂的标记,而且还提到后面会详细介绍它的高级用法. 听到高 ...

  3. MyBatis从入门到精通(第6章):MyBatis 高级查询->6.1.1高级结果映射之一对一映射

    jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.IntelliJ IDEA 2019.2.4 本章主要包含的内容为 MyBatis 的高级结果映射,主要处理数据库一对一.一对多的 ...

  4. MyBatis 高级查询之一对一查询(九)

    高级查询之一对一查询 查询条件:根据游戏角色ID,查询账号信息 我们在之前创建的映射器接口 GameMapper.java 中添加接口方法,如下: /** * 根据角色ID查询账号信息 * @para ...

  5. Mybatis高级查询之一对一查询的四种方法

    目录 1. 一对一查询 1.1 一对一嵌套结果查询 1.2 使用resultMap配置一对一映射 1.3 使用resultMap的association标签配置一对一映射 1.4 associatio ...

  6. MyBatis 高级查询之一对多查询(十)

    高级查询之一对多查询 查询条件:根据游戏名称,查询游戏账号信息 我们在之前创建的映射器接口 GameMapper.java 中添加接口方法,如下: /** * 根据游戏名查询游戏账号 * @param ...

  7. MyBatis 高级查询之多对多查询(十一)

    高级查询之多对多查询 查询条件:根据玩家名,查询游戏信息 我们在之前创建的映射器接口 GameMapper.java 中添加接口方法,如下: /** * 根据玩家名查询游戏 * @param name ...

  8. Mybatis 高级查询的小整理

    高级查询的整理 // resutlType无法帮助我们自动的去完成映射,所以只有使用resultMap手动的进行映射 resultMap: type 结果集对应的数据类型 id 唯一标识,被引用的时候 ...

  9. MyBatis从入门到精通(第6章):MyBatis 高级查询->6.1.2高级结果映射之一对多映射

    jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.IntelliJ IDEA 2019.3.1 本章主要包含的内容为 MyBatis 的高级结果映射,主要处理数据库一对一.一对多的 ...

随机推荐

  1. contab的使用方法

    linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另 外, 由于使用者自己也可以设置计划任务,所以, ...

  2. 完善本地搭建的jekyll环境(Windows)

    序:上篇文章虽然在本地搭建好了jekyll环境,但是却存在一些问题,如通过jekyll new创建的站点无法正常跑起来.中文编码有问题.这说明之前搭建的环境有不周之处. PS:因之前自己搭建环境时并未 ...

  3. oracle 内连接 左外连接 右外连接的用法,(+)符号用法

    1. 内连接很简单 select A.*, B.* from A,B where A.id = B.id select A.*, B.* from A inner join B on A.id = B ...

  4. 08css、JS

    08.css.JS-2018/07/18 1.css的属性 文字属性:font-size:大小,font-family字体类型,font-color:颜色 文本颜色:color:颜色,test-dec ...

  5. iconfig1

    #include<iostream> using namespace std; //测试 template 里面是否还可以有 template class alloc{ }; templa ...

  6. vcenter6.5安装问题

    vcenter6.5 有2个安装包1个vim (windows系统)   1个vcsa(linux) 安装vcsa遇到如下问题: 1.版本bug 网上一般找到的镜像是VMware-VCSA-all-6 ...

  7. 洛谷 3870 [TJOI2009]开关

    [题解] 线段树基础题.对于每个修改操作把相应区间的sum改为区间长度-sum即可. #include<cstdio> #include<algorithm> #include ...

  8. Uva 10730 Antiarithmetic?

    uva 10730 题意:给出一列数字,如果其中存在长度大于等于3的等差数列,输出no,不存在就输出yes 这道题标定了数列长度n,而且这n个数数据范围是从0到n-1,没有相同的数,这就给我们枚举提供 ...

  9. vue api

    1. vue.config.silent = true 取消 Vue 所有的日志与警告. 2.vue.config.productionTip= false 设置为 false 以阻止 vue 在启动 ...

  10. Leetcode 114.二叉树展开为链表

    二叉树展开为链表 给定一个二叉树,原地将它展开为链表. 例如,给定二叉树 将其展开为: class Solution{ public: void flatten(TreeNode* root){ if ...