MyBatis choose、when和otherwise标签

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

动态语句 choose-when-otherwise 语法如下。

  • <choose>
  • <when test="判断条件1">
  • SQL语句1
  • </when >
  • <when test="判断条件2">
  • SQL语句2
  • </when >
  • <when test="判断条件3">
  • SQL语句3
  • </when >
  • <otherwise>
  • SQL语句4
  • </otherwise>
  • </choose>

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

示例

以下示例要求:

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

下面使用 choose-when-otherwise 标签实现(本节示例基于《第一个MyBatis程序》一节的代码实现)。

WebsiteMapper.xml 代码如下。

  1. <mapper namespace="net.biancheng.mapper.WebsiteMapper">
  2. <select id="selectWebsite"
  3. parameterType="net.biancheng.po.Website"
  4. resultType="net.biancheng.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>

WebsiteMapper 类中方法如下。

  • public List<Website> selectWebsite(Website website);

测试类代码如下。

  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<Website> siteList = ss.selectList("net.biancheng.mapper.WebsiteMapper.selectWebsite", site);
  11. for (Website ws : siteList) {
  12. System.out.println(ws);
  13. }
  14. }
  15. }

输出结果如下。

DEBUG [main] - ==>  Preparing: SELECT id,name,url,age,country FROM website WHERE 1=1 AND name LIKE CONCAT('%',?,'%')
DEBUG [main] - ==> Parameters: 编程(String)
DEBUG [main] - <==      Total: 1
Website[id=1,name=编程帮,url=https://www.biancheng.net/,age=10,country=CN,createtime=null]

这样 MyBatis 就会根据参数的设置进行判断来动态组装 SQL,以满足不同业务的要求。远比 Hibernate 和 JDBC 中大量判断 Java 代码要清晰和明确。

腾讯云推出云产品限时特惠抢购活动:2C2G云服务器7.9元/月起
本文链接:https://www.jhelp.net/p/W2qjpQJy5rUGpVHK (转载请保留)。
关注下面的标签,发现更多相似文章