发表于: 2020-02-24 17:17:34

1 1162


今天完成的事情:

在执行查询操作时查询条件可能比较复杂,比如查询条件包括:username、sex、address。此时需要在sql语句中加上这三个查询条件。但是这三个条件来自用户输入,可能会缺少某些条件,可能只输入了一个,也可能输入了三个,此时使用动态SQL语句就可以解决这个问题,动态SQL语句会根据条件拼接sql语句。

if标签

if标签主要是判断某个条件是否存在,如下的示例中表示根据username和address查询用户,示例中使用别名:

<select id="findByUser" resultType="user" parameterType="user">

    select * from user where 1=1 

    <if test="username!=null and username != '' ">

        and username like #{username}

    </if>

    <if test="address != null">

        and address like #{address}

    </if>

</select>


详解:

test属性:判断条件,其值为参数对象的属性名,如果参数是包装类的对象要使用OGNL表达式的写法,例如user.username。

1=1的作用:防止出现类似where and id=1或者只有where而其后没有条件的情况发生。

在持久层接口(UserDao)中添加findByUser方法,如下:

/** 

 * 根据用户信息,查询用户

 * @param user 

 * @return 

 */ 

List<User> findByUser(User user);


在测试类中添加如下测试方法,运行该测试方法即可看效果:

/**

 * 测试根据用户信息,查询用户

 */

@Test

public void testFindByUser() {

    User u = new User();

    u.setUsername("%王%");

    List<User> users = userDao.findByUser(u);

    for (User user:users){

        System.out.println(user);

    }

}


where标签

在if标签中,我们使用了1=1这个条件来避免因为一些特殊情况而引发的错误,但是这个条件并没有意义,对此我们可以使用where标签,只需将上述映射文件中的内容做如下修改即可:

<select id="findByUser" resultType="user" parameterType="user">

    select * from user

    <where>

        <if test="username!=null and username != '' ">

            and username like #{username}

        </if>

        <if test="address != null">

            and address like #{address}

        </if>

    </where>

</select>


choose, when, otherwise标签

有时我们不想使用所有的条件语句,而只想从中选择一个。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

修改上面的例子如下,提供了username就按username查找,提供了address就按address查找,若两者都没有提供,就按照otherwise标签中的条件查找,运行测试方法就能看想要的结果啦:

<select id="selectChoose" resultType="student">

    select * from user

    <where>

        <choose>

          <when test="username!=null and username!=''">

              username like #{username}

          </when>

          <when test="address!=null and address!=''">

              address=#{address}

          </when>

          <otherwise>

              sex='男'

          </otherwise>

        </choose>

    </where>

</select>


foreach标签

如果我们想查询id在某个集合或数组中存在的用户该如何使用动态SQL语句实现呢?答案是使用foreach标签遍历改集合或数组,构造出我们想要的SQL语句,例如:

<select id="findUserInIds" resultType="user">

    select * from user

    <where>

        <if test="list!=null and list.size>0">

            <foreach collection="list" open="id in(" close=")" separator="," item="id">

                #{id}

            </foreach>

        </if>

    </where>

</select>


在持久层接口(UserDao)中添加如下方法:

/**

 * 根据提供的id集合查询用户信息

 * @return

 */

List<User> findUserInIds(List list);


在测试类中添加如下测试方法,运行该测试方法即可看效果:

/**

 * 测试根据提供的id集合查询用户信息

 */

@Test

public void testFindUserInIds() {

    List<Integer> list = new ArrayList<>();

    list.add(42);

    list.add(43);

    list.add(44);

    list.add(45);

    List<User> users = userDao.findUserInIds(list);

    for (User user:users){

        System.out.println(user);

    }

}

1

foreach标签各属性详解:

collection:要遍历的集合或数组,集合使用list.size获取长度,数组使用array.length获取长度。

open:添加在遍历结果句首的字符串。

close:添加在遍历结果句尾的字符串。

separator:遍历各项之间的分隔符。

item:遍历各项的名字。

注意: 当遍历的是数组时,无论参数名是什么,在动态sql中都必须且只能使用array这个名称。

sql标签

sql标签可以用来定义一个可被重复使用的sql片段,在使用的时候使用include标签就可以将sql标签中的内容引入。




返回列表 返回列表
评论

    分享到