Mybatis 查询语句结果集总结

Mybatis实现查询返回List《Map《String,Object》》格式数据(标题不让打尖括号) 背景: Mybatis的映射生成代码给我们的开发提供了很多方便,但是Mybatis生成的代码、查询语句和数据结构通常不能满足我们的开发需求。这就需要我们对mybatis查询结果集的形式和查询语句进行扩增和更改,将Mybatis的查询结果集返回为List<Map<String,Object>>可以为我们的正常开发提供很多方便。 操作: ... 阅读详情
13467292-9f2f3c7cc7415c15

简单查询-resultType

数据准备

表 Student

字段 注释 SNO 学号 SNAME 学生名字 SSEX 性别 SBIRITHDAY 生日 CLASS 班级

create table TEST.STUDENT

(

SNO varchar(3) not null,

SNAME varchar(4) not null,

SSEX varchar(2) not null,

SBIRTHDAY datetime null,

CLASS varchar(5) null

)


public class Student {

private String SNO;

private String SNAME;

private String SSEX;

private Date SBIRTHDAY;

private String CLASS;


...

}

例子

按照返回数据类型大致分为基础数据类型,JavaBean 和 Map。其中虽然返回的结果行数有单条也有多条,对应的接口返回类型是集合或者单个对象,但是在 xml 映射文件中,resultType 的值是相同的。

指定字段-基础数据类型

接口类:


String querySingleStudent();


List queryAllStudent();

Mapper 文件:


SELECT SNAME FROM TEST.STUDENT LIMIT 1


SELECT SNAME FROM TEST.STUDENT

Map,一般为 hashMap

接口类:


Map queryStudentMap();


List> queryAllStudentMap();

Mapper 文件:


SELECT SNAME FROM TEST.STUDENT LIMIT 1


SELECT SNAME FROM TEST.STUDENT

其中:

hashmap 为简写,也可以使用 java.util.HashMap 全称

默认情况下,结果集中值为 null 时, 不会增加映射对象的 setter 方法, (map 对象时为 put)。该行为可以在 mybatis-config.xml 配置文件中设置 覆盖默认设定。

JavaBean

接口类:


Student querySingleStudentBean();


List queryAllStudentBean();

Mapper 文件:


SELECT SNAME FROM TEST.STUDENT LIMIT 1


SELECT SNAME FROM TEST.STUDENT

resultType="student" 为 Student.java 的别名,也可以是全限定名。别名在 mybatis-config.xml 配置文件中设置:

...

但是如果 JavaBean 文件很多,不想一个个指定,也可以使用 package 标签 设置mybatis自动扫描,别名即为类名的小写。

复杂查询 resultMap

对于一般的查询语句,resultType 足够了。对于多表查询等情况,就要请出 resultMap 了。

数据库字段和 java 数据类型映射关系

数据库字段类型 jdbcType 和 java 数据类型 并不是一一对应的关系,而且不同数据库类型也不尽相同。而 mybatis 将 TypeHandler 作为两者之间的映射关系。大部分情况下都是没有问题的,但是并非能覆盖所有的情况,特殊情况下可以使用 resultMap 自定义这种映射关系。

举个例子,数据库 LongVarchar 字段类型对应 java 中的 String 类型。但是在 DB2 数据库中,查询的 LongVarchar 类型的字段,在 mybatis 中被识别成 jdbcType 为 BLOB。有两种解决方法,第一种是在 SQL 中对该字段使用 CAST 转换为 VARCHAR(长度)类型。另一种是使用 resultMap:

...

标签中使用 resultMap 指定返回集合。注意 resultMap 和 resultType 不能同时使用

标签

id 和 select 标签指定映射关系

type 和 resultType 一样为返回类型的全限定名或者别名

autoMapping 自动映射关系,在这里目的只是修改一个字段,其他自动采用自动完成映射关系

标签

property 为 java 变量名

column 为数据库字段名

