Mybatis的动态SQL和结果映射

【Spring】— 动态SQL :MyBatis的关联映射 在关系型数据库中,多表之间存在3种关联关系,分别为一对一、一对多和多对多。一对一:在任意一方引入对方主键作为外键。一对多:在“多”的一方添加“一”的一方的主键作为外键。多对多:产生中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或使用新的字段作为主键。 阅读详情

以下是MyBatis框架的全面解析,涵盖基础架构、动态SQL高级用法及结果映射机制,结合实践场景与源码逻辑梳理核心要点:


一、MyBatis基础架构与核心组件

1. 框架定位与核心特性

• 定位:MyBatis是一款半自动ORM框架,通过XML或注解实现SQL与Java对象的映射,避免了JDBC冗余代码(如连接管理、结果集解析)。
• 核心功能:
• 定制化SQL:支持动态拼接SQL语句,灵活适应复杂查询需求。
• 高级映射:通过ResultMap处理嵌套对象、集合等复杂结构。
• 事务管理:提供基础事务接口,常与Spring集成实现分布式事务。

2. 核心组件与执行流程

• 关键组件:
• SqlSessionFactory:全局单例,通过SqlSessionFactoryBuilder加载mybatis-config.xml生成,管理数据库连接池与配置。
• SqlSession:线程非安全,封装CRUD操作,通过getMapper()获取Mapper接口代理对象。
• MappedStatement:存储XML/注解中定义的SQL信息(参数映射、执行逻辑、结果映射)。
• 执行流程:

  1. 配置加载:解析XML/注解,生成MappedStatement缓存(含SQL语句、参数映射规则)。
  2. 请求处理:接收Mapper接口调用,通过动态代理定位SQL。
  3. SQL解析:结合OGNL表达式动态拼接SQL,生成BoundSql对象。
  4. 执行与映射:JDBC执行后,通过ResultSetHandler将结果集映射为Java对象。

二、动态SQL高级用法详解

1. 基础动态标签

• <if>:条件判断,避免空值导致的无效过滤。

