1 解决列名和属性名不一致问题

如果查询时使用 resultType 属性, 表示采用 MyBatis 的Auto-Mapping(自动映射)机制, 即相同的列名和属性名会自动匹配. 因此, 当数据库表的列名和类的属性名不一致时, 会导致查不到数据.

如下图:

运行结果:

解决该问题可以有两种方式:

(1)列别名

查询时, 可以通过列别名的方式将列名和属性名保持一致, 继续使用自动映射,从而解决该问题. 但是较为麻烦. 不推荐使用

(2)使用<resultMap>标签

<resultMap>用于自定义映射关系, 可以由程序员自主制定列名和属性名的映射关系. 一旦使用 resultMap, 表示不再采用自动映射机制.

2 多表关联查询

首先建立两张表----学生表和班级表

如下:

(1) 业务装配实现多表查询(多对一)

其实业务装配是将两个单表查询组合到一起,在业务装配时引进service层

注意: 在实现业务装配时,出现多个异常问题

首先, 在mapper中创建两个接口之后,核心配置文件的扫描设置仍然是扫描单个文件导致出现异常

然后, 就是在ClazzMapper.xml和StudentMapper.xml文件中两个sql语句写反,导致绑定时出现问题

最后, 就是一个最严重的问题,就是表中的名称t_students 在StudentMapper.xml文件的sql语句中写成了t_student 导致在运行结果无法显示

所以!谨记!!!能粘贴的一定不要手写!!!!

(1.1)实体类

创建班级类(Clazz)和学生类(Student), 并在 Student 中添加一个 Clazz 类型的属性, 用于表示学生的班级信息.

(1.2)mapper层

提供StudentMapper和ClazzMapper, StudentMapper查询所有学生信息, ClazzMapper 根据编号查询班级信息.

(1.3)service层 ---业务装配

调用 mapper 层, 先查询所有学生, 再根据每个学生的班级编号查询班级信息, 手动进行组装, 称之为业务装配.

这一点要理解:

//通过获取学生中cid班级号来查询班级信息,再将班级信息放到学生信息里

student.setClazz(clsMapper.selectById(student.getCid()));

(1.4) 测试代码

业务装配的优缺点:

sql语句很简单,但是代码使用太多,需要手动装配

(2)通过mybatis完成的多表查询,称之为N+1查询 -- 依赖于resultMap标签

核心思想仍然属于业务装配

注意: 1)在这里也出现异常,因为忘了修改StudentMapper.xml 的resultMap="smap"

如下:

2)重复的映射关系,同名时可以省略,但只能在N+1关系中省略,在其他关系中即使同名也不能省略

(2.1)在mapper层中

提供StudentMapper和ClazzMapper, StudentMapper查询所有学生信息, ClazzMapper 根据编号查询班级信息.在StudentMapper 中使用<association>设置装配.

a) <association>用于关联一个对象

property: 指定要关联的属性名

select: 设定要继续引用的查询, namespace+id

column: 查询时需要传递的列

(2.2)service 层

由于装配已经完成, service 层只需要调用 mapper 即可, 不需要再进行装配了.

如图:

以上两种方法的缺点是:执行的代码太多

因此可以使用resultMap的关联方式实现多表查询(多对一)

(3) resultMap 的关联方式实现多表查询(多 对一)

(3.1)mapper层

a) 在 StudentMapper.xml 中定义多表连接查询 SQL 语句, 一次性查到需要的所有数据, 包括对应班级的信息.

b) 通过<resultMap>定义映射关系, 并通过<association>指定对象属性的映射关系. 可以把<association>看成一个<resultMap>使用. javaType 属性表示当前对象, 可以写全限定路径或别名.

注意:<association property="clazz" javaType="clazz">

这里的两个clazz其实意义并不相同:前面clazz指的是名字,而后面指的时类型

外面一层resultMap用来设定student的属性,而里面的<association>再为student的clazz属性赋值

总结:N+1方式查询每条sql语句都很简单,但是代码复杂,每次都要装配

而关联方式的多表查询,sql语句复杂一些,值查询一次所有数据就会出现,也不需要再在mapper中添加class文件

(4)resultMap的N+1方式实现多表查询(一对多)

(4.1)实体类

在班级类中定义一个学生集合,用于存放该班级的所有学生的信息

(4.2)mapper层

提供ClazzMapper和StudentMapper, ClazzMapper查询所有班级信息, StudentMapper 根据班级编号查询学生信息. 在 ClazzMapper 中使用<collection>设置装配.

a) <collection>用于关联一个集合

property: 指定要关联的属性名

select: 设定要继续引用的查询, namespace+id

column: 查询时需要传递的列

如图:

(4.3)server层

(5)resultMap的关联方式实现多表查询(一对多)

(5.1)mapper层

a) 在 ClazzMapper.xml 中定义多表连接查询 SQL 语句, 一次性查到需要的所有数据, 包括对应学生的信息.

b) 通过<resultMap>定义映射关系, 并通过<collection>指定集合属性泛型的映射关系. 可以把<collection>看成一个<resultMap>使用. ofType 属性表示集合的泛型, 可以写全限定路径或别名.

如图:

(6)通过Auto_Mapping实现多表查询 --自动映射查询

a) 通过 MyBatis 的 Auto-Mapping 机制及数据库查询时的别名结合, 可以方便的实现多表查询.

