MyBatis 之 动态SQL技术

简介: MyBatis 之 动态SQL技术

引言:



动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。


使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。


如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。


这里我们使用的表为t_emp 对应的实体类名为Emp


字段: emp_name, emp_id ,age ,gender 对应的属性名 : empName , empId , age ,gender


First : if 标签



if 标签只有一个test属性 只有test属性的表达式判定结果为true ,其中的内容才会被执行

<select id="getEmpByCondition" resultType="Emp">
    select * from t_emp where
        <if test="empName != null and empName != ''">
             emp_name = #{empName}
        </if>
        <if test="gender != null and gender != ''">
            and  gender = #{gender}
        </if>
</select>
复制代码

但是这样做的局限性非常大 , 如果我们第一个if 不满足的话 ,那么就会导致后面满足条件的语句前面多出来一个and ,这个问题又无法解决 ,那么就用到了下面的where标签


Second : where标签



使用where 标签作用:


  1. 如果标签中没有任何的条件满足 那么就不需要执行任何的功能 ;可以直接退出 , 如果满足 那么就执行里面的if 标签
  2. 可以将if中内容前面的没用的and去除 ( 内容后面的and 无法去除), 所以可以都添加 ;
  3. 如果 where 标签中有条件成立 , 他将会自动的添加where
<select id="getEmpByCondition" resultType="Emp">
    select * from t_emp
    <where>
        <if test="empName != null and empName != ''">
            and emp_name = #{empName}
        </if>
        <if test="age != null and age != ''">
            and  age = #{age}
        </if>
        <if test="gender != null and gender != ''">
            and  gender = #{gender}
        </if>
    </where>
</select>
复制代码


Third : trim 标签



trim标签中相关属性的作用


prefix / suffix: 在内容前面 / 后面添加指定内容

prefixOverrides /suffixOverrides 在内容前面 / 后面 去除某些指定内容

<select id="getEmpByCondition" resultType="Emp">
    select * from t_emp
    <trim prefix="where" prefixOverrides="and">
        <if test="empName != null and empName != ''">
           and emp_name = #{empName}
        </if>
        <if test="age != null and age != ''">
            and  age = #{age}
        </if>
        <if test="gender != null and gender != ''">
            and  gender = #{gender}
        </if>
    </trim>
</select>
复制代码


Fourth : choose - when - otherwise 标签



它和java中的switch语句十分相似 ,所以它只有一个when语句会被执行 ,如果都不满足 , 那么就会执行otherwise语句

<select id="getEmpByChoose" resultType="Emp">
    select * from t_emp
        <where>
            <choose>
                <when test="empName != null and empName != ''">
                    emp_name = #{empName}
                </when>
                 <when test="age != null and age != ''">
                    age = #{age}
                </when>
                <when test="gender != null and gender != ''">
                    gender = #{gender}
                </when>
                <otherwise>
                </otherwise>
            </choose>
        </where>
</select>
复制代码


Fifth : foreach 标签



属性:


  • collection:设置要循环的数组或集合
  • item:表示集合或数组中的每一个数据
  • separator:设置循环体之间的分隔符
  • open:设置foreach标签中的内容的开始符
  • close:设置foreach标签中的内容的结束符
<!--  批量添加员工信息  void insertMoreEmp(@Param ("emps") List<Emp> emps);-->
    <insert id="insertMoreEmp">
        insert into t_emp values
         <foreach collection="emps" item="emp" separator=",">
             (null ,#{emp.empName},#{emp.age},#{emp.gender},null)
         </foreach>
    </insert>
复制代码
<!--   批量删除的功能 void deleteMoreEmp(@Param("empIds") Integer[] empIds);-->
    <delete id="deleteMoreEmp">
        delete from t_emp where emp_id in
        <foreach collection="empIds" item="empId" separator="," open="(" close=")">
            #{empId}
        </foreach>
    </delete>
复制代码


Sixth : SQL标签



sql 标签 可以记录一段公共sql片段,在使用的地方通过include标签进行引入

<sql id="Columns">
    emp_id, emp_name,age ,gender
</sql>
select <include refid="Columns"></include> from t_emp
复制代码


写在最后



如果各位觉得有用,请点赞支持一下


如果我写的哪里有不足, 以及各位觉得哪里不明白的请评论区指出


诚挚欢迎各位交流学习,共同进步


目录
相关文章
|
2月前
|
SQL Java 测试技术
3、Mybatis-Plus 自定义sql语句
这篇文章介绍了如何在Mybatis-Plus框架中使用自定义SQL语句进行数据库操作。内容包括文档结构、编写mapper文件、mapper.xml文件的解释说明、在mapper接口中定义方法、在mapper.xml文件中实现接口方法的SQL语句,以及如何在单元测试中测试自定义的SQL语句,并展示了测试结果。
3、Mybatis-Plus 自定义sql语句
|
11天前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
25天前
|
SQL 机器学习/深度学习 自然语言处理
Text-to-SQL技术演进 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法剖析
本文主要介绍了阿里云OpenSearch在Text-to-SQL任务中的最新进展和技术细节。
|
2月前
|
SQL Java 数据库连接
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
文章讲述了在使用Mybatis时遇到的资源文件找不到的问题,并提供了通过修改Maven配置来解决资源文件编译到target目录下的方法。
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
|
1月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
31 1
|
2月前
|
SQL Java 数据库连接
Mybatis系列之 动态SQL
文章详细介绍了Mybatis中的动态SQL用法,包括`<if>`、`<choose>`、`<when>`、`<otherwise>`、`<trim>`和`<foreach>`等元素的应用,并通过实际代码示例展示了如何根据不同条件动态生成SQL语句。
|
2月前
|
SQL Java 关系型数据库
SpringBoot 系列之 MyBatis输出SQL日志
这篇文章介绍了如何在SpringBoot项目中通过MyBatis配置输出SQL日志,具体方法是在`application.yml`或`application.properties`中设置MyBatis的日志实现为`org.apache.ibatis.logging.stdout.StdOutImpl`来直接在控制台打印SQL日志。
SpringBoot 系列之 MyBatis输出SQL日志
|
2月前
|
SQL 关系型数据库 MySQL
解决:Mybatis-plus向数据库插入数据的时候 报You have an error in your SQL syntax
该博客文章讨论了在使用Mybatis-Plus向数据库插入数据时遇到的一个常见问题:SQL语法错误。作者发现错误是由于数据库字段中使用了MySQL的关键字,导致SQL语句执行失败。解决方法是将这些关键字替换为其他字段名称,以避免语法错误。文章通过截图展示了具体的操作步骤。
|
1月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
64 0
|
2月前
|
测试技术 Java
揭秘Struts 2测试的秘密:如何打造无懈可击的Web应用?
【8月更文挑战第31天】在软件开发中,确保代码质量的关键在于全面测试。对于基于Struts 2框架的应用,结合单元测试与集成测试是一种有效的策略。单元测试聚焦于独立组件的功能验证,如Action类的执行逻辑;而集成测试则关注组件间的交互,确保框架各部分协同工作。使用JUnit进行单元测试,可通过简单示例验证Action类的返回值;利用Struts 2 Testing插件进行集成测试,则可模拟HTTP请求,确保Action方法正确处理请求并返回预期结果。这种结合测试的方法不仅提高了代码质量和可靠性,还保证了系统各部分按需协作。
12 0
下一篇
无影云桌面