MyBatis之动态SQL(八)

本文深入探讨MyBatis框架中的动态SQL应用,包括if、where、foreach和sql标签的使用技巧,通过实例演示如何根据不同的业务需求灵活构建SQL查询语句。

文章目录

(一)if标签
(二)where标签
(三)foreach标签
(四)sql标签

我们基于之前的案例,只保留4个查询方法

(一)if标签

  • 我们设想一个场景:
    前端可能传来用户名,让后端查询用户
    前端也可能传来用户名、用户地址,让后端查询用户
    我们不确定有多少个参数条件,此时可以用动态SQL的if标签解决

IUserDao.java

    /**
     * 根据传入的参数条件查询
     *
     * @param user 查询的条件,有可能有用户名,有可能有性别,有可能有地址……
     *             可能全部条件都有,可能一个都没有,可能只有一部分
     * @return
     */
    List<User> findUserByCondition(User user);

IUserDao.xml

    <!--    根据条件查询-->
    <select id="findUserByCondition" resultType="user" parameterType="user">
        select * from user where 1=1
        <if test="username != null">
            and username = #{username}
        </if>
    </select>

MyBatisTest.java

    /**
     * 测试根据条件查询
     */
    @Test
    public void testFindByCondition() {
        User user = new User();
        user.setUsername("老王");

        List<User> users = userDao.findUserByCondition(user);
        for (User u : users) {
            System.out.println(u);
        }
    }

效果如下:

如果不传参,效果如下:

(二)where标签

如果参数条件很多的话,用if标签就显得很复杂了,如下:

我们可以用where标签优化代码
我们用where标签把我们刚才写的if标签的代码包围起来
可以省略掉where 1=1

(三)foreach标签

我们看看以下这条SQL语句

我们对应在mybatis中的写法:
我们先在QueryVo实体类中添加ids属性

IUserDao.java

    /**
     * 根据QueryVo中提供的id集合,查询用户信息
     *
     * @param vo
     * @return
     */
    List<User> findUserInIds(QueryVo vo);

IUserDao.xml
foreach标签可以跟前面的where标签if标签混合使用)

    <!--    根据QueryVo中的id集合实现查询用户列表-->
    <select id="findUserInIds" resultType="user" parameterType="queryvo">
        select * from user
        <where>
            <if test="ids != null and ids.size()>0">
                <foreach collection="ids" open="and id in (" close=")" item="id" separator=",">
                    #{id}
                </foreach>
            </if>
        </where>
    </select>

  • <foreach>标签用于遍历集合,它的属性如下:
    collection:代表要遍历的集合元素
    open:代表语句开始的部分
    close:代表结束部分
    item:代表遍历集合的每个元素,生成的变量名
    sperator:代表分隔符

MyBatisTest.java

    /**
     * 测试foreach标签的使用
     */
    @Test
    public void testFindInIds() {
        QueryVo vo = new QueryVo();
        List<Integer> list = new ArrayList<Integer>();
        list.add(41);
        list.add(43);
        list.add(45);
        vo.setIds(list);
        List<User> users = userDao.findUserInIds(vo);
        for (User user : users) {
            System.out.println(user);
        }
    }

效果如下:

(四)sql标签

我们可以用sql标签抽取重复的sql语句

    <!--    抽取重复的sql语句-->
    <sql id="defaultUser">
            select * from user;
    </sql>

然后引用即可

注意:如果用这种方法,最好不要在sql语句末尾加分号
否则if之类的标签拼接会失败
其实写不写分号都是可以的,我们以后都不要写分号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zheng_zq666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值