• MyBatis动态SQL(if、choose、when和otherwise)标签


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

    动态 SQL 只有几个基本元素,与 JSTL 或 XML 文本处理器相似,十分简单明了,大量的判断都可以在 MyBatis 的映射 XML 文件里配置,以达到许多需要大量代码才能实现的功能。动态 SQL 大大减少了编写代码的工作量,更体现了 MyBatis 的灵活性、高度可配置性和可维护性

    if标签:条件判断

    MyBatis if 类似于 Java 中的 if 语句,是 MyBatis 中最常用的判断语句

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

    1. <if test="判断条件">
    2. SQL语句
    3. if>

    当判断条件为 true 时,才会执行所包含的 SQL 语句。
    最常见的场景是在 if 语句中包含 where 子句,例如

    1. <select id="selectAllWebsite" resultMap="myResult">
    2. select id,name,url from website
    3. <if test="name != null">
    4. where name like #{name}
    5. if>
    6. select>

    以上代表表示根据网站名称去查找相应的网站信息,但是网站名称是一个可填可不填的条件,不填写的时候不作为查询条件。


    可多个 if 语句同时使用。以下语句表示为可以按照网站名称(name)或者网址(url)进行模糊查询。如果您不输入名称或网址,则返回所有的网站记录。但是,如果你传递了任意一个参数,它就会返回与给定参数相匹配的记录。

    1. <select id="selectAllWebsite" resultMap="myResult">
    2. select id,name,url from website where 1=1
    3. <if test="name != null">
    4. AND name like #{name}
    5. if>
    6. <if test="url!= null">
    7. AND url like #{url}
    8. if>
    9. select>

    choose、when和otherwise标签

    MyBatis 中动态语句 choose-when-otherwise 类似于 Java 中的 switch-case-default 语句。由于 MyBatis 并没有为 if 提供对应的 else 标签,如果想要达到...... 的效果,可以借助 来实现。
    动态语句 choose-when-otherwise 语法如下

    1. <choose>
    2. <when test="判断条件1">
    3. SQL语句1
    4. <when test="判断条件2">
    5. SQL语句2
    6. <when test="判断条件3">
    7. SQL语句3
    8. <otherwise>
    9. SQL语句4
    10. otherwise>
    11. choose>

    choose 标签按顺序判断其内部 when 标签中的判断条件是否成立,如果有一个成立,则执行相应的 SQL 语句,choose 执行结束;如果都不成立,则执行 otherwise 中的 SQL 语句。这类似于 Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。

    示例

    以下示例要求:

    • 当网站名称不为空时,只用网站名称作为条件进行模糊查询;
    • 当网站名称为空,而网址不为空时,则用网址作为条件进行模糊查询;
    • 当网站名称和网址都为空时,则要求网站年龄不为空。

     WebsiteMapper.xml 代码如下

    1. <mapper namespace="net.cc.mapper.WebsiteMapper">
    2. <select id="selectWebsite"
    3. parameterType="net.cc.po.Website"
    4. resultType="net.cc.po.Website">
    5. SELECT id,name,url,age,country
    6. FROM website WHERE 1=1
    7. <choose>
    8. <when test="name != null and name !=''">
    9. AND name LIKE CONCAT('%',#{name},'%')
    10. when>
    11. <when test="url != null and url !=''">
    12. AND url LIKE CONCAT('%',#{url},'%')
    13. when>
    14. <otherwise>
    15. AND age is not null
    16. otherwise>
    17. choose>
    18. select>
    19. mapper>

    测试类代码

    1. public class Test {
    2. public static void main(String[] args) throws IOException {
    3. // 读取配置文件mybatis-config.xml
    4. InputStream config = Resources.getResourceAsStream("mybatis-config.xml"); // 根据配置文件构建
    5. SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
    6. // 通过SqlSessionFactory创建SqlSession
    7. SqlSession ss = ssf.openSession();
    8. Website site = new Website();
    9. site.setname("编程");
    10. List siteList = ss.selectList("net.cc.mapper.WebsiteMapper.selectWebsite", site);
    11. for (Website ws : siteList) {
    12. System.out.println(ws);
    13. }
    14. }
    15. }

  • 相关阅读:
    vue3基础(三)组件命名及调用,render,render中获取插槽值,函数式组件,异步组件,vue3中data只有函数形式
    保存 uboot图像配置
    HDRP shader 获取阴影(Custom Pass)
    并列句------六级
    使用Flask和Flask-JWT-Extended保护API免受跨站请求攻击
    基于蚁群算法的三维路径规划算法
    ur机械臂30003端口socket通信踩坑(double类型数据怎么解析)
    SpringMVC之自定义注解
    驰骋BPM RunSQL_Init接口SQL注入漏洞复现 [附POC]
    SonarQube安装、出现启动出错并解决记录、配合idea配置使用,gradle项目配置
  • 原文地址:https://blog.csdn.net/qq_43079001/article/details/133760347