ssm框架之动态sql

简介: ssm框架之动态sql 动态SQL就是在SQL语句中添加一些标签,以完成某些逻辑。通常用到的动态SQL标签有<if>、<choose>、<where>、<trim>、<set>、<foreach>、<bind>、<sql>等。

ssm框架之动态sql

动态SQL就是在SQL语句中添加一些标签,以完成某些逻辑。通常用到的动态SQL标签有<if>、<choose>、<where>、<trim>、<set>、<foreach>、<bind>、<sql>等。

 

1、if

        if是简单的条件判断,通过if语句我们可以实现某些简单的条件选择,一个例子的代码如下:

 

 
  1. <select id="dynamicIfTest" parameterType="Blog" resultType="Blog">

  2. select * from t_blog where 11 = 1

  3. <if test="title != null">

  4. and title = #{title}

  5. </if>

  6. <if test="content != null">

  7. and content = #{content}

  8. </if>

  9. <if test="owner != null">

  10. and owner = #{owner}

  11. </if>

  12. </select>

 

 

2、choose

        choose标签的作用就相当于JAVA中的switch语句,只不过不是使用case与default搭配,而是使用when和otherwise搭配。一个例子的代码如下:

 

 
  1. <select id="dynamicChooseTest" parameterType="Blog" resultType="Blog">

  2. select * from t_blog where 11 = 1

  3. <choose>

  4. <when test="title != null">

  5. and title = #{title}

  6. </when>

  7. <when test="content != null">

  8. and content = #{content}

  9. </when>

  10. <otherwise>

  11. and owner = "owner1"

  12. </otherwise>

  13. </choose>

  14. </select>

        choose语句和JAVA中的switch语句类似,都是按顺序从上向下判断,一旦有某个when的条件满足的时候,就会跳出choose,当所有when中的条件都不满足,就会执行otherwise中的语句。

 

 

3、trim

        trim标签的作用是可以在自己包含的内容前后加上前缀或后缀,与之对应的属性是prefix和suffix;trim标签也可以把包含内容中首、尾部的某些内容覆盖(即忽略),对应的属性是prefixOverrides和suffixOverrides。一个例子的代码如下:

 

 
  1. <select id="dynamicTrimTest" parameterType="Blog" resultType="Blog">

  2. select * from t_blog

  3. <trim prefix="where" prefixOverrides="and|or">

  4. <if test="title != null">

  5. title = #{title}

  6. </if>

  7. <if test="content != null">

  8. and content = #{content}

  9. </if>

  10. <if test="owner != null">

  11. or owner = #{owner}

  12. </if>

  13. </trim>

  14. </select>

        上面这段代码的意思是:在这段代码的最前面加一个前缀where,然后把可能位于最前面的and或or给覆盖(忽略)掉。正因为trim标签有这样的功能,所以我们也可以非常简单的利用trim来代替where元素的功能。

 

 

4、where

        where标签的作用是为了简化SQL语句中where的条件判断的,一个例子的代码如下:

 

 
  1. <select id="dynamicWhereTest" parameterType="Blog" resultType="Blog">

  2. select * from t_blog

  3. <where>

  4. <if test="title != null">

  5. and title = #{title}

  6. </if>

  7. <if test="content != null">

  8. and content = #{content}

  9. </if>

  10. <if test="owner != null">

  11. and owner = #{owner}

  12. </if>

  13. </where>

  14. </select>

        where标签的作用是会在写<where>的地方自动输出一个where,即省略了SQL语句中的where关键字;像上面这段动态SQL,假如第一个判断成立,那么MyBatis为我们生成的SQL语句是:select * from t_blog where title = #{title}; ,而不是:select * from t_blog where and title = #{title},即MyBatis的动态SQL会自动把第一个多余的and去掉,如果将这里的and换成or,也会有同样的效果。
 

 

5、set

        set标签主要用在更新操作的时候,它的功能和where元素差不多,主要是在包含的语句最前面添加一个set前缀,然后如果所包含的语句是以逗号结尾的话就将该逗号忽略,如果set包含的内容为空的话就会报错。一个例子的代码如下:

 

 
  1. <update id="dynamicSetTest" parameterType="Blog">

  2. update t_blog

  3. <set>

  4. <if test="title != null">

  5. title = #{title},

  6. </if>

  7. <if test="content != null">

  8. content = #{content},

  9. </if>

  10. <if test="owner != null">

  11. owner = #{owner}

  12. </if>

  13. </set>

  14. where id = #{id}

  15. </update>

        在上面这段代码中,如果set中的三个判断都不成立,即set中的内容为空,那么就会报错。有了set标签,我们就可以动态的更新那些修改了的字段了。

 

 

6、foreach

        foreach标签主要用于构建in条件,它可以在SQL语句中迭代一个集合。foreach标签的属性有item、index、collection、open、separator、close,其中,item表示集合中的元素进行迭代时的别名;index指定当前迭代的位置;open指定这段SQL的前缀;separator指定每个迭代元素之间的分隔符;close指定这段SQL的后缀;collection指定集合类型:

    (1)如果传入List列表,则collection的属性值为list,示例代码如下:

 

 
  1. <select id="dynamicForeachTest" resultType="Blog">

  2. select * from t_blog where id in

  3. <foreach collection="list" index="index" item="item" open="(" separator="," close=")">

  4. #{item}

  5. </foreach>

  6. </select>

 

    (2)如果传入数组,则collection的属性值为array,示例代码如下:

 

 
  1. <select id="dynamicForeach2Test" resultType="Blog">

  2. select * from t_blog where id in

  3. <foreach collection="array" index="index" item="item" open="(" separator="," close=")">

  4. #{item}

  5. </foreach>

  6. </select>

 

    (3)如果传入Map集合,则collection的属性值是Map集合的key,示例代码如下(在这个例子中,Map中存储着一个key是ids的List):

 

 
  1. <select id="dynamicForeach3Test" resultType="Blog">

  2. select * from t_blog where title like "%"#{title}"%" and id in

  3. <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">

  4. #{item}

  5. </foreach>

  6. </select>

 

    (4)如果是Set集合,且Set中每个元素的类型是Map.Entry时,则collection的属性值为collection,此时index属性代表Map.Entry的key,item属性代表Map.Entry的value。示例代码如下:

 

 
  1. <select id="dynamicForeachTest" resultType="Blog">

  2. select * from t_blog where id in

  3. <!-- 遍历的对象是Map.Entry时,index代表对应的key,item代表对应的value -->

  4. <foreach collection="collection" index="key" item="value" open="(" separator="," close=")">

  5. #{key}, #{value}

  6. </foreach>

  7. </select>

 

 

