Mybatis动态SQL解析

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

1 为什么需要动态SQL?

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> 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/206411.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午3:45
下一篇 2026年3月19日 下午3:46


相关推荐

  • C++ 如何判断一个数为回文数

    C++ 如何判断一个数为回文数如果一个数从左边读和从右边读都是同一个数 就称为回文数解答 思想最简单的方法就是模拟 把各个数位取出来 然后比较 当然这种方法比较麻烦 我们这次要用的方法如下 既然是回文数 那我们把各个数位上的数正着加起来跟逆着加起来的和是一样的 运用这条性质我们就可以很简单的解决这个问题 代码如下 include lt iostream gt usingnamespa

    2026年3月17日
    2
  • phpMyAdmin安装教程

    phpMyAdmin安装教程phpmyadmin是一款mysql数据库管理工具,是由php编写的,可以通过互联网控制和操作mysql,通过phpmyadmin可以完全对数据库进行操作,例如建立、复制/删除数据等等。可以管理整个MySQL服务器(需要超级用户),也可以管理单个数据库,为了实现后一种,你将需要合理设置MySQL用户,他只能对允许的数据库进行读/写,那要等到你看过MySQL手册中相关的部分。

    2022年6月1日
    32
  • 第 三 十 八 天:Apache 选 项 和 模 块 问 题 附:php

    第 三 十 八 天:Apache 选 项 和 模 块 问 题 附:php

    2021年9月10日
    45
  • 剑指Offer面试题:6.旋转数组中的最小数字建议收藏

    一题目:旋转数组中的最小数字这道题最直观的解法并不难,从头到尾遍历数组一次,我们就能找出最小的元素。这种思路的时间复杂度显然是O(n)。但是这个思路没有利用输入的旋转数组的特性,肯定达不到面试官的

    2021年12月19日
    37
  • 关于机械臂的模仿学习

    关于机械臂的模仿学习文章目录1.关键词2.数据集3.框架4.大会/论坛5.相关论文1.关键词模仿学习:Imitationlearning2.数据集图像识别领域的数据集:ImageNet目标检测的数据集:COCO机器问答的数据集:SQuAD3.框架斯坦福的李飞飞实验室,开源了分布式强化学习训练框架SURREAL,用来加速学习过程。团队还发现,用SURREAL框架搭配上文的RoboTurk…

    2026年1月23日
    2
  • 【PHP】PHP获得第一章

    【PHP】PHP获得第一章

    2022年1月12日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号