Mybatis_动态SQL

本文详细介绍了 MyBatis 的动态 SQL 功能,包括 if、choose、when、otherwise、where、bind、set 和 foreach 标签的使用方法,以及如何在映射配置文件、Mapper 接口和测试类中应用这些标签,实现条件判断、动态拼接 SQL、批量操作等功能。

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


一、什么是动态 SQL?

在 MyBatis 中提供了动态 SQL 功能。将使用 Java 代码拼接 SQL 语句,改变为在 XML 映射文件中使用标签拼接 SQL 语句。
MyBatis 中动态 SQL 是编写在 mapper.xml 中的,其语法和 JSTL 类似,但是却是基于强大的 OGNL 表达式实现的。

二、 if 标签

if 标签单分支判断语句

1、修改映射配置文件

<!--    根据用户给定的条件进行查询-->
    <select id="selectUsersByProperty" resultType="users">
        select * from users where 1=1
        <if test="userid != 0">
            and userid = #{userid}
        </if>
        <if test="username != null and username != ''">
            and username = #{username}
        </if>
        <if test="usersex != null and usersex != '' ">
            and usersex = #{usersex}
        </if>
    </select>

2、修改UsersMapper接口

List<Users> selectUsersByProperty(Users users);

3、创建测试类

public class SelectUsersByPropertyTest {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        Users users = new Users();
        users.setUsername("aaaaaa");
        users.setUserid(8);
        List<Users> list = usersMapper.selectUsersByProperty(users);
        list.forEach(System.out::println);

    }
}

在这里插入图片描述

三、 choose、when、otherwise 标签

从多个条件中选择一个使用。

1、修改映射配置文件

<!--    多选一条件-->
    <select id="selectUsersByChoose" resultType="users">
        select * from users where 1=1
        <choose>
            <when test="username != null and username !=''">
                and username = #{username}
            </when>
            <when test="usersex != null and usersex !=''">
                and usersex = #{usersex}
            </when>
            <otherwise>
                and userid = 1
            </otherwise>
        </choose>
    </select>

2、修改UsersMapper接口

    List<Users> selectUsersByChoose(Users users);

3、创建测试类

public class SelectUsersByChooseTest {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        Users users = new Users();
        users.setUsername("aaaaaa");
        List<Users> list = usersMapper.selectUsersByChoose(users);
        list.forEach(System.out::println);
        MybatisUtils.closeSqlSession();

    }
}

在这里插入图片描述

四、where标签

使用 where 标签,就不需要提供 where 1=1 这样的条件了。如果判断条件不为空则自动添加 where 关键字,并且会自动去掉第一个条件前面的 and 或 or。

1、修改映射配置文件

   <!--    根据用户给定的条件进行查询使用where标签实现-->
    <select id="selectUsersByPropertyWhere" resultType="users">
        select * from users
        <where>
        <if test="userid != 0">
            and userid = #{userid}
        </if>
        <if test="username != null and username != ''">
            and username = #{username}
        </if>
        <if test="usersex != null and usersex != '' ">
            and usersex = #{usersex}
        </if>
        </where>
    </select>

2、修改UsersMapper接口

    List<Users> selectUsersByPropertyWhere(Users users);

3、创建测试类

public class SelectUsersByPropertyWhereTest {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        Users users = new Users();
        users.setUsername("aaaaaa");
        users.setUserid(8);
        List<Users> list = usersMapper.selectUsersByPropertyWhere(users);
        list.forEach(System.out::println);
    }
}

五、bind标签

bind 标签允许我们在 OGNL 表达式以外创建一个变量,并可以将其绑定到当前的 SQL语句中。一般应用于模糊查询,通过 bind 绑定通配符和查询值。

1、修改映射配置文件

  • 未使用bind标签根据用户姓名进行模糊查询
<!--    根据用户姓名模糊查询-->
    <select id="selectUsersByLikeName" resultType="users">
        select * from users where username like concat('%',#{name},'%')
    </select>
  • 使用bind标签根据用户姓名进行模糊查询
<!--    根据用户姓名模糊查询-->
    <select id="selectUsersByLikeName" resultType="users">
        <bind name="likename" value="'%'+name+'%'"/>
        select * from users where username like #{likename}
    </select>

2、修改UsersMapper接口

  List<Users> selectUsersByLikeName(String name);

3、创建测试类

public class SelectUsersByLikeNameTest {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        List<Users> list = usersMapper.selectUsersByLikeName("a");
        list.forEach(System.out::println);
    }
}

