Mybatis高级查询之一对一查询的四种方法
目录
1. 一对一查询
1.1-1.3 我们假设场景为用户和角色一对一,根据数据库基本原理,我们把外键设置在用户一边,即在实体类中添加角色这个属性。
1.1 一对一嵌套结果查询
1.1.1嵌套结果查询的核心思想
- 核心思想:直接用slect标签通过数据库字段和实体类字段的自动映射。
- 首先在select语句中指明映射关系。
- 然后我们看resultType的值是一个实体类。
- 自动映射到实体类。
- 应用在场景中:我们假设用户和角色之间是一对一,在用户类中一个属性是角色 sysrole类型的,查询用户的时候把所归属的角色查询出来,那么其就可以写成如图所示。
- user_name userName代表数据库字段和实体类中字段
r.id "role.id"此处是通过别名映射的,role是什么?是声明在user类中属性。
1.1.2 嵌套结果查询优缺点
- 什么是?通过了一次查询把结果映射到了不同对象里。
- 好处是什么?减少了数据库查询次数,减少了数据库的压力。
- 坏处是什么?要写复杂的SQL,不容易写对,由于要映射到不同的对象中,一定程度上增加了服务器的压力。
1.2 使用resultMap配置一对一映射
1.2.1 具体应用过程
我们在1.1中使用的方法是直接在select标签中直接写后自动映射到实体类,resultType返回类型是一个实体类。还有一种方法是在xml文件中的标签配置关系,然后再在select的resultType指定返回resultMap。详细如图所示:
property是实体类字段名,colum是数据库字段名。此处resultMap这个标签是定义了一种映射关系集合,这个集合的类型对应实体类User,所以type指定了一个实体类。同样我们在property中仍可以使用别名.字段的方法,同1.1。
那么我们来看,select语句是怎么写的。
1.2.2 注意事项
注意的是:去掉了数据库字段,直接用实体类属性查询。至于那个别名问题,暂时还没有想到会出现的场景,只需记住若是使用别名别名和resultMap的column一致。
1.2.3 简化写法
首先我们看这张图
在实际的场景中我们一般会单独为user写一个映射文件(这个映射文件通常是自动生成工具生成的)里面,resultMap会写成如图所示。这时候,我们要加一个嵌套查询的方法,那么resultMap需要添加一个?这时候我们要在写一个,如1.2.1图,我们会发现有好多重复的内容。如下图所示。
这个时候,我们引入一种继承(增加extend属性)机制。改成如下图所示。
1.3 使用resultMap的association标签配置一对一映射
- 在这里我们使用了association那么property中就直接写属性名就可以。
- 这里我们配置了列的前缀,则在Column就可以省略,但是select就要更改如下。
- 关于association的resultMap属性应用场景
我们可以把角色的关联单独拿出来。
把这部分单独放到一个resultMap标签中,然后直接代用即可。
- 注意事项
- 同xml可以使用ID,不在同一xml用全类名+ID如上图。
1.4 association标签查询(懒加载)
此处我们假设场景是新的,用户和博客存在一对一关系,按照数据库设计的基本原理,我们再user中设置外键指向blog表,对应实体类就是user类中增加Blog类型的blog属性。
1.4.1 与前1.1-1.3三种方式的区别
- 前三种方式都是复杂查询
- 前三种方式都是一次性复杂查询,映射到不同的对象中。
- 此种方法可以理解为简单查询,后再根据业务逻辑手动查询关联对象,所以出现了急速加载和懒加载的概念。
1.4.2 具体实例
association中的属性介绍
- select:从查询ID
- column:从查询入参=主查询字段名,见图。可以包含多个用{查询入参=主查询字段名,....}
- fetchType:数据加载方式
查询语句执行顺序
- 执行主查询->执行从查询
- 先查出用户,然后根据用户中的blogId去执行从查询,依次轮流有多少用户查多少次主查询->从查询,主查询->从查询,主查询->从查询,主查询->从查询......
存在问题
- 如果我们查出来从查询的数据,即博客,这个数据并没有用呢?
- 如果我们用户查询主查询用户有N个,则需要执行N次查询,每次主查询会再查询依次从查询,则会出现N+1的问题。(其实就是eager加载问题对比JPA)
解决方法
- 增加fetchtype属性设定为eager,这样只有我们在getBlog()方法才会执行从查询。
我们观察运行结果,会出现从查询依旧会被执行,而不是再调用getBlog方法才执行。
原因及解决方法 :在mybatis全局配置中有一个属性aggressive-lazy-loading: false,这个参数默认为true,即如果为true,不管你是否设置lazy都会全部加载。
- 懒加载注意事项
- 当我们设置好aggressive-lazy-loading: false,我们如果想进行从查询呢?
Mybatis高级查询之一对一查询的四种方法的更多相关文章
- MyBatis 高级查询之一对一查询(九)
高级查询之一对一查询 查询条件:根据游戏角色ID,查询账号信息 我们在之前创建的映射器接口 GameMapper.java 中添加接口方法,如下: /** * 根据角色ID查询账号信息 * @para ...
- mybatis学习笔记(10)-一对一查询
mybatis学习笔记(10)-一对一查询 标签: mybatis mybatis学习笔记10-一对一查询 resultType实现 resultMap实现 resultType和resultMap实 ...
- 【Mybatis高级映射】一对一映射、一对多映射、多对多映射
前言 当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射.对于SSM的Mybatis来说,肯定也是差不多的.既然开了 ...
- MSSQL·查询T-SQL语句执行时间的三种方法
阅文时长 | 0.23分钟 字数统计 | 420.8字符 主要内容 | 1.引言&背景 2.自定义时间变量求差法 3.MSSQL内置方法 4.MSSQL选项开启时间统计 5.声明与参考资料 『 ...
- 织梦DedeCMS模板防盗的四种方法
织梦(DedeCMS)模板也是一种财富,不想自己辛辛苦苦做的模板被盗用,在互联网上出现一些和自己一模一样的网站,就需要做好模板防盗.本文是No牛收集整理自网络,不过网上的版本都没有提供 Nginx 3 ...
- mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法
[CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问 ...
- node.js取参四种方法req.body,req.params,req.param,req.body
参考:https://my.oschina.net/u/2519530/blog/535309 获取请求很中的参数是每个web后台处理的必经之路,nodejs的 express框架 提供了四种方法来实 ...
- oracle增加表空间的四种方法
1. 查看所有表空间大小 select tablespace_name,sum(bytes)/1024/1024 from dba_data_files group by tablespace_nam ...
- nodejs取参四种方法req.body,req.params,req.param,req.body
摘要: nodejs取参四种方法req.body,req.params,req.param,req.body 获取请求很中的参数是每个web后台处理的必经之路,nodejs提供了四种方法来实现. 获取 ...
- 67.nodejs取参四种方法req.body,req.params,req.param,req.body
转自:http://www.cnblogs.com/jkingdom/p/8065202.html 摘要: nodejs取参四种方法req.body,req.params,req.param,req. ...
随机推荐
- 战争热诚的python全栈开发之路
从学习python开始,一直是自己摸索,但是时间不等人啊,所以自己为了节省时间,决定报个班系统学习,下面整理的文章都是自己学习后,认为重要的需要弄懂的知识点,做出链接,一方面是为了自己找的话方便,一方 ...
- MySQL性能调优——锁定机制与锁优化分析
针对多线程的并发访问,任何一个数据库都有其锁定机制,它的优劣直接关系着数据的一致完整性与数据库系统的高并发处理性能.锁定机制也因此成了各种数据库的核心技术之一.不同数据库存储引擎的锁定机制是不同的,本 ...
- 利用Django进行Web开发
Web就是用来表示Internet主机上供外界访问的资源的.网页也统称为web资源.Internet上供外界访问的Web资源主要分为如下两类: 静态web资源:指web页面中供人们浏览的数据始终是不变 ...
- 多个DbContext修改同一张表测试
多个DbContext修改同一张表经测试是可行的. UserStore和DepartmentStore都可以向SysLog表写入数据 用多个线程同时通过UserStore和DepartmentStor ...
- SSM-SpringMVC-17:SpringMVC中深度剖析HandlerAdapter处理器适配器底层
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 先放一张图 很熟悉啊,之前就看过,我们之前已经把handlerMapping剖了个底朝天,顺着上次的进度,继 ...
- 探讨SELECT语句的元数据&动态取样&读一致性导致的一致性读和递归操作
前几天,论坛上的同行在讨论SELECT语句的元数据,动态取样和读一致性导致的一致性读和递归问题,今天有时间,就试着进行了测试,本人测试环境如下: win7_64+Oracle11.2.0.4_64 那 ...
- 静态代码扫描工具PMD定制xml的规则(一)操作篇
0.前言 PMD作为开源的静态代码扫描工具有很强的扩展能力,可使用java或xpath定制rule.第一篇从操作上讲解如何定制一个用于扫描xml是否规范的规则.首先我们知道xml格式的文件在java工 ...
- python实现简体中文和繁体相互转换
1. opencc-python 如果目录上的链接被屏蔽了,请手动复制 https://pypi.python.org/pypi/opencc-python/ 首先介绍opencc的python实现库 ...
- 用python对比两张图片的不同
from PIL import Image from PIL import ImageChops def compare_images(path_one, path_two, diff_save_lo ...
- java的Junit的用法(转发)
初级https://blog.csdn.net/andycpp/article/details/1327147/ 中级https://blog.csdn.net/andycpp/article/det ...