jdbcType 这里指定为 VARCHAR

id

字段的映射关系的标签即有,也有,在 mybatis 文档中指出不使用id,会造成性能下降,因此将主键字段使用 id 标签是推荐的做法。但是如果不存在主键呢,当你在 ResultMap 只提供了部分字段而不是全部字段,即使使用了 autoMapping 属性,那么 mybatis 会按照你提供的字段名进行去重。那么在使用 resultMap 的时候,最优选择是:

如果表存在主键,就使用id标签指定

如果表不存在主键,要么不配置字段的映射关系,使用 autoMapping 属性自动映射;或者不使用 autoMapping 将所有字段罗列。

多表关联查询

在 resultType 的例子中都只涉及到一张表,如果涉及多张表关联查询呢。我们可以简单的将所有列映射到 hashmap 的键值上。

但是 HashMap 不是一个很好的领域模型。 你的程序更可能会使用 JavaBean 或 POJO(Plain Old Java Objects,普通 Java 对象)作为领域模型。

因此这里均采用 JavaBean 作为领域模型。增加一个成绩表 Score

字段 注释 SNO 学号 CNO 课程编号 DEGREE 成绩

create table SCORE

(

SNO varchar(3) not null,

CNO varchar(5) not null,

DEGREE decimal(10, 1) not null

)


public class Score {

private String SNO;

private String CNO;

private Double DEGREE;


...

}

一对一关系

这里的一对多关系是两个表字段一一对应,一个学生的某门课的成绩是唯一确定的。 在一一对应的情况下要在 resultMap 中使用 标签。

在 Student.java 中增加字段 Score


private Score score;

public Score getScore() {

return score;

}

public void setScore(Score score) {

this.score = score;

}

有两种使用情况,第一种为嵌套查询,即前一个 SQL 查询结果集中的字段作为参数传递给下一个 SQL。第二种情况为嵌套结果集,即两个表做关联查询,将结果集映射到多个 JavaBean 文件。

嵌套查询



select SNO,SNAME

from test.STUDENT


select degree from test.SCORE

where sno = #{sno}

在标签中

property 指向了 Student.java 中新增的 score 字段。

column 指定了作为参数传递给下一个查询SQL的字段,需要注意的是对于传递单个字段的情况,mybatis 只是简单的将 #{参数} 替换为占位符 ?, 然后执行 resultSet.getString(columnName),没有进行参数匹配,因此第二个 SQL 中 #{} 中写任何字符都可以;如果需要传递多个字段,使用 column = " {prop1=col1,prop2=col2} ",这种情况下会以参数对象的形式来传递。

select 指定了下一个 SELECT 语句

另外需要注意的是这种嵌套查询对于大型结果集和列名并友好,存在 N+1 的问题,因为下一条 SQL 会执行 N 次去循环查询,使用关联查询更合适。再者也可以开启 mybatis 的懒查询功能,嵌套的 SQL 不是一口气顺序执行完,而是在使用的时候才会执行下一条 SQL。例如执行student.getScore().getSNO()才会执行queryScore的 SQL。默认情况下没有开启,需要在配置文件中设置

设置参数 描述 默认值 lazyLoadingEnabled 延迟加载的全局开关,特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态 false aggressiveLazyLoading 当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载 false (true in ≤3.4.1)

也可以在标签中设置 fetchType = “lazy” 开启懒加载,会覆盖全局的参数设置。

嵌套结果集

对于多表关联查询,一般在 SQL 中使用别名来避免字段名的重复。mybatis 要做的是将别名正确的映射到 JavaBean 属性上。


SELECT SNAME, SSEX, CLASS, ST.SNO, SC.SNO AS SC_SNO

FROM test.student st INNER JOIN test.score sc

ON st.sno = sc.sno

where CNO = '3-105';

通过设置标签指定了表列名和属性之间的映射关系。但这样如果字段很多,会需要一一指定,标签提供了columnPrefix属性,指定别名的前缀,这样可以重用resultMap



