mybatis动态SQL
创始人
2024-02-14 12:56:41
0

动态SQL

什么是动态SQL

1.动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中,开发人员通常需要手动拼接 SQL 语句。根据不同的条件拼接 SQL 语句是一件极其痛苦的工作。例如,拼接时要确保添加了必要的空格,还要注意去掉列表最后一个列名的逗号。而动态 SQL 恰好解决了这一问题,可以根据场景动态的构建查询。

2.动态SQL:code that is executed dynamically。 它一般是根据用户输入或外部条件动态组合的SQL语句块。 动态SQL能灵活的发挥SQL强大的功能、方便的解决一些其它方法难以解决的问题。 相信使用过动态SQL的人都能体会到它带来的便利,然而动态SQL有时候在执行性能 (效率)上面不如静态SQL,而且使用不恰当,往往会在安全方面存在隐患 (SQL 注入式攻击)。

Mybatis的动态SQL是什么

Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能。

Mybatis的9中标签

元素作用备注
if判断语句单条件分支判断
choose(when、otherwise)相当于 Java 中的 switch case 语句多条件分支判断
trim,where辅助元素用于处理一些SQL拼装问题
foreach循环语句在in语句等列举条件常用
bind辅助元素拼接参数

Mybatis动态SQL的执行原理

原理为:使用 OGNL 从 sql 参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态 sql 的功能。

1.if标签:条件判断

MyBatis if 类似于 Java 中的 if 语句,是 MyBatis 中最常用的判断语句。使用 if 标签可以节省许多拼接 SQL 的工作,把精力集中在 XML 的维护上。

(1)不使用动态sql


if 语句使用方法简单,常常与 test 属性联合使用。语法如下。

SQL语句

(2)使用动态sql
上面的查询语句,我们可以发现,如果 #{username} 为空,那么查询结果也是空,如何解决这个问题呢?使用 if 来判断,可多个 if 语句同时使用。以下语句表示为可以按照网站名称(name)或者网址(url)进行模糊查询。如果您不输入名称或网址,则返回所有的网站记录。但是,如果你传递了任意一个参数,它就会返回与给定参数相匹配的记录。


2.where+if标签

where、if同时使用可以进行查询、模糊查询


3.set标签

set可以用来修改

update studentsname=#{sname},spwd=#{spwd},sex=#{sex},phone=#{phone}sid=#{sid}where sid=#{sid}

4.choose(when,otherwise) 语句

有时候,我们不想用到所有的查询条件,只想选择其中的一个,查询条件有一个满足即可,使用 choose 标签可以解决此类问题,类似于 Java 的 switch 语句


5.trim

trim标记是一个格式化的标记,可以完成set或者是where标记的功能

①、用 trim 改写上面第二点的 if+where 语句


prefix:前缀

prefixoverride:去掉第一个and或者是or

②、用 trim 改写上面第三点的 if+set 语句

update user uu.username = #{username},u.sex = #{sex},where id=#{id}

suffix:后缀

suffixoverride:去掉最后一个逗号(也可以是其他的标记,就像是上面前缀中的and一样)

3.trim+if同时使用可以添加

insert  into studentsname,spwd,sex,phone,#{sname},#{spwd},#{sex},#{phone}

6.MyBatis foreach标签
foreach是用来对集合的遍历,这个和Java中的功能很类似。通常处理SQL中的in语句。

foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符

你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。

//批量查询

//批量删除
delete  from  student  where  sid in#{ids}

7.sql
在实际开发中会遇到许多相同的SQL,比如根据某个条件筛选,这个筛选很多地方都能用到,我们可以将其抽取出来成为一个公用的部分,这样修改也方便,一旦出现了错误,只需要改这一处便能处处生效了,此时就用到了这个标签了。

当多种类型的查询语句的查询字段或者查询条件相同时,可以将其定义为常量,方便调用。为求 结构清晰也可将 sql 语句分解。

select  *  from  student

8.include

  • 这个标签和是天仙配,是共生的,include用于引用sql标签定义的常量。比如引用上面sql标签定义的常量

refid这个属性就是指定标签中的id值(唯一标识)


相关内容

热门资讯

消保委建议商家优化售后服务   本报上海讯(记者刘浩)近日,消费者高女士为宠物猫购买了新猫粮,拆开后猫却拒食,高女士申请退货退款...
东财中证证券30ETF发起式联... 西藏东财中证证券公司30交易型开放式指数证券投资基金发起式联接基金(简称:东财中证证券30ETF发起...
方正富邦中证保险A净值上涨4.... 方正富邦中证保险主题指数型证券投资基金(简称:方正富邦中证保险A,代码167301)公布5月14日最...
北京金一文化发展股份有限公司关... 证券代码:002721 证券简称:ST金一 公告编号:2025-027北京金一文化发展股份有限公司关...
富国中证全指证券公司指数C净值... 富国中证全指证券公司指数型证券投资基金(简称:富国中证全指证券公司指数C,代码013276)公布5月...
华北黄淮将遇高温“烤”验   连日来,我国华北南部、黄淮地区出现35℃以上高温天气。中央气象台预报,16日起,黄淮中西部、华北...
“防撞神器”真能助你成为开车“... 图一:护航实业在视频中宣称“汽车防撞领域创造者”。图二:护航实业的网站首页信息。■本报记者 吴博峰 ...
大众公用相关公司新增一项502... (转自:快查一企业中标了)快查APP显示,大众公用相关公司上海大众燃气有限公司于2025年5月14日...
华富中证证券公司先锋策略ETF... 华富中证证券公司先锋策略交易型开放式指数证券投资基金(简称:华富中证证券公司先锋策略ETF,代码51...
鹏华券商C净值上涨3.33% 鹏华中证全指证券公司指数型证券投资基金(LOF)(简称:鹏华券商C,代码012044)公布5月14日...
易方达中证全指证券公司指数(L... 易方达中证全指证券公司指数证券投资基金(LOF)(简称:易方达中证全指证券公司指数(LOF)C,代码...
“消费查”为线下无理由退货提供...   “消费查”堪称市场上的“无理由退货导航”,可为消费者指引消费方向。消费者通过微信搜索“消费查”或...
阿斯巴甜会伤害心血管?无糖快乐... ■本报记者 李建  可乐是很多人青睐的情绪疗愈饮品。而在控糖的潮流下,无糖版可乐成为了消费者新选择。...
市场监管总局指导行业协会防控肉... 本报讯 近日,市场监管总局指导中国肉类协会向国内肉类产品经营企业发布风险防控提示,推动肉类产品行业加...
华安中证全指证券公司ETF联接... 华安中证全指证券公司交易型开放式指数证券投资基金联接基金(简称:华安中证全指证券公司ETF联接C,代...
“你点我检”走进养老机构   本报沈阳讯(记者王文郁)5月13日,辽宁省沈阳市市场监管局在法库县开展“物资捐赠+科普互动+现场...
浦银安盛中证证券公司30ETF... 浦银安盛中证证券公司30交易型开放式指数证券投资基金联接基金(简称:浦银安盛中证证券公司30ETF联...
天弘中证全指证券公司ETF净值... 天弘中证全指证券公司交易型开放式指数证券投资基金(简称:天弘中证全指证券公司ETF,代码159841...
国泰中证申万证券行业指数(LO... 国泰中证申万证券行业指数证券投资基金(LOF)(简称:国泰中证申万证券行业指数(LOF)A,代码50...
广发中证港股通非银ETF净值上... 广发中证港股通非银行金融主题交易型开放式指数证券投资基金(简称:广发中证港股通非银ETF,代码513...