此问题的产生,主要是数据库的字段名一样导致

三张表 DOCTOR JOB OBJECT

有问题的查询语句和查询结果是:

SELECT d.*,j.*,o.* from

(select d.*,rownum r from DOCTOR d where rownum<=6) d

join job j on d.job_id=j.id join object o on o.id=d.object_id

where r>0

注意 :查询结果中有6列是一样的id,name

修改为别名

SELECT d.*,j.name jobn,j.id jid,j.oid joid,o.id objid,o.name objn from

(select d.*,rownum r from DOCTOR d where rownum<=6) d

join job j on d.job_id=j.id join object o on o.id=d.object_id

where r>0

新的查询结果是: 注意看列名

此时依然不能解决数据重复问题,还需要修改resultMap的column属性名为别名

至此问题全部解决!

补充:Mybatis连3表查询数据resultMap结果映射

一、前言

MyBatis是基于“数据库结构不可控”的思想建立的,也就是我们希望数据库遵循第三范式或BCNF,但实际事与愿违,那么结果集映射就是MyBatis为我们提供这种理想与现实间转换的手段了,而resultMap就是结果集映射的配置标签了。

二、从SQL查询结果到领域模型实体

在深入ResultMap标签前,我们需要了解从SQL查询结果集到JavaBean或POJO实体的过程。

1. 通过JDBC查询得到ResultSet对象

2. 遍历ResultSet对象并将每行数据暂存到HashMap实例中,以结果集的字段名或字段别名为键,以字段值为值

3. 根据ResultMap标签的type属性通过反射实例化领域模型

4. 根据ResultMap标签的type属性和id、result等标签信息将HashMap中的键值对,填充到领域模型实例中并返回

三、ResultMap标签

1. 属性说明

id属性 ,resultMap标签的标识。

type属性 ,返回值的全限定类名,或类型别名。

autoMapping属性 ,值范围true(默认值)|false, 设置是否启动自动映射功能,自动映射功能就是自动查找与字段名小写同名的属性名,并调用setter方法。而设置为false后,则需要在`resultMap`内明确注明映射关系才会调用对应的setter方法。

2. 基本作用:建立SQL查询结果字段与实体属性的映射关系信息

示例1:通过setter构造领域模型

public class EStudent{

private long id;

private String name;

private int age;

// getter,setter方法

/**

* 必须提供一个无参数的构造函数

*/

public EStudent(){}

}

SELECT ID, Name, Age

FROM TStudent

子元素说明:

id元素 ,用于设置主键字段与领域模型属性的映射关系

result元素 ,用于设置普通字段与领域模型属性的映射关系

示例2:通过构造函数构造领域模型

public class EStudent{

private long id;

private String name;

private int age;

// getter方法

public EStudent(long id, String name, int age){

this.id = id;

this.name = name;

this.age = age;

}

}

SELECT ID, Name, Age

FROM TStudent

子元素说明:

constructor元素 ,指定使用指定参数列表的构造函数来实例化领域模型。注意:其子元素顺序必须与参数列表顺序对应

idArg子元素 ,标记该入参为主键

arg子元素 ,标记该入参为普通字段(主键使用该子元素设置也是可以的)

3. 一对一关系、一对多关系查询这里不多说

注意:在采用嵌套结果的方式查询一对一、一对多关系时,必须要通过resultMap下的id或result标签来显式设置属性/字段映射关系,否则在查询多条记录时会仅仅返回最后一条记录的情况。

4. 动态映射关系信息

通过 discriminator子元素 (鉴别器)可以实现动态映射关系信息的设置。具体示例如下:

public class EStudent{

private long id;

private String name;

private String juniorHighSchool;

private String seniorHighSchool;

private int during; // 在本校就读时间

// getter,setter方法

/**

* 必须提供一个无参数的构造函数

*/

public EStudent(){}

}

情景:查询学生信息的seniorHighSchool信息,若就读时间during字段值为4、5、6时,则以juniorHighSchool字段作所为seniorHighSchool信息。

SELECT ID, Name, JuniorHighSchool, SeniorHighSchool, during

FROM TStudent

// 若不加这句,则当将juniorHighSchool赋予给seniorHighSchool属性时,juniorHighSchool属性将为null

// 形式1:通过resultType设置动态映射信息

// 形式2: 通过resultMap设置动态映射信息

注意:上面关于 discriminator子元素 的 case元素 的 resultType属性 和 resultMap元素 的 type属性 ,均不是直指返回的领域模型类型,而是指定根据判断条件后得到映射关系,可通过 id子元素 和 result子元素 重写映射关系。

5. id元素,result元素,idArg元素,arg元素,discriminator元素的共同属性

javaType属性 :Java类的全限定名,或别名

jdbcType属性 :JDBC类型, JDBC类型为CUD操作时列可能为空时进行处理

typeHandler属性 :指定类型处理器的全限定类名或类型别名

column属性 :指定SQL查询结果的字段名或字段别名。将用于JDBC的 resultSet.getString(columnName)

四、总结

掌握上述内容,那么在写一对一关系、一对多关系查询时就更有把握了哦!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持云海天教程。如有错误或未考虑完全的地方,望不吝赐教。