一对多关系

除了一对一的关系,还有一对多的关系,比如这里一个学生Student 对应多门课的成绩。 一对多对应的情况下要在 resultMap 中使用 标签。首先需要调整 JavaBean 文件中两个表之间的关系。


private List score;

public List getScore() {

return score;

}

public void setScore(List score) {

this.score = score;

}

以嵌套结果集为例


SELECT SNAME,SSEX,CLASS,ST.SNO,SC.SNO AS SC_SNO

FROM test.student st INNER JOIN test.score sc

ON st.sno = sc.sno

注意到相比 association 多了一个属性ofType,是用来表示 List 集合中的类型的。其他属性的用法同 association 是一样的。

Java高架构师、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频免费学习加群:835638062 点击链接加入群聊【Java高级架构】:https://jq.qq.com/?_wv=1027&k=5S3kL3v

【全解析 | PTA】浙大版《Python 程序设计》题目集-第一章 Python浙大版PTA题解 阅读详情

相关推荐

从零到一:如何用YOLOv8和PyQt5打造一个高效的路面坑洞检测系统

本文详细介绍了如何利用YOLOv8和PyQt5开发一个高效的路面坑洞检测系统。从环境配置、数据采集标注到模型训练优化,再到PyQt5界面开发与系统集成,提供了完整的实战指南。该系统结合深度学习技术,显著提升了道路检测的准确性和效率,适用于各类道路维护场景。

weixin_29047919的博客 308

【MyBatis】| MyBatis查询语句专题(接口中方法的返回值类型专栏)

【MyBatis】| MyBatis查询语句专题(接口中方法的返回值类型专栏)

m0_61933976的博客 3184

到底什么是电源的斜波补偿,电源芯片CS引脚作用,一文讲清楚!

上文有提到电流环,其实电流环再细分也有很多模式,用的最多的是峰值电流模式峰值电流模式调节工作原理如下:(1)当输出负载增大时,输出电压降低,因此,Vc 增大,线性增加的电感电流只有升高到更大的值才能使 PWM 电流比较器翻转,开关管导通的时间增长,占空比增加,输入功率增加,因此输出电压增加,当输出电压增加到调节的范围内时,系统保持平衡。

jwgdhuwdhg的博客 1万+

【MyBatis】查询语句汇总

本章内容是查询返回专题, 很想对大家有帮助!

qq_68993495的博客 2759

机器视觉最全面试题总结

空洞卷积(Atrous Convolution)也叫做膨胀卷积、扩张卷积,最初的提出是为了解决图像分割在用下采样(池化、卷积)增加感受野时带来的特征图缩小,后再上采样回去时造成的精度上的损失。空洞卷积通过引入了一个扩张率的超参数,该参数定义了卷积核处理数据时各值的间距。可以在增加感受野的同时保持特征图的尺寸不变,从而代替下采样和上采样a. 是普通的卷积过程(dilation rate = 1),卷积后的感受野为3b. 是dilation rate = 2的空洞卷积,卷积后的感受野为5。

@bangbang的博客 9213

微信商家转账报错“当前使用用户过多,请稍后重新确认收款”解决方案

当前使用用户过多,请稍后重新确认收款”这个错误,其实就是典型的参数误处理导致的假报错。记住一句话就行👇JSAPI 场景下的package参数不要做 UrlEncode。如果你也遇到这个问题,希望这篇文章能帮你少踩一个坑。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 787

MyBatis框架如何实现数据查询?有几种方法?

上述配置文件代码也不需要读者全部手写,在MyBatis使用手册中的Logging小节,可以找到如图3所示的配置信息,只需将其复制到项目的log4j配置文件中,并对MyBatis的日志配置信息进行简单修改即可使用。(2)在Eclipse中,创建一个名为chapter06的Web项目,将MyBatis的核心JAR包、lib目录中的依赖JAR包,以及MySQL数据库的驱动JAR包一同添加到项目的lib目录下, 并发布到类路径中。其中,SQL语句中的“${}”用来表示拼接SQL的字符串,即不加解释的原样输出。