<select id="searchUsers" resultType="User">
  SELECT * FROM user
  <where>
    <if test="name != null">AND name LIKE CONCAT('%', #{name}, '%')</if>
    <if test="age != null">AND age = #{age}</if>
  </where>
</select>

• <choose>/<when>/<otherwise>:多条件分支逻辑,类似Java的switch-case。
• <foreach>:遍历集合,支持批量操作(如IN查询、批量插入):

<insert id="batchInsert">
  INSERT INTO user (name) VALUES
  <foreach item="item" collection="list" separator=",">
    (#{item.name})
  </foreach>
</insert>
2. 语法优化标签

• <trim>:自定义前缀/后缀,替代<where>或<set>。

<update id="updateUser">
  UPDATE user
  <trim prefix="SET" suffixOverrides=",">
    <if test="name != null">name = #{name},</if>
    <if test="age != null">age = #{age},</if>
  </trim>
  WHERE id = #{id}
</update>

• <bind>:预处理变量,解决数据库方言兼容性问题(如模糊查询):

<select id="searchByPattern">
  <bind name="pattern" value="'%' + keyword + '%'"/>
  SELECT * FROM table WHERE column LIKE #{pattern}
</select>
3. 高级场景与优化

• 多数据库适配:通过databaseId按数据库类型动态切换SQL(如MySQL与Oracle分页差异)。
• 脚本标签:在注解中使用<script>标签嵌入动态SQL:

@Update({"<script>",
  "UPDATE user SET name = #{name}",
  "<if test='age != null'> , age = #{age}</if>",
  "WHERE id = #{id}",
"</script>"})
void updateUserDynamic(User user);

三、结果映射机制深度解析

1. 自动映射与别名机制

• 自动映射:默认按列名与属性名匹配(支持驼峰转换)。

<settings>
  <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

• 别名配置:简化类型全路径,提升可读性。

<typeAliases>
  <typeAlias type="com.example.User" alias="User"/>
</typeAliases>
2. 自定义ResultMap

• 基础映射:处理列名与属性名不一致的场景。

<resultMap id="UserMap" type="User">
  <id property="id" column="user_id"/>
  <result property="userName" column="name"/>
</resultMap>

• 嵌套对象:<association>处理一对一关系(如用户-地址)。

<resultMap id="OrderMap" type="Order">
  <association property="user" javaType="User">
    <id property="id" column="user_id"/>
    <result property="name" column="user_name"/>
  </association>
</resultMap>

• 集合映射:<collection>处理一对多关系(如用户-订单列表):

<resultMap id="UserWithOrdersMap" type="User">
  <collection property="orders" ofType="Order">
    <id property="orderId" column="order_id"/>
    <result property="amount" column="order_amount"/>
  </collection>
</resultMap>
3. 动态结果映射

• 自动映射模式:通过autoMapping属性局部控制。

<resultMap id="PartialMap" type="User" autoMapping="true">
  <id property="id" column="id"/> <!-- 显式指定主键 -->
</resultMap>

四、最佳实践与性能优化

  1. 动态SQL优化:避免多层嵌套<if>,优先使用<trim>简化结构。
  2. 结果集处理:
    • 延迟加载:通过lazyLoadingEnabled配置关联对象的按需加载。
    • 二级缓存:跨会话共享数据,需注意缓存一致性(推荐Redis集成)。
  3. 异常处理:使用<selectKey>处理主键回填,避免并发问题。

通过以上技术点整合,MyBatis既能简化基础CRUD操作,又能应对复杂业务场景。更多细节可参考官方文档或技术内幕解析。

【史诗级】详细阐述借助AI实现对Windows蓝屏原因进行精确定位的方法 在解决问题的过程中我决定把这一切都记录下来,并整理出一套通用的方法,方便快速精确定位引起蓝屏的真实原因。今天我的蓝屏代码是0x000000ef,而你或许是遇到另一个蓝屏代码,代码本身代表的含义不是这里的讨论重点,重要的是解决问题的底层逻辑。 阅读详情

相关推荐

ESD放电模式以及电源箝位 (power clamp )电路

由于ESD电压具有很快的上升速度(其ESD脉冲上升时间约在10ns左右),Vrc端的电压因为RC延迟效应无法跟得上VDD端的ESD电压上升速度,Vrc端的为低电位导致反相器工由于ESD电压具有很快的上升速度(其ESD脉冲上升时间约在10ns左右),Vrc端的电压因为RC延迟效应无法跟得上VDD端的ESD电压上升速度,Vrc端的为低电位导致反相器工作将输出端Vout电压上拉到高电位。从而Vg端的高电位触发导通了NMOS元件(Mesd)的晶体管,因而ESD电流便经由Mesd而泄放掉。由于晶体管Mesd的栅极导通

DOG_BITE_DOG的博客 2万+

Mybatis之动态SQL及映射结果

动态SQL是一种在运行时构建和执行SQL语句的方法。通常情况下,SQL语句是在编译时确定的,但是动态SQL允许在程序运行时根据特定条件或者用户输入来构建SQL语句。这样可以使得SQL语句更加灵活和可变化。动态SQL可以用于实现动态的搜索、过滤和排序等功能。它在很多编程语言和数据库中都有支持,比如Java的JDBC、Python的SQLAlchemy等。需要注意的是,动态SQL在使用时需要注意防止SQL注入攻击,确保输入的数据正确地转义和验证。

m0_74915426的博客 689

RK3588 部署 YOLO26 目标检测:从环境搭建到 NPU 推理

采集图像(500+ 张,覆盖不同光照和角度)→ 筛选(删除模糊、无目标的图像)→ LabelImg 标注(选择 YOLO 格式)→ 划分 train:val:test = 7:2:1labelImg├── train/├── val/nc: 3类别顺序必须与 LabelImg 标注时一致。YOLO26 在 RK3588 上的部署流程是 PC 端训练 → ONNX 导出(opset=11)→ RKNN 转换(INT8 量化)→ 板端推理。

LXY_LOVE36的博客 418

MyBatis的SQL映射与动态映射

1.背景介绍 MyBatis是一款流行的Java数据访问框架,它可以简化数据库操作,提高开发效率。MyBatis的核心功能是SQL映射和动态映射。本文将深入探讨MyBatis的SQL映射与动态映射,揭示其核心概念、算法原理、最佳实践以及实际应用场景。 1. 背景介绍 MyBatis起源于iBATIS项目,由SqlMap和iBATIS合并而成。MyBatis在2010年发布第一版,自此成为一款...

AI天才研究院 1115

AutoSAR配置与实践(深入篇)5.4 OS原理(下 )- 内存保护(MPU)

ECU可能由内部模块、第三方模块等各模块集成的。需求对每个模块所定义的安全等级可能有差异,需要考虑不同安全等级的模块和代码间减少相互干扰,防止程序错误传播。可以理解为包含Task、Alarm、Counter、Schedule table、ISRs、Event等基本对象的容器,用于隔离Task/Alarm等,进行内存保护。

nihaoljq2010的博客 3536

Unreal5从入门到精通之如何实现移动端触屏滑动手势

随着移动设备的普及,越来越多的游戏和应用选择在移动平台上发布。Unreal Engine 5(UE5)作为一款强大的游戏引擎,提供了丰富的工具和功能,帮助开发者打造出色的移动体验。UE5不仅提升了图形质量,还大幅简化了开发流程,使得开发者能够更专注于游戏设计和用户体验。在移动游戏中,触屏滑动手势是用户与应用互动的主要方式之一。然而,许多开发者在实现这些功能时常常遇到困难。为了填补这一知识空白,本篇文章将详细介绍如何在UE5中实现移动端触屏滑动手势,帮助你从入门到精通,提升你的开发技能。

TxNet 1136

mybatic动态SQL及结果处理

mybatic动态SQL及结果处理 1、mybatis动态sql 2、模糊查询 3、查询返回结果集的处理 4、分页查询 5、特殊字符处理 分页查询的pom依赖 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifac...

qq_45177371的博客 252

cadence中利用sva进行FPV实战(可直接使用)

在cadence中使用fpv进行formal验证

youzjuer的博客 749

Mybatis学习之数据库字段与实体属性的映射

Mybatis学习之数据库字段与实体属性的映射。三种方式来解决,看看你喜欢使用哪一种。如果对觉得对你的学习有所帮助就请点赞收藏吧。

qq_39746820的博客 1万+

SAP CDS View 教程里的标准视图:SEPM_I_SalesOrderItem_E 当成一张表来用之前,你需要先弄清它到底是什么

摘要:SEPM_I_SalesOrderItem_E 是 SAP EPM demo 中的预交付 CDS 视图,用于表示销售订单行项目数据。它采用 VDM 命名规范,_E 后缀表示对外隐藏内部 UUID 键,提供业务友好的外部 ID 接口。该视图常见于 ABAP Platform 7.50+、开发版系统及 Gateway 教程中,可像表一样通过 Open SQL 查询。实际项目中,这类视图能有效解决内外系统键值映射问题,示例代码展示了如何查询其数据。使用时需注意系统是否安装了 EPM demo 内容。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 547

部分旧版统信国产系统下载资源

注:全部自来网络查找,建议到官网下载最新版。

aggs1990的专栏 5239

MyBatis之动态SQL、#与$的区别和结果映射

MyBatis动态SQL的概念与常用元素,三种模糊查询的方式以及#和$的区别,Mybatis的结果映射---resultType与resultMap的区别

weixin_74268571的博客 4048

1.2 Spring AI V1.1.2版本 架构全景:模块拆解与设计哲学

Override// 检查请求的 Token 数量throw new TokenLimitExceededException("请求超出 Token 限制");@Override// 记录实际消耗的 Token@Override// 最先执行// 接口// 不同实现// 使用方无需改变定义抽象,保证可移植性提供 Fluent API,提升开发体验Advisor 机制提供扩展点,支持灵活定制模块化设计让你只引入需要的依赖自动配置。

小林夕程的博客 220

MyBatis实战解析(一):动态SQL及结果映射(XML)

MyBatis作为轻量级持久层框架,其动态SQL和结果映射是两大核心特性。文章详细解析了结果集映射的四种方式:自动映射、复杂结果集映射、子映射嵌套子查询和继承映射,并指出字段重复、子映射字段缺失等常见问题及解决方案。动态SQL部分介绍了<where>、<if>、<choose>等标签的灵活运用,以及<foreach>遍历集合、<bind>变量绑定等高级用法。通过合理配置懒加载和自动映射策略,结合XML配置与注解方式,开发者能够高效处理复杂业务场景下

qq_47980550的博客 1600

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

MyBatis进阶:掌握MyBatis动态SQL与模糊查询、结果映射

本文将介绍MyBatis中的动态SQL、模糊查询和结果映射等特性,帮助大家更好地使用MyBatis进行数据库操作。模糊查询是在数据库查询中常见的需求之一。动态SQL是指根据不同的条件生成不同的SQL语句,以适应不同的查询需求。在使用MyBatis中拥有多个场景,返回的结果是多样的,resultType/resultMap。①返回单表的对应的实体类,仅有一个查询结果,可以用resultType/resultMap。②返回单表的对应的实体类,有多个查询结果,可以用resultType/resultMap。

m0_74018330的博客 995

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

MyBatis3(动态SQL 常用的动态SQL 元素 映射器注解 基本注解 结果映射注解)

说明:set 标签元素主要是用在更新操作的时候, 它的主要功能和where 标签元素其实是差不 多的,主要是在包含的语句前输出一个set, 然后如果包含的语句是以逗号结束的话将会 把该逗号忽略,如果set 包含的内容为空的 话则会出错。有了set 元素就可以动态的更 新那些修改了的字段。新增时所用的参数取值是接口方法的入参,可以是对象,也可以是 Map 集合。删除时所用的参数取值是接口方法的入参,可以是对象,也可以是 Map 集合。更新时所用的参数取值是接口方法的入参,可以是对象,也可以是Map 集合。

qq_52897007的博客 1147

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

MyBatis进阶:掌握MyBatis动态SQL与模糊查询、结果映射,让你在面试中脱颖而出!!

本文将从进阶的角度出发,详细介绍MyBatis的动态SQL和模糊查询,同时也会讲解结果映射的技巧。通过学习本文,你将能够更加熟练地使用MyBatis,提高自己的开发效率,为面试增添信心。快来学习吧!如果你正在寻找一份高薪稳定的工作,那么掌握MyBatis动态SQL与模糊查询、结果映射是必不可少的技能。这些技能可以让你在面试中展现出自己的实力,从而获得更好的职业发展机会。所以不要犹豫了,赶快来学习吧!

万维网连五洲,二进制写尽天下事,喜欢结识新伙伴寻找志同道合的朋友,欢迎一起探讨学习 1735

“MyBatis中的动态SQL、模糊查询与结果映射“

本文深入探讨了MyBatis中的动态SQL、模糊查询和结果映射的使用方法和技巧。动态SQL允许我们根据不同的条件生成不同的SQL语句,提高了查询的灵活性。模糊查询则是在查询时使用通配符来匹配模糊的数据,增加了查询的准确性。结果映射则是将查询结果映射到Java对象中,方便我们进行数据操作和处理。通过学习本文,读者可以更好地理解和应用MyBatis中的动态SQL、模糊查询和结果映射。希望本文对读者在使用MyBatis时有所帮助,并能够在实际项目中灵活运用这些高级功能。

2201_75869073的博客 545

MyBatis 动态 SQL 与结果映射详解

Overridetry {throw new SQLException("JSON 序列化失败", e);@Override@Override@Overridetry {throw new SQLException("JSON 反序列化失败", e);动态 SQL 原理:启动期 XMLScriptBuilder 把标签解析为 SqlNode 树,运行期 OGNL 逐节点求值拼接出最终 SQL——拼接在预编译之前,参数仍走#{}绑定,无注入风险。八大标签分工管条件分支;

萧瑟余晖的博客 418

MyBatis Mapper映射文件全解析:动态SQL、参数传递与结果集映射进阶

合理运用这些高级特性,可以构建出既安全又高效的持久层解决方案。实际开发中需根据具体业务场景,在灵活性与可维护性之间找到最佳平衡点

m0_58202543的博客 1006

MyBatis高级查询的完整示例,包含动态SQL、结果映射、分页、关联查询等核心场景,并附详细注释和总结表格

MyBatis高级查询的完整示例,包含动态SQL、结果映射、分页、关联查询等核心场景,并附详细注释和总结表格

爱的叹息的专栏 483

mybatis collection标签_MyBatis第二天(结果映射+动态sql+关联查询)

笑不出莱:MyBatis第一天(介绍+文件配置+Mapper动态代理)​zhuanlan.zhihu.com一、导包+配置文件+pojo类1、jar包:mybatis的核心包和依赖包+连接数据库的jar包2、日志文件(可以不需要)3、SqlMapConfig.xml配置<?xml version="1.0" encoding="UTF-8" ?> 4、pojo类// 用户pojo类,对...

weixin_39923806的博客 435

Mybatis学习(三) resultMap(结果映射) 和动态Sql

Mybatis学习(三) resultMap(结果映射) 和动态Sql 1.resultMap 1.1、resultMap简单概述 resultMap 元素是 MyBatis 中最重要最强大的元素。 ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了 ResultMap 最优秀的地方在于,虽然你已经对它相当了解了,但是根本就不需要显式地用到他们。 简单案例 <!--结果集映射--> <resultMap id="UserMap

syh_IT 1960

蜗牛学苑 Java 学习 Day19|MyBatis 动态 SQL 与 resultMap 结果映射思维导图复盘

重生之我在蜗牛学苑学代码

weixin_75217422的博客 509

2021-06-07_Mybatis——动态SQL,结果集映射

Mybatis——动态SQL,结果集映射动态SQLDao接口:select按照对象查询Dao接口:insert按照对象插入Dao接口:update按照对象修改Dao接口:update按照对象修改 动态SQL Dao接口:select按照对象查询 List<Student> selectByStudentSelective(Student student); 对应的 SQL <select id="selectAll" resultType="com.wistron.pojo.SfcCo

折枝 343

004 MyBatis教程:javaEE三层架构、变量使用包装类型,日志、prop文件,映射文件模板、sql获取参数、封装查询结果,使用${}的情况,自定义映射,动态SQL,缓存,逆向工程,分页插件

一、MyBatis简介 1、MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。 iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis提供的持久层框架包括SQL Maps和D

aa35434的博客 2724
上一篇: Mybatis在Spring boot里面的简单使用
下一篇: Linux简单命令
小李不秃头♛
博客等级 码龄2年 619粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值