一对一

在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. (转)ldd 查看程序依赖库

    原文:https://blog.csdn.net/u010977122/article/details/52993560?spm=a2c4e.11153940.blogcont551034.8.4f7 ...

  2. Vundle,Vim 的 Bundle(转)

    长久以来,我管理 Vim 配置的方式都非常原始—— zip 打包,然后发到邮箱上.偶尔会发生忘记备份,或者配置混淆的状况,不过由于懒筋发作,竟然这个方案就这么用了两年. 终有一天,我觉得这个方法太笨了 ...

  3. java文件上传-原始的Servlet方式

    前言: 干了这几个项目,也做过几次文件上传下载,要么是copy项目以前的代码,要么是百度的,虽然做出来了,但学习一下原理弄透彻还是很有必要的.刚出去转了一圈看周围有没有租房的,在北京出去找房子是心里感 ...

  4. springboot设置静态资源不拦截的方法

    springboot设置静态资源不拦截的方法 springboot不拦截静态资源需配置如下的类: import org.springframework.context.annotation.Confi ...

  5. Types方法之upperBound-lowerBound-isUnbounded-containsType

    1.upperBound(Type t)方法 /** * The "rvalue conversion". * The upper bound of most types is t ...

  6. sql返回行id

    1.sql语句中 insert into tableName() output inserted.id values() 2 .存储过程中 ALTER PROCEDURE dbo.getBuyMedi ...

  7. filebeat output redis 报错 i/o timeout

    filebeat output  redis 报错 i/o timeout 先把报错内容贴出来. ERROR redis/client. go: Failed to RPUSH to redis li ...

  8. 正则表达式最后的/i是不区分大小写的意思

    eg: "/\/*install$/i" 正则表达式 代表什么意思   /表达式的内容/ ,php中的正则表达式都必须在 / / 内 \/是匹配"/" 号,*号 ...

  9. 玩转mongodb(二):mongodb基础知识

    常用基本数据类型: null null用于表示空值或者不存在的字段: {"data":null} 布尔型 布尔类型只有两个值,true和false: {"data&quo ...

  10. mongodb int型id 自增

    mongo的c#客户端提供了接口IIdGenerator,有guid和objectid等几种实现,但没有int型id的实现 接口主要2个方法,一个IsEmpty返回bool,判断当前id值是否是空(估 ...