一对一

在SysUser 类中增加SysRole字段。
1、sql语句将role.role_name映射到role.roleName上。


2、还可以在XML 映射文件中配置结果映射。
<resultMap id="userRoleMap" type ="SysUser"〉
<id property="id" column="id"/>
<result property="userName" column="use_name"/>
<result property="userPassword" column="user_password" />
<result property="role.id" column ="role_id"/>
<result property="role.roleName" column="role_name"/>
<result property="role.createTime" column="role_create_time" jdbcType="TIMESTAMP"/>
</resultMap>
为了避免不同表中存在相同的列,如create_time, 在它前面增加了"role_"前缀。


3、MyBatis是支持resultMap继承,因此可以简化上面的resultMap配置
<resultMap id= "userRoleMap" extends= "userMap" type= "SysUser">
<result property= "role.id" column="role_id "/>
<result property= "role.roleName" column= "role_name"/>
<result property= "role.createTime" column ="role_create_time" jdbcType= "TIMESTAMP"/>
</resultMap>


4、使用resultMap的association标签配置
<resultMap id= "userRoleMap" extends= "userMap" type= "SysUser">
<association property="role" columnPrefix="role_" javaType="SysRole">
<result property= "id" column="role_id "/>
<result property= "roleName" column= "role_name"/>
<result property= "createTime" column ="create_time" jdbcType= "TIMESTAMP"/>
</association>
</resultMap>
association标签的属性property对应实体类中的属性名,必填项。另外我们还配置了columnPrefix="role_",在写SQL的时候,和sys_role表相关的查询列的别名都要有"role_"前缀,在内部result配置column时,需要去掉前缀。sql:r.id role_id, r.role_name role_role_name, r.create_time role_create_time。


5、使用association 配置时还可以使用resultMap 属性配置成一个已经存在的resultMap
<resultMap id= "roleMap" type = "SysRole">
<id property="id" column="id"/>
<result property="roleName" column= "role_name"/>
<result property="createTime" column="create_time" jdbcType = "TIMESTAMP"/>
</resultMap>
<resultMap id="userRoleMap" extends= "userMap" type="SysUser">
<association property="role" columnPrefix="role_" resultMap="roleMap"/>
</resultMap>
MyBatis 默认会给 roleMap 添加当前命名空间的前缀,代码如下,test.mybatis.simple.mapper.UserMapper.roleMap。目前的 roleMap 是写在UserMapper.xml中的,其实更合理的位置应该是在RoleMapper.xml中。将roleMap移动到RoleMapper.xml中后,这里的userRoleMap就不能简单地指定为roleMap了,而是要修改为以下的样子。
<resultMap id="userRoleMap" extends= "userMap" type="SysUser">
<association property="role" columnPrefix="role_" resultMap="test.mybatis.simple.mapper.RoleMapper.roleMap"/>
</resultMap>
上面的情况都是一种情况,这种方式的好处是减少数据库查询次数,减轻数据库的压力。缺点是由于要在应用服务器上将结果映射到不同的类上,因此也会增加应用服务器的压力。当一定会使用到嵌套结果,并且整个复杂的SQL执行速度很快时,建议使用这种方法。


还可以利用简单的SQL 通过多次查询转换为我们需要的结果,最后会将结果组合成一个对象。

<resultMap id = "userRoleMapSelect" extends = "userMap" type= "SysUser">
<association property="role" column="{id=role_id}" select="test.mybatis.simple.mapper.RoleMapper.selectRoleById" />
</resultMap>
<select id="selectUserAndRoleByIdSelect" resultMap="userRoleMapSelect">
select u.id, u.user_name, u.user_password, u.user_email, u.user_info,u.head_img, u.create_time,
ur.role_id
from sys_user u
join sys_user_role ur on u.id = ur.user_id
where u.id= #{id}
</select>
association 属性 select :另一个查询的id, MyBatis 会额外执行这个查询。
column :列名(或别名),将主查询中列的结果作为嵌套查询的参数,配置方式如 column = {propl=coll , prop2=col2}。
fetchType :数据加载方式,可选值为lazy 和eager,分别为延迟加载和积极加载,这个配置会覆盖全局的lazyLoadingEnabled 配置。

问题:如果主查询结果不是1条数据,而是N条数据,那就会出现N+1问题。主SQL 会查询一次,查询出N 条结果,这N条结果要各自执行一次查询,那就需要进行N次查询。


解决办法:fetchType="lazy"
<resultMap id = "userRoleMapSelect" extends = "userMap" type= "SysUser">
<association property="role" column="{id=role_id}"
  select="test.mybatis.simple.mapper.RoleMapper.selectRoleById" fetchType="lazy"/>
</resultMap>
<select id="selectUserAndRoleByIdSelect" resultMap="userRoleMapSelect">
  select u.id, u.user_name, u.user_password, u.user_email, u.user_info,u.head_img, u.create_time,
  ur.role_id
from sys_user u
  join sys_user_role ur on u.id = ur.user_id
  where u.id= #{id}