在这里插入图片描述

六、set标签

set 标签用在 update 语句中。借助 if 标签,可以只对有具体值的字段进行更新。set 标签会自动添加 set 关键字,自动去掉最后一个 if 语句的多余的逗号。

1、修改映射配置文件

<!--    选择更新-->
    <update id="usersUpdate">
        update users
        <set>
            <if test="username != null and username !=''">
                username = #{username},
            </if>
            <if test="usersex != null and usersex != ''">
                usersex = #{usersex}
            </if>
        </set>
        where userid = #{userid}
    </update>

2、修改UsersMapper接口

void usersUpdate(Users users);

3、创建测试类

public class UpdateUsersTest {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        Users users = new Users();
        users.setUserid(1);
        users.setUsername("ky");
        users.setUsersex("man");
        usersMapper.usersUpdate(users);
        sqlSession.commit();

    }
}

在这里插入图片描述

七、 foreach 标签

foreach 标签的功能非常强大,我们可以将任何可迭代对象如 List、Set 、Map 或者数组对象作为集合参数传递给 foreach 标签进行遍历。它也允许我们指定开头与结尾的字符串以及集合项迭代之间的分隔符。
在这里插入图片描述

1.1、迭代List、Set

在这里插入图片描述

1.2、修改映射配置文件

<!--    查询用户ID为1或者2的用户-->
    <select id="selectUsersByIdUseCollection" resultType="users">
        select * from users where userid in
        <foreach collection="collection" item="userid" open="(" separator="," close=")">
            #{userid}
        </foreach>
    </select>

1.3、修改UsersMapper接口

List<Users> selectUsersByIdUseCollection(List<Integer> list);

1.4、创建测试类

public class SelectUsersByIdUseCollectionTest {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(4);
        List<Users> users = usersMapper.selectUsersByIdUseCollection(list);
        users.forEach(System.out::println);
    }
}

在这里插入图片描述

2.1、迭代数组

在这里插入图片描述

2.2、修改映射配置文件

    <!--    查询用户ID为1或者2的用户使用数组传递参数-->
    <select id="selectUsersByIdUseArray" resultType="users">
        select * from users where userid in
        <foreach collection="array" item="userid" open="(" separator="," close=")">
            #{userid}
        </foreach>
    </select>

2.3、修改UsersMapper接口

  List<Users> selectUsersByIdUseArray(int[] arr);

2.4、创建测试类

public class SelectUsersByIdUseArrayTest {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        int[] arr = new int[]{1,2,5};
        List<Users> users = usersMapper.selectUsersByIdUseArray(arr);
        users.forEach(System.out::println);
    }
}

在这里插入图片描述

3.1、迭代Map

在这里插入图片描述

3.2、修改映射配置文件

<!--    根据给定的条件做计数处理-->
    <select id="selectUsersCount" resultType="int">
        select count(*) from users where
        <foreach collection="suibian" separator="and" item="value" index="key">
             ${key} = #{value}
        </foreach>
    </select>

3.3、修改UsersMapper接口

int selectUsersCount(@Param("suibian") Map<String,String> map );

3.4、创建测试类

public class SelectUsersCountTest {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        Map<String,String> map = new HashMap<>();
        map.put("username","aaaaaa");
        map.put("usersex","male");
        int count = usersMapper.selectUsersCount(map);
        System.out.println(count);
    }
}

在这里插入图片描述

八、使用foreach标签完成批量添加

1、修改映射配置文件

<!--    批量添加用户-->
    <insert id="insertUsersBatch">
        insert into users values
        <foreach collection="collection" item="user" separator=",">
            (default ,#{user.username},#{user.usersex})
        </foreach>
    </insert>

2、修改UsersMapper接口

int insertUsersBatch(List<Users> list);

3、创建测试类

public class InsertUsersBatchTest {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        List<Users> list = new ArrayList<>();
        Users users = new Users();
        users.setUsername("k1");
        users.setUsersex("male");
        Users users1 = new Users();
        users1.setUsername("k2");
        users1.setUsersex("male");
        list.add(users);
        list.add(users1);
        usersMapper.insertUsersBatch(list);
        sqlSession.commit();

    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值