Mybatis 动态SQL

本文介绍了MyBatis中动态SQL的使用,包括if标签实现条件查询,where标签优化where子句,以及foreach标签处理集合参数,通过实例展示了如何在映射文件中编写这些动态SQL,以实现更灵活的数据库查询操作。

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

动态SQL官方文档

一、动态SQL----if标签

我们根据实体类的不同取值,使用不同的 SQL 语句来进行查询。比如在 id 如果不为空时可以根据 id 查询,如果 username 不为空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。
1.dao层接口

 List<User> findUser(User user);

2.映射文件编写

<select id="findUser" resultType="User" parameterType="User">
        select * from user where 1=1
            <if test="username!=null">
                and username=#{username}
            </if>
            <if test="sex!=null">
                and sex=#{sex}
            </if>
    </select>

3.测试类编写

@Test
public void testFindUser() {
User u1= new User();
u1.setUsername("张三");
u1.setSex("男");
//6.执行操作
List<User> users = userDao.findByUser(u1);
for(User user : users) {
System.out.println(user);
}
}

二、动态SQL----where标签

为了简化上面 where 1=1 的条件拼装,我们可以采用标签来简化开发
1、映射配置文件编写

 <select id="findUser" resultType="User" parameterType="User">
        select * from user
        <where>
            <if test="username!=null">
                and username=#{username}
            </if>
            <if test="sex!=null">
                and sex=#{sex}
            </if>
            <if test="address!=null">
                and address=#{address}
            </if>
        </where>
    </select>

2、测试类编写

   @Test
        public void testFindUser() {
            User u1 = new User();
            u1.setUsername("老王");
            u1.setSex("女");
            List<User> users = userDao.findUser(u1);
            for (User user : users) {
                System.out.println(user);
            }
        }

三、动态SQL----froeach标签

传入多个 id 查询用户信息,用下边两个 SQL语句 实现:
SELECT * FROM USERS WHERE username LIKE ‘%王%’ AND (id =10 OR id =89 OR id=16)
SELECT * FROM USERS WHERE username LIKE ‘%王%’ AND id IN (10,89,16)
这样我们在进行范围查询时,就要将一个集合中的值,作为参数动态添加进来。
这样我们将如何进行参数的传递?
1、 在pojo中加入加入一个 List 集合用于封装参数

private List<Integer> ids;
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
 }
}

2、编写DAO层接口

List<User> findIds(QueryVo vo);

3、编写映射文件

<select id="findIds" resultType="user" parameterType="user">
      select * from user
 <where>
        <if test="ids != null and ids.size()>0">
            <foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
                #{uid}
            </foreach>
        </if>
       </where>
    </select>

SQL 语句:
select 字段 from user where id in (?)
foreach标签用于遍历集合,它的属性:
collection:代表要遍历的集合元素,注意编写时不要写#{}
open:代表语句的开始部分
close:代表结束部分

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值