7、bind

        bind标签主要用于模糊查询的字符串拼接,一个例子的代码如下:

 

 
  1. <select id="fuzzyQuery" resultType="Blog" parameterType="java.lang.String">

  2. <bind name="titleLike" value="'%'+_parameter+'%'"/>

  3. select * from t_blog where title like #{titleLike}

  4. </select>

 

8、SQL

        有时,如果动态SQL中包含的代码过长,且有可能在不同的SQL语句中重复用到,那么就可以将这段SQL提取出来作为SQL片段(也相当于封装)。抽取出来的SQL语句使用<sql>标签包裹,在使用到某个SQL片段时,使用<include>标签引入SQL片段。一个例子的代码如下:

 

 

[html] view plain copy

  1. <code class="language-html"><!-- 被抽取出来的SQL片段(id是这个SQL片段的唯一标识) -->  
  2. <!-- 注意:SQL片段一般都是基于单表创建的;SQL片段中最好不要包括where语句 -->  
  3. <sql id="blog_query">  
  4.     <if test="title!=null">  
  5.         and title = #{title}  
  6.     </if>  
  7. </sql>  
  8.   
  9. <select id="findEmplyeeListDynamicSQL" parameterType="Blog" resultType="Blog">  
  10.     SELECT * FROM t_blog  
  11.     <where>  
  12.         <!-- 引用抽取出来的SQL片段。如果要引用的SQL片段在其他mapper文件中,则需要在前面添加namespace -->  
  13.         <include refid="blog_query"></include>  
  14.     </where>  
  15. </select></code>  
相关文章
|
3月前
|
SQL 数据采集 自然语言处理
NL2SQL之DB-GPT-Hub<详解篇>:text2sql任务的微调框架和基准对比
NL2SQL之DB-GPT-Hub<详解篇>:text2sql任务的微调框架和基准对比
|
2月前
|
SQL 监控 安全
Flask 框架防止 SQL 注入攻击的方法
通过综合运用以上多种措施,Flask 框架可以有效地降低 SQL 注入攻击的风险,保障应用的安全稳定运行。同时,持续的安全评估和改进也是确保应用长期安全的重要环节。
155 71
|
5月前
|
Java 数据库连接 Maven
手把手教你如何搭建SSM框架、图书商城系统案例
这篇文章是关于如何搭建SSM框架以及实现一个图书商城系统的详细教程,包括了项目的配置文件整合、依赖管理、项目结构和运行效果展示,并提供了GitHub源码链接。
手把手教你如何搭建SSM框架、图书商城系统案例
|
1月前
|
SQL 存储 人工智能
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
Vanna 是一个开源的 Python RAG(Retrieval-Augmented Generation)框架,能够基于大型语言模型(LLMs)为数据库生成精确的 SQL 查询。Vanna 支持多种 LLMs、向量数据库和 SQL 数据库,提供高准确性查询,同时确保数据库内容安全私密,不外泄。
109 7
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
|
5月前
|
SQL Java 数据库
建模底层逻辑问题之ORM框架建模中,执行SQL的过程中被抽象和组织是如何实现的
建模底层逻辑问题之ORM框架建模中,执行SQL的过程中被抽象和组织是如何实现的
|
1月前
|
SQL 安全 Java
除了Flask框架,还有哪些框架能防止SQL注入攻击?
这些框架都在安全方面有着较好的表现,通过它们的内置机制和安全特性,可以有效地降低 SQL 注入攻击的风险。然而,无论使用哪个框架,开发者都需要具备良好的安全意识,正确配置和使用框架提供的安全功能,以确保应用的安全可靠。同时,持续关注安全更新和漏洞修复也是非常重要的。
47 7
|
2月前
|
SQL 安全 PHP
PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
67 4
|
5月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
5月前
|
Java 数据库连接 Maven
SSM框架整合图书管理项目
这篇文章是关于SSM框架整合到图书管理项目的详细教程,涵盖了从Maven项目构建、依赖导入、数据库连接、配置文件编写、实体类和接口实现到SpringMVC整合的完整步骤。
SSM框架整合图书管理项目
|
4月前
|
XML Java 数据库连接
如何搭建SSM框架、图书商城系统
这是一份详尽的《Spring + SpringMVC + Mybatis 整合指南》,作者耗时良久整理出约五万字的内容,现已经全部笔记公开。此文档详细地介绍了如何搭建与整合SSM框架,具体步骤包括创建Maven项目、添加web骨架、配置pom文件以及整合Spring、SpringMVC和Mybatis等。无论是对初学者还是有一定基础的开发者来说,都是很好的学习资源。此外,作者还提供了项目源码的GitHub链接,方便读者实践。虽然当前主流推荐学习SpringBoot,但了解SSM框架仍然是不可或缺的基础。
64 0