zy1992As的博客 1476

互联网人提高效率必备软件合集

很多的时候我们解决不了问题,只是因为没有找到对的工具,实际上,很多好的工具就在那里,只是你不用而已。这点上,信息壁垒是一个很大的原因,因此我希望兄伙伴们多出去走走,不要只是局限在一个圈层;

zhonglunshun的专栏 3485

MyBatis—利用MyBatis查询(查询所有,查询一行,条件查询)

MyBatis—利用MyBatis查询(查询所有,查询一行,条件查询)

chenxingxingxing的博客 3万+

YOLOv8【第十章:多任务扩展深度篇·第16节】车道线检测——基于 YOLOv8-Seg 的车道线分割与拟合!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 1万+

远程声控系统(MATLAB代码见优快云资源)

远程声控系统技术报告 一、题目要求 实现一个远程声音控制系统。首先采集不同的语音指示信号,进行适当压缩;然后通过噪声信道实现远程传输,远端接收后再通过适当计算识别出是何指示,最后送入一个处于未知状态、但能控/能观的控制系统,完成不同的控制动作。 二、问题分解与解决思路 2.1 系统设计 实验中以汉语数字语音1~9作为指令,数字语音“1”代表一号指令,数字语音“2”代表二号指令,依次类推。发送端发出语音“1”,发送端对应的数字语音文件为“1b.wav”,通过信源编码对语音进行压缩编码,然后进行信道编码并进行基

业精于勤,荒于嬉 5736

mybatis的查询语句

原先mapper中的sql是 &lt;select id="queryByModelId" resultType="java.util.Map"&gt; select * from ldp_analy_model_select WHERE &lt;if test="modelId != null"&gt; model_id = #{modelId...

沫~晓飞的博客 4746

OpenCloudOS9操作系统搭建Confluence8.2.1+Jira企业级WIKI

Atlassian Confluence是一个专业的企业知识管理与协同软件,可用于构建企业wiki

背锅神童的博客 1023

mybatis下的mysql查询语句_Mybatis查询语句结果集的总结大全

