mybatis学习之路----动态sql之choose when otherwise

本文详细介绍了MyBatis中choose节点的使用方法及其与Java switch语句的相似之处。通过具体的XML配置示例,解释了如何根据不同条件生成动态SQL,并展示了choose节点内部when和otherwise子节点的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点滴记载,点滴进步,愿自己更上一层楼。

官方文档 传送门

choose节点,用法跟java中的switch 语法相似(官方文档这么说,事实也是这样)。

节点用法。

            <choose>
                <when test="username != null">
                    username = #{username}
                </when>
                <when test="password != null">
                    password = #{password}
                </when>
                <otherwise>
                    1=1
                </otherwise>
            </choose>
里面的一条条的when其实就相当于一条条的 <if test ....  

mybatis在解析choose节点的时候就是将一条条的when放入到list中,otherwise 相关内容专门放到一个对象中,

然后循环着查找条件成立的一条,然后将该条的sql拼接到sql中,如果when条件都不成立,则直接执行otherwise中的内容。

源码:

public class ChooseSqlNode implements SqlNode {
  private SqlNode defaultSqlNode;
  private List<SqlNode> ifSqlNodes;

  public ChooseSqlNode(List<SqlNode> ifSqlNodes, SqlNode defaultSqlNode) {
    this.ifSqlNodes = ifSqlNodes;
    this.defaultSqlNode = defaultSqlNode;
  }

  @Override
  public boolean apply(DynamicContext context) {
    for (SqlNode sqlNode : ifSqlNodes) {
      if (sqlNode.apply(context)) {
        return true;
      }
    }
    if (defaultSqlNode != null) {
      defaultSqlNode.apply(context);
      return true;
    }
    return false;
  }
}
简单明了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值