</select >

mybatis 一对一 映射实体类、嵌套查询的更多相关文章

  1. mybatis一对一 和 一对多 嵌套查询

    实际项目中的,接口对外VO  会出现 一对一 和 一对多的情况,举例:小区 下面有 楼栋  ,楼栋 下面有 房屋    ,   房屋里面又房间 小区Vo  : districtVo { id: nam ...

  2. Mybatis自动生成实体类和实体映射工具

    Mybatis Mysql生成实体类 用到的Lib包: mybatis-generator-core-1.3.2.jarmysql-connector-java-5.1.30.jar 1. 创建一个文 ...

  3. mybatis 通过实体类进行查询

    如果使用实体类进行查询, 不管会不会使用到 主键, 都必须设置主键, 才能查询 <select id="selectByAppidAndServerCode" resultM ...

  4. Mybatis一对一映射

    一.Mybatis一对一映射 本例讲述使用mybatis开发过程中常见的一对一映射查询案例.只抽取关键代码和mapper文件中的关键sql和配置,详细的工程搭建和Mybatis详细的流程代码可参见&l ...

  5. Hibernate框架学习之注解映射实体类

         前面的相关文章中,我们已经介绍了使用XML配置文件映射实体类及其各种类型的属性的相关知识.然而不论是时代的潮流还是臃肿繁杂的配置代码告诉我们,注解配置才是更人性化的设计,于是学习了基本的映射 ...

  6. 利用org.mybatis.generator生成实体类

    springboot+maven+mybatis+mysql 利用org.mybatis.generator生成实体类 1.添加pom依赖:   2.编写generatorConfig.xml文件 ( ...

  7. ibatis的xml中resultmap是实体类与查询结果的一个映射

    resultmap可以少于实体类的属性,但是resultmap中的映射列,必须在查询结果中有

  8. Mybatis自动生成实体类,映射文件,dao

    http://www.mybatis.org/generator/index.html 方法一:eclipse插件式 1.下载 mybatis-generator-core-1.3.2.jar 解压后 ...

  9. Mybatis自动生成实体类、dao接口和mapping映射文件

    由于Mybatis是一种半自动的ORM框架,它的工作主要是配置mapping映射文件,为了减少手动书写映射文件,可以利用mybatis生成器,自动生成实体类.dao接口以及它的映射文件,然后直接拷贝到 ...

随机推荐

  1. Python shutil模块(目录和文件操作)

    import shutil #导入shutil模块 copyfileobj方法 将类文件对象fsrc的内容复制到类文件对象fdst shutil.copyfileobj(fsrc, fdst[, le ...

  2. 微信小程序开发笔记2,底部导航栏tablebar

    底部导航(要在app.js里面配置,也就是把导航的代码写到app.js) 官方文档说最少2个导航最多5个 , "tabBar": { "color": &quo ...

  3. HBase 安装设置

    一.安装环境 1. JDK:jdk-7u79-linux-x64.tar.gz 2. HBase:hbase-0.98.13-hadoop1-bin.tar.gz 3. Hadoop:hadoop-1 ...

  4. (转)MySQL的Grant命令

    [MySQL] - MySQL的Grant命令 来源:http://yingxiong.javaeye.com/blog/451208 本文实例,运行于 MySQL 5.0 及以上版本. MySQL ...

  5. 维特比算法(Viterbi)-实例讲解(暴力破解+代码实现)

    1.简介 维特比算法是一个通用的求序列最短路径的动态规划算法,也可以用于很多其他问题,比如:文本挖掘.分词原理.既然是动态规划算法,那么就需要找到合适的局部状态,以及局部状态的递推公式.在HMM中,维 ...

  6. win10系统自带的浏览器ME如何将网页转成PDF

    不多说,直接上干货! 很多用户都已经开始玩上win10了,补充玩玩一些技巧,当作小灶. 不多废话,在windows 10网页是可以保存为pdf格式.具体如下: 欢迎大家,加入我的微信公众号:大数据躺过 ...

  7. nginx添加多站点

    1.登陆服务器2.修改ngnix配置文件3.重启ngnix4.测试是否添加成功 修改/nginx/conf/nginx.confviminclude /alidata/server/nginx/con ...

  8. 自然语言处理--Word2vec(一)

    一.自然语言处理与深度学习 自然语言处理应用 深度学习模型                       为什么需要用深度学习来处理呢 二.语言模型 1.语言模型实例: 机器翻译 拼写纠错        ...

  9. freepbx对接gms网关

    前面的文章阿里云使用镜像安装freepbx , 安装freepbx后创建sip分机 ,freepbx的SIP通话客户端X-lite Yate eyeBeam Linphone我们已经成功的创建好了分机 ...

  10. swiper在vue中的使用 及 神坑

    一.实例化和导入 import Swiper from 'swiper'; let viewSwiper; let previewSwiper; 在外面声明全局变量,然后在初始化方法里面实例化swip ...