简单查询-resultType数据准备字段注释SNO学号SNAME学生名字SSEX性别SBIRITHDAY生日CLASS班级create table TEST.STUDENT(SNO varchar(3) not null,SNAME varchar(4) not null,SSEX varchar(2) not null,SBIRTHDAY datetime null,CLASS varchar...

weixin_33447647的博客 513

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

mysql语言的查询总结_Mybatis查询语句结果集的总结大全

简单查询-resultType数据准备字段注释SNO学号SNAME学生名字SSEX性别SBIRITHDAY生日CLASS班级create table TEST.STUDENT(SNO varchar(3) not null,SNAME varchar(4) not null,SSEX varchar(2) not null,SBIRTHDAY datetime null,CLASS varchar...

weixin_32943807的博客 176

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

mybatis java.sql.SQLException: 无效的列类型

Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 无效的列类型 用过mybatis的人一定都遇到过这样的错误吧,网上都说是加上jdbctype就行了。确实可以,但是也太麻烦...

nayi_224的博客 2370

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Mybatis框架一条查询语句的执行流程

##近期准备做一下Mybatis的源码解读,整个系列大概会有6-7篇文章。 先释放一下目录: 1.Mybatis框架组件设计&顶层接口 2.Mybatis框架启动流程分析 3.Mybatis框架源码Configuration分析 4.Mybatis框架一条插入语句的执行流程 5.Mybatis框架从源码角度来讲执行增,删,改的时候如何保证线程安全? ###6.Mybatis框架一条查询语句的执行流程 7.Mybatis的日志&异常体系 8.Mybatis与Spring集成过程 9.Mybat

程序男的专栏 521

MyBatis-Plus SQLite数据库脚本自动维护功能问题解析

在日常开发中,数据库脚本的版本管理和自动执行是每个项目都会面临的挑战。MyBatis-Plus作为MyBatis的增强工具包,提供了强大的DDL(Data Definition Language)自动维护功能,特别是对SQLite数据库的支持。然而,在实际使用过程中,开发者可能会遇到各种问题。本文将深入解析MyBatis-Plus SQLite数据库脚本自动维护功能的实现原理、常见问题及解决方案。...

gitblog_01408的博客 820

Mybatis源码(执行篇)

前言 上一篇文章提到了MyBatis是如何构建配置类的,也说了MyBatis在运行过程中主要分为两个阶段,第一是构建,第二就是执行,所以这篇文章会带大家来了解一下MyBatis是如何从构建完毕,到执行我们的第一条SQL语句的。 入口(代理对象的生成) public static void main(String[] args) throws Exception { /***********...

Only_Young的博客 406

Mybatis技术问答系列-NO2

1.SQL映射文件:首先,需要有一个SQL映射文件,它通常是一个XML文件,其中包含要执行的SQL语句以及与这些语句关联的Java对象。当实体类属性名和数据库表查询返回的字段名一致时,可以直接使用resultType属性指定目标对象的类型,MyBatis会自动将查询结果映射到该类型的对象中。2.修改SQL语句:插件会根据当前的分页参数(如当前页数和每页显示的记录数)来修改原始的SQL语句,添加分页相关的语法。这种方式可以在不改变SQL语句的情况下,通过注解的形式指定字段与属性的映射关系。

怀揣梦想,一颗执着于技术的心从未磨灭,内心住着一颗顽强的小强时刻提醒自己层层突破自我,同时也成就他人 519

mybatis嵌套查询和嵌套结果有什么区别

嵌套查询的弊端:即嵌套查询的N+1问题 尽管嵌套查询大量的简化了存在关联关系的查询,但它的弊端也比较明显:即所谓的N+1问题。关联的嵌套查询显示得到一个结果集,然后根据这个结果集的每一条记录进行关联查询。 现在假设嵌套查询就一个(即resultMap 内部就一个association标签),现查询的结果集返回条数为N,那么关联查询语句将会被执行N次,加上自身返回结果集查询1次,共需要访问数据库N+1次。如果N比较大的话,这样的数据库访问消耗是非常大的!所以使用这种嵌套语句查询的使用者一定要考虑慎重考虑,确保

zibingdechengbao的博客 2048

mybatis中错误集

一、常见问题 1、org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 无法找到绑定mapper.xml文件 问题分析思路:这个问题主要是由mapper接口配置和mapper.xml文件导致的,可以从以下几个方面检查 1) xml中的namespace命名与mapper接口全限定类名是否一致; 2)mapper.xml文件路径是否正确,application.properties中配置了mapper的文

riant110的博客 291

手把手带你阅读Mybatis源码(二)执行篇

前言老幺 https://www.laoyao.org 上一篇文章提到了MyBatis是如何构建配置类的,也说了MyBatis在运行过程中主要分为两个阶段,第一是构建,第二就是执行,所以这篇文章会带大家来了解一下MyBatis是如何从构建完毕,到执行我们的第一条SQL语句的。之后这部分内容会归置到公众号菜单栏:连载中…-框架分析中,欢迎探讨! 入口(代理对象的生成) public st...

终极冥帝 193

Mybatis中的resultMap结果集映射

当数据库字段与实体类属性不同名时,可以用resultMap来实现结果集映射 <resultMap id="UserMap" type="User"> <result column="id" property="id"/> <result column="name" property="name"/> <result column="pwd" property="password"/> </resultM

m0_52598760的博客 141
上一篇: Java并发基础:了解无锁CAS就从源码分析
下一篇: 这是一篇优雅的Springboot2.0使用手册
普通网友
博客等级 码龄8年 55粉丝 197原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值