b) SQL 语句中, 别名出现特殊符号时, 必须进行处理. MySQL可以使用(``)符号, Oracle 可以使用("")符号.

(6.1)mapper

所以Auto_Mapping实现多表查询优点是代码很少,方便查询

缺点是: sql语句书写非常严格,不能出一点问题,而且在起别名时必须使用``符号

如图:

mybatis 多表关联查询_Java修行第041天--MyBatis框架(下)--多表查询相关推荐

  1. mybatis jar包_Java修行第039天---Mybatis框架

    1.掌握框架的概念 (1)框架是什么 a)框架直白来说就是偷懒的程序员将代码进行封装,之后重复使用的过程 b)框架属于半成品 c)在使用框架时,需要告诉框架需要的信息.通常以配置文件的方式告知,一般来 ...

  2. Linux查询MySQL用户名密码_请教,linux下mysql如何查询用户的密码

    匿名用户 1级 2016-04-23 回答 linux忘记mysql密码处理方法,下面提供了5种linux忘记mysql密码找回方法哦. 方法一: # /etc/init.d/mysql stop # ...

  3. mysql面试关联查询语句_MySQL百万级、千万级数据多表关联SQL语句调优

    作者:成金之路 www.cnblogs.com/uttu/p/6384541.html 本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使百万级.千万 ...

  4. jpa多表关联查询_JPA【关联查询篇】

    摘要:本文主要介绍JPA的多表关联查询(一对一.一对多.双向关联.多对一.多对多)以及N+1查询的优化. 1. JPA多表关联查询 多表关联查询就是实现使用一个实体类对象操作或者查询多个表的数据. 配 ...

  5. 使用Mongoose populate实现多表关联存储与查询,内附完整代码

    文章目录 使用Mongoose populate实现多表关联与查询 一. 数据模型创建 1. 创建一个PersonSchema 2. 创建一个StorySchema 3. 使用Schema创建对应的m ...

  6. MySQL百万级、千万级数据多表关联SQL语句调优

    本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使百万级.千万级数据表关联查询第一页结果能在2秒内完成(真实业务告警系统优化结果). 希望读者能够理解 ...

  7. HubbleDotNet 开源全文搜索数据库项目--为数据库现有表或视图建立全文索引(三) 多表关联全文索引模式...

    关系型数据库中,多表关联是很常见的事情,HubbleDotNet 可以对部分情况的多表关联形式建立关联的全文索引,这样用户就不需要专门建一个大表 来解决多表关联时的全文索引问题. 下面以 为数据库现有 ...

  8. mysql俩个表之间关联语法_MySQL多表关联SQL语句调优

    本文不涉及复杂的底层数据结构,是通过explain解释SQL,并根据当前可能出现的情况,来做具体的优化,使百万级.千万级数据表关联查询第一页结果能在几秒内完成(真实业务告警系统优化结果).希望对您有一 ...

  9. ef oracle 批量更新慢_详解Oracle中多表关联批量插入、批量更新与批量删除

    概述 今天主要介绍一下Oracle数据库中多表关联批量插入.多表关联批量更新和多表关联批量删除.下面用实验来理解下~ 一.创建必须的表和序列语句 --创建部门表 dept:CREATE TABLE d ...

最新文章

  1. 普通话计算机考试相关信息,普通话考试常见问题有哪些
  2. python使用pip安装本地包-Python之pip使用详解|附第三方库安装总结
  3. 中石油训练赛 - Isomorphic Inversion(哈希+贪心)
  4. Python学习十大良好习惯
  5. [再寄小读者之数学篇](2014-12-24 乘积型不等式)
  6. swiper根据图片切换不同的背景色
  7. jQuery通过event获取点击事件的事件对象
  8. Android视频录制
  9. 计算网路地址,广播地址,第一位和最后一位可用地址,可用的IP地址
  10. JS中常用的函数求和方法总结【五种方法】
  11. 怎么恢复计算机隐藏的桌面图标,怎么把桌面图标隐藏 win10桌面怎么找回我的文档图标?...
  12. 【STM32F407的DSP教程】第28章 FFT和IFFT的Matlab实现(幅频响应和相频响应)
  13. Photoshop切图简单设置+工具介绍+以及切图方法
  14. [渗透测试][Kali]对DC-2靶机进行渗透测试
  15. 基于对抗训练的轨迹预测半监督算法(美国西北大学和加州尔湾分校)
  16. Sumo入门和Traci接口使用
  17. jquery的在线api
  18. Java面试宝典(问题史上最全,总结最好)
  19. 手把手教你利用Python轻松拆分Excel为多个CSV文件
  20. 代码随想录算法训练营第二天 | 力扣977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

热门文章

  1. python3.3使用tkinter实现猜数字游戏代码
  2. 脚本实现补丁安装自动化
  3. threadingdaemonmultiprocessing
  4. 夺命雷公狗---微信开发09----玩转单图文消息回复
  5. 在Ubuntu中安装MySQL (转载)
  6. 树莓派 libcurl安装
  7. C++_类和对象_对象特性_类对象做为类的成员---C++语言工作笔记046
  8. C++_类和对象_对象特性_拷贝构造函数调用时机---C++语言工作笔记042
  9. Elasticsearch--Docker安装ES---全文检索引擎ElasticSearch工作笔记002
  10. SpringCloud工作笔记037---spring cloud-zuul的Filter详解