Mybatis映射文件(动态sql)

本文详细介绍了Mybatis中如何使用<if>标签进行条件动态查询,以及<foreach>标签处理集合遍历,通过实例演示了如何根据实体类参数动态构造SQL。同时,展示了如何利用<include>提取并重用SQL片段,提升代码复用效率。
摘要由CSDN通过智能技术生成

一、概述

Mybatis 的映射文件中,前面我们的 SQL 都是比较简单的,有些时候业务逻辑复杂时,我们的 SQL是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了。

二、<if>

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

<mapper namespace="xyz.nchu200462.mapper.UserMapper">
    <select id="findByCondition" parameterType="user" resultType="user">
        select * from user
        <where>
            <if test="id!=0">
                and id=#{id}
            </if>
            <if test="username!=null">
                and username=#{username}
            </if>
        </where>
    </select>
</mapper>

测试

@Test
public void testUserIf() throws IOException {
    User user = new User();
    user.setId(2);
    user.setUsername("capkin");
    user.setPassword("123456");
    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    UserMapper sqlSessionMapper = sqlSession.getMapper(UserMapper.class);
    List<User> byCondition = sqlSessionMapper.findByCondition(user);
    for (User user1 : byCondition) {
        System.out.println(user1.toString());
    }
}

执行结果

若if成立则将if里面的放入sql语句,若不成立则不放入

三、<foreach>

<select id="findByIds" parameterType="list" resultType="user">
    select * from user
    <where>
        <foreach collection="list" open="id in(" close=")" item="id" separator=",">
            #{id}
        </foreach>
    </where>
</select>

测试

@Test
public void testForEach() throws IOException {
    List list = new LinkedList();
    for (int i = 0; i < 12; i++) {
        list.add(i);
    }
    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    List byIds = userMapper.findByIds(list);
    for (Object byId : byIds) {
        System.out.println(byId);
    }
}

标签含义详解

foreach标签的属性含义如下:
<foreach>标签用于遍历集合,它的属性:

  • collection:代表要遍历的集合元素,注意编写时不要写#{}
  • open:代表语句的开始部分
  • close:代表结束部分
  • item:代表遍历集合的每个元素,生成的变量名
  • sperator:代表分隔符

四、Sql片段抽取

Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的

<sql id="selectUser">select * from user</sql>
//通过<sql></sql>标签实现,通过id标出
<select id="findByIds" parameterType="list" resultType="user">
    //通过<include></include>引入
    <include refid="selectUser"></include>
    <where>
        <foreach collection="list" open="id in(" close=")" item="id" separator=",">
            #{id}
        </foreach>
    </where>
</select>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

capkin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值