[mybatis]动态SQL与SQL片段

本文介绍了MyBatis中的动态SQL功能,包括如何使用`where`、`if`和`foreach`标签实现条件拼接,以及如何通过SQL片段进行代码复用。动态SQL使得在Mapper.xml文件中能灵活控制SQL语句的变化,适应不同的查询需求。同时,文章展示了SQL片段的定义和应用,简化了多个查询语句中相同部分的维护。

动态SQL:用来拼接SQL语句,可以将SQL语句中的WHERE等控制语句用动态SQL写入Mapper.xml文件配置中,当条件成立则拼接SQL语句,拼接where等控制语句,可以灵活控制SQL语句的变化,应对不同查询需求

动态SQL控制中写入了下面几个标签:

  1. where,用来拼接where语句
  2. if,用来拼接where里的and语句
  3. foreach,用来遍历集合,拼接SQL

动态SQL:与的应用

    <!-- 动态sql查找用户列表 -->
    <select id="findUserByDynamicSQL" parameterType="user" resultType="user">
        SELECT * FROM USER
        <!-- where,如果if成立拼接where语句 -->
        <where>
                <!-- 如果User传进来了id属性,那么拼接sql -->
                <if test="id!=null and id!=''">
                    <!-- where会自动去掉条件中的第一个and -->
                    and id=#{id}
                </if>
                <!-- 如果User传进来了username属性,那么拼接sql -->
                <if test="username!=null and username!=''">
                    <!-- where会自动去掉条件中的第一个and -->
                    and username=#{username}
                </if>
        </where>
    </select>

动态SQL:与的应用:

因为是根据集合遍历,所以在传入的参数User中必须要定义一个集合属性

public class User {
    //用来存储用户id的集合
    private List<Integer> ids;
}

Mapper.xml文件

    <!-- 根据传入的id集合遍历 -->
    <select id="findUserByIds" parameterType="user" resultType="user">
        SELECT * FROM USER
        <where>
            <!-- 
                使用foreach遍历User中的ids集合 : 
                collection : User类中的集合属性名
                item       : 每次遍历生成的值的名字
                open       : 开始遍历时要拼接的串
                close      : 结束遍历时要拼接的串
                separator  : SQL语句两个值中间要拼接的串
            -->
            <!-- 拼接 and id in(1,2,3,4) -->
            <foreach collection="ids" item="item_id" open="and id in(" close=")" separator=",">
                <!-- #{item_id}中的参数名与item="item_id"一致 -->
                #{item_id}
            </foreach>
        </where>
    </select>

SQL片段:
用来抽取定义的动态sql,以方便多个statement调用同一个where条件

SQL片段应用(Mapper.xml中)

定义SQL片段

    <!-- 
        定义sql片段 : 用来抽取定义的动态sql
                      以方便多个statement调用同一个where条件
        id : sql片段的唯一标识

        技巧 : 
            1 : 是基于单表来定义,这样可重用性高
            2 : 在sql片段中不要包含<where>
    -->
    <sql id="query_user_where">
        <!-- 如果User传进来了id属性,那么拼接sql -->
        <if test="id!=null and id!=''">
            <!-- where会自动去掉条件中的第一个and -->
            and id=#{id}
        </if>
        <!-- 如果User传进来了username属性,那么拼接sql -->
        <if test="username!=null and username!=''">
            <!-- where会自动去掉条件中的第一个and -->
            and username=#{username}
        </if>
    </sql>

引用SQL片段

    <!-- 动态sql查找用户列表 -->
    <select id="findUserByDynamicSQL" parameterType="user" resultType="user">
        SELECT * FROM USER
        <where>
            <!-- 
                应用sql片段的id : 
                refid : 指定sql片段的id
                如果refid指定的id不在本mapper.xml文件中,
                需要前面加namespace命名空间
            -->
            <include refid="query_user_where"></include>
            <!-- 还可以继续引用其他sql片段 -->
            <!-- <include refid="..."></include> -->
        </where> 
    </select>

Mapper接口:

    //动态sql查找用户
    public List<User> findUserByDynamicSQL (User user);

    //根据id集合查询用户
    public List<User> findUserByIds (User user);

Test测试:

    //动态sql查找用户
    @Test
    public void testFindUserByDynamicSQL(){
        //创建session
        SqlSession session = sessionFactory.openSession();
        //通过session获取mapper代理
        UserMapper mapper = session.getMapper(UserMapper.class);

        /*
         * 给sql查询设置查询条件 : 
         * 1 : id和username可以二选一
         * 2 : id和username也可以全部都设置上
         * 3 : 如果都不设置,方法参数传null即可
         *       查询结果为当前表的所有记录
         */



        //调用代理接口中的方法,查询所有用户列表
        List<User> userss = mapper.findUserByDynamicSQL(null);      
        //输出所有用户
        System.out.println(userss);



        //根据条件查询用户列表
        User user = new User();
        //设置要查询的id
        user.setId(12);
        //设置要查询的姓名
        user.setUsername("admin");
        //动态拼接sql,根据id或username查询用户列表
        List<User> users = mapper.findUserByDynamicSQL(user);   
        //输出用户列表
        System.out.println(users);
    }


    //动态sql查找用户
    @Test
    public void findUserByIds (){
        //创建session
        SqlSession session = sessionFactory.openSession();
        //通过session获取mapper代理
        UserMapper mapper = session.getMapper(UserMapper.class);
        //设置要查询的id集合
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        //把id添加进入User中
        User user = new User();
        user.setIds(list);
        //查询指定id的用户列表
        List<User> users = mapper.findUserByIds(user);
        System.out.println(users);
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值