mysql三表查询数据重复_解决mybatis三表连接查询数据重复的问题相关推荐

  1. 周末杂谈:在MYSQL中,添加数据行后,使用右外连接查询所有课程的选修情况,要求列出课程编号、课程名称、选修人数,表中没有的课程列值为空的解决方法

    周末杂谈:在MYSQL中,添加数据行后,使用右外连接查询所有课程的选修情况,要求列出课程编号.课程名称.选修人数,表中没有的课程列值为空的解决方法 实验前期准备 course表(课程表) 在其中: c ...

  2. 数据科学家数据分析师_站出来! 分析人员,数据科学家和其他所有人的领导和沟通技巧...

    数据科学家数据分析师 这一切如何发生? (How did this All Happen?) As I reflect on my life over the past few years, even ...

  3. c# 访问hbase_大数据技术之C#通过Thrift连接查询HBase主要方法总结

    本篇文章探讨了大数据技术之C#通过Thrift连接查询HBase主要方法总结,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. 1.get(byte[] tableName,byt ...

  4. mysql杠杆加号什么意思_对tb_book表中的数据,按ID序号进行升序排列,查询语句是什么?_学小易找答案...

    [单选题]修改数据库表结构用以下哪一项 ( ) [单选题]对于一个微小物理量,通常采用将其进行放大的方法实现测量,以下哪个不是物理实验方法? [单选题]扭摆实验中,为了测出金属匀质细杆绕质心对称轴的转 ...

  5. mysql不同服务器查询_实战操作SQL Server连接查询不同服务器表数据

    今日产品部要导批数据,但是需要连接查询查询的几个表不在同一服务器上.所以我开始是这么干的: 1.查询一台服务器的数据,并导入本地Excel 2.查询另一台服务器的数据,并导入本地Excel 3.Exc ...

  6. mysql 查询语句超时_解决SQL查询总是 超时已过期

    1.由于数据库设计问题造成SQL数据库新增数据时超时 症状: Microsoft OLE DB Provider for SQL Server 错误 '80040e31' ([ODBC SQL Ser ...

  7. mysql delete语句非常耗时_解决项目中MySQL数据库执行删除语句时间太长的问题

    问题描述: 由于业务需求,需要删除一些重复数据.即删除openid对应的2条数据,最终只保留一行. MySQL数据库,sql语句比较简单:删除数据前,备份数据是必须的! 先来错误的演示: 1.先把错误 ...

  8. 千万级别数据查询优化_从千万级数据查询来聊一聊索引结构和数据库原理

    在日常工作中我们不可避免地会遇到慢SQL问题,比如笔者在之前的公司时会定期收到DBA彪哥发来的Oracle AWR报告,并特别提示我某条sql近阶段执行明显很慢,可能要优化一下等.对于这样的问题通常大 ...

  9. mysql cpu高 重启无效_解决mysqlcpu高的问题

    参考: cpu消耗过多是由于SQL缓慢所致.慢速SQL包括全表扫描,太多扫描数据,内存排序,磁盘排序,锁争用等: mysql>显示进程列表: 查看所有连接 现象SQL的执行状态为:发送数据,复制 ...

最新文章

  1. 阿里云API网关(8)开发指南-SDK下载
  2. Scikit Learn: 在python中机器学习
  3. 华为android8适配进度,华为 荣耀 O版本(Android 8.0)适配进度公告
  4. linux c数字转字符串函数,Linux常用C函数—字符串转换篇
  5. 通信基站c语言,[转]2015年数学建模C题–基于无线通信基站的室内三维定位问题...
  6. 软件测试黑马程序员课后答案_软件测试教程课后答案
  7. (45)FPGA面试题格雷码特点及其应用
  8. python从零开始到放弃_Python 协程从零开始到放弃
  9. WebView控件中的javascript与Android本地功能交互
  10. PyCharm中导入数据分析库
  11. 如何授权您的Mac播放AppleMusic?
  12. Linux配置自建 YUM 软件存储库
  13. SAP ALV 负号前置
  14. 什么是超级浏览器?有什么作用?如何选择?
  15. 小度计算机笔记,开售告罄、口碑炸裂、高语音交互率的小度耳机全新升级语音笔记...
  16. Scalar-multiplication算法集
  17. mac装linux系统u盘安装教程视频,mac上制作linux系统U盘安装盘
  18. 韦一之内存控制器,2440地址空间,NOR flash和SDRAM(012课)
  19. Android -- MediaRecorder录制短视频
  20. 一张交货单多次POD以及多次开票

热门文章

  1. CPU状态信息us,sy,ni,id,wa,hi,si,st含义
  2. EditText禁止输入回车
  3. 方格分割 蓝桥杯心得
  4. Python之操作RabbitMQ
  5. 看博客学学Android(十三)
  6. iOS 4.2 SDK安装
  7. 修改sqlplus中显示时间日期的格式
  8. 华中科技大学计算机通信与网络实验,华中科技大学计算机通信与网络实验报告Socket编程实验.docx...
  9. qtp9.2测试java_QTP的使用举例说明
  10. c++语言函数大全,C++函数