文章目录

  • 1 为什么需要动态SQL?
  • 2 动态标签有哪些?
  • 3 举例说明
    • if
    • choose (when, otherwise)
    • trim (where, set)
    • foreach

1 为什么需要动态SQL?

看一段Oracle存储过程代码:

由于前台传入的查询参数不同,所以写了很多的if else,还需要非常注意SQL语句里面的and、空格、逗号和转移的单引号这些,拼接和调试SQL就是一件非常耗时的工作。
MyBaits的动态SQL就帮助我们解决了这个问题,它是基于OGNL表达式的。

2 动态标签有哪些?

按照官网的分类,MyBatis 的动态标签主要有四类:

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

3 举例说明

if

需要判断的时候,条件写在test中:

    <!-- 动态SQL where 和 if  --><select id="selectBlogListIf" parameterType="blog" resultMap="BaseResultMap" >select bid, name, author_id authorId from blog<where><if test="bid != null">AND bid = #{bid}</if><if test="name != null and name != ''">AND name LIKE '%${name}%'</if><if test="authorId != null">AND author_id = #{authorId}</if></where></select>

choose (when, otherwise)

需要选择—个条件的时候:

    <!-- 动态SQL choose --><select id="selectBlogListChoose" parameterType="blog" resultMap="BaseResultMap" >select bid, name, author_id authorId from blog<where><choose><when test="bid !=null">bid = #{bid, jdbcType=INTEGER}</when><when test="name != null and name != ''">AND name LIKE CONCAT(CONCAT('%', #{name, jdbcType=VARCHAR}),'%')</when><when test="authorId != null ">AND author_id = #{authorId, jdbcType=INTEGER}</when><otherwise></otherwise></choose></where></select>

trim (where, set)

需要去掉where, and、逗号之类的符号的时候:

    <!-- 动态SQL set --><update id="updateByPrimaryKey" parameterType="blog">update blog<set><if test="name != null">name = #{name,jdbcType=VARCHAR},</if><if test="authorId != null">author_id = #{authorId,jdbcType=CHAR},</if></set>where bid = #{bid,jdbcType=INTEGER}</update>

用来指定或者去掉前缀或者后缀:

    <insert id="insertBlog" parameterType="blog">insert into blog<trim prefix="(" suffix=")" suffixOverrides=","><if test="bid != null">bid,</if><if test="name != null">name,</if><if test="authorId != null">author_id,</if></trim><trim prefix="values (" suffix=")" suffixOverrides=","><if test="bid != null">#{bid,jdbcType=INTEGER},</if><if test="name != null">#{name,jdbcType=VARCHAR},<!-- #{name,jdbcType=VARCHAR,typeHandler=com.gupaoedu.type.MyTypeHandler}, --></if><if test="authorId != null">#{authorId,jdbcType=INTEGER},</if></trim></insert>

foreach

需要遍历集合的时候:

    <!-- foreach 动态SQL 批量删除 --><delete id="deleteByList" parameterType="java.util.List">delete from blog where bid in<foreach collection="list" item="item" open="(" separator="," close=")">#{item.bid,jdbcType=INTEGER}</foreach></delete>

Mybatis动态SQL解析相关推荐

  1. 认真看看, 以后写 SQL 就爽多了:MyBatis 动态 SQL:

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 阿进的写字台 来源 | cnblogs.com ...

  2. Mybatis 动态Sql语句《常用》

    MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉 ...

  3. (4) hibernate增删查改+批量操作+类似Mybatis动态sql

    简介 采用spring + hibernate + freemaker+ maven搭建起来的一个hibernate增删查改和 类似mybatis动态sql查询的一个案例 增删查改demo + 动态s ...

  4. MyBatis 动态 SQL 底层原理分析

    MyBatis 动态 SQL 底层原理分析 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" p ...

  5. Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理?

    Mybatis的动态sql的作用: 动态sql就是(在进行sql操作的时候)动态的根据属性值(所匹配的条件)来拼接数据库执行的sql语句,也就是多次查询或变更操作,根据传入的属性值不同,动态拼接出不同 ...

  6. Mybatis动态sql和分页

    mybatis动态sql 1.1 if1.2 trim1.3 foreach1.4 其他choose/set/where 动态sql代码展示 <select id="list1&quo ...

  7. MyBatis 动态 SQL,讲的很细

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 整理:阿进的写字台 原文:cnblogs.com/homejim/p/9909657.html MyBatis 令人喜 ...

  8. MyBatis动态SQL之 set 和 trim标记的使用示例

    2019独角兽企业重金招聘Python工程师标准>>> 和之前的where一样,set和trim也是智能标记 在之前的user.xml中添加 <update id=" ...

  9. MyBatis动态SQL(认真看看, 以后写SQL就爽多了)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:cnblogs.com/homejim/p/9909657. ...

最新文章

  1. docker 启动petalinux镜像脚本
  2. 微软忘记修复Mac Office2004/2008安全漏洞
  3. mysql特有语法_mysql 有用的特殊语法
  4. 【SSL】keytool复制证书
  5. MybatisPlus添加操作
  6. mycat 资料汇总
  7. matlab最小生成树举例,Matlab最小生成树示例
  8. Linux查看显示编辑文本文件
  9. 代写python作业 费用_代写dither method作业、代做python程序设计作业、代写python语言作业、代做Image Dithering作...
  10. [Jobdu] 题目1037:Powerful Calculator
  11. 2019_WSDM_Session-Based Social Recommendation via Dynamic Graph Attention Networks
  12. o2o、c2c、b2c、b2b、b2b2c都是什么?
  13. Kubernetes访问报错: No route to host
  14. 图形的设计和HTML和的CSS
  15. leetcode解题思路分析(一百三十)1093 - 1096 题
  16. 民营企业的十三种死法
  17. IPMITOOL常用操作指令
  18. 项目奖金一般是多少_MPAcc职业发展|看看国内券商、投行、四大一年能挣多少?...
  19. 周杰伦 新专辑 十一月的肖邦
  20. 两个整数相乘的java实现

热门文章

  1. jquery 检测回车事件_jquery 回车事件
  2. 学玩嵌入式开发的建议
  3. VR 双相机渲染解决只有单相机看到物体
  4. 【LSTM分类】基于卷积神经网络结合双向长短时记忆CNN-Bi-LSTM实现数据分类含Matlab源码
  5. 什么是Bom?有哪些常用的Bom属性
  6. webhook推送数据
  7. 跨境电商的发展趋势有哪些?跨境电商发展现状与趋势
  8. 简单几步骤查看未签收的快递单号
  9. Js日期加减(天数),时间加减,日期运算
  10. 好用的Linux下输入法