JavaEE简单示例——动态SQL元素<choose>

梦想不抛弃苦心追求的人,只要不停止追求,你们会沐浴在梦想的光辉之中。再美好的梦想与目标,再完美的计划和方案,如果不能尽快在行动中落实,最终只能是纸上谈兵,空想一番。只要瞄准了大方向,坚持不懈地做下去,才能够扫除挡在梦想前面的障碍,实现美好的人生蓝图。JavaEE简单示例——动态SQL元素<choose>,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

简单介绍:

之前我们介绍过MyBatis的动态SQL中的<if>标签,if标签可以帮助我们在拼接SQL语句的时候进行条件判断。但是if只能进行单一的选择,也就是说test中的值只能是true和false,在某些时候,我们很多的时候需要从很多的条件中只选择一个,这种时候就可以使用<choose>元素来帮助我们实现。在<choose>中有两个子标签<when>和<otherwise>,<when>可以有很多个,但是<otherwise>只能存在一个,当其中一个<when>的条件被满足的时候,则只会执行这一个<when>后面的语句,不再执行其他<when>中的语句,如果所有的<when>中的条件都不符合,则会执行<otherwise>中的语句。类似于Java中的switch

使用方法:

<select id=”唯一标识” parameterType=”” resultType=””>

<choose>

        select * form user where 1=1

        <when test=”判断条件”>

        <when test=”判断条件”>

</select>

代码实现:

SQL映射文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Mappers.dynamicSql">
  <select id="selectByIdOrName" parameterType="student" resultType="student">
    select * from student where 1=1
#                             当id的值不等于null并且id的值不是空字符的时候,就会拼接这个SQL语句
        <if test="id != null and id != ''">
          and id = #{id}
        </if>
#                             当name的值不等于null的时候并且name的值不是空字符串的时候,就会拼接这个SQL语句
        <if test="name != null and name != ''">
#                             注意这个地方是使用了一个concat函数将模糊匹配的百分号和参数进行拼接,在使用的时候注意这个地方不要写错
          and name like concat ('%',#{name},'%')
        </if>
  </select>
    <select id="selectAll" resultType="student">
        select * from student;
    </select>
<!--    动态SQL中的choose元素-->
<!--    当查询的条件满足第一个when的时候,就拼接第一个when里面的SQL语句-->
<!--    当查询的条件满足第二个when的时候,就拼接第二个when里面的SQL语句-->
<!--    当所有的when都不满足的时候,就拼接otherwise里面的SQL语句-->
<!--    当有多个when里面的条件都满足的时候,就拼接最靠上的一条SQL语句,并且不会执行其他when里面的语句-->
    <select id="selectStudentByIdAndName" resultType="student" >
        select * from student where 1=1
        <choose>
            <when test="name != null and name != ''">
                and name like concat('%',#{name},'%')
            </when>
            <when test="id != null and id != ''">
                and id = #{id}
            </when>
            <otherwise>
                and password is not null
            </otherwise>
        </choose>
    </select>
</mapper>

接口文件:

package Mappers;

import com.mybatis.POJO.student;

import java.util.List;

public interface dynamicSql {
    List<student> selectByIdOrName(student s);
    List<student> selectStudentByIdAndName(student s);
}

测试类:

package Mappers;

import com.mybatis.POJO.Tools.createSqlSession;
import com.mybatis.POJO.student;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class dynamicSqlTest {
    @Test
    public void selectByIdOrName(){
        SqlSession sqlSession = new createSqlSession().create();
        dynamicSql dynamicSql = new createSqlSession().createdynamicSql();
        student s = new student();
        s.setId(1);
        s.setName("张三");
        List<student> stu = sqlSession.selectList("Mappers.dynamicSql.selectByIdOrName", s);
        for(student student : stu){
            System.out.println(student.toString());
        }
    }
    @Test
    public void selectStudentByIdAndName(){
        dynamicSql dynamicSql = new createSqlSession().createdynamicSql();
        student s =new student();
        s.setId(1);
//        s.setName("张三");
        for (student student : dynamicSql.selectStudentByIdAndName(s)) {
            System.out.println(student);
        }

    }
    @Test
    public void selectAll(){
        SqlSession sqlSession = new createSqlSession().create();
        dynamicSql dynamicSql = new createSqlSession().createdynamicSql();
        List<student> list = sqlSession.selectList("Mappers.dynamicSql.selectAll");
        for(student student : list){
            System.out.println(student.toString());
        }
    }
}

当满足其中一个when的时候:

JavaEE简单示例——动态SQL元素<choose>

我们先传入一个参数就是id的值,也就是说这时候会满足第一个when的条件,应该会只查询出跟id等于1有关的一条信息:

JavaEE简单示例——动态SQL元素<choose> 

 当我们关闭id等于1改为设置成name等于张三,这时候应该会查询出两条信息:

JavaEE简单示例——动态SQL元素<choose>

当满足多个when的时候:

如果我们两个条件都放开,就会同时满足两个条件,而这种时候就只会拼接最靠上的when中的SQL语句:

JavaEE简单示例——动态SQL元素<choose>

这时候我们两个条件都放开,两个值都不为空,同时满足两条when的条件:

JavaEE简单示例——动态SQL元素<choose> 这时候的查询结果应该会是满足了第一个when的时候就不再执行其他when中的语句,所以只会输出一条id等于1的时候的查询结果:

JavaEE简单示例——动态SQL元素<choose>

如何验证一下是不是真的是满足了第一个when的条件之后就不再向下执行了,我们可以把SQL映射文件中的两个when的顺序调换一下,然后再次运行一次看看效果:

JavaEE简单示例——动态SQL元素<choose> 这时候我们调换了when的顺序,而根据我们的想法,如果是满足了第一个when中的条件则不再向下执行的话,这次应该是根据name进行查询,查询出两天name等于张三的数据:

JavaEE简单示例——动态SQL元素<choose>

插叙结果满足我们的猜想,说明确实是在满足其中一个when的时候就不会在去匹配其他when的条件了。 

当所有的when都不满足的时候:

当我们不传入任何的参数,也就是所有的when的条件都不满足的时候,就会去拼接otherwise中的SQL语句,也就是查询出所有的password不为空的语句,对这张表来说就是所有的数据:

JavaEE简单示例——动态SQL元素<choose>

运行结果:

JavaEE简单示例——动态SQL元素<choose>

注意点:

本章节的注意点就是需要注意when的判断条件以及when的优先顺序,和SQL语句的拼接。

如果出现了报错,优先考虑是否是SQL拼接导致的报错;如果运行结果不符合自己的猜想,首先考虑是否是因为when的判断条件和顺序导致的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153314.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!