MyBatis动态SQL

1、动态SQL简介

●动态SQL是MyBatis强大的特性之一,极大的简化我们SQL拼装的操作

●动态SQL元素和使用JSTL或其它类似基于XML的标签类似

●MyBatis采用功能强大的基于OGNL的表达式来简化操作

●OGNL对象图导航语言,这是一种强大的表达式语言,通过它可以非常方便的操作对象属性。类似于我们的EL表达式。
   ○访问对象属性 ${对象名.属性名}
   ○调用方法 ${对象名.方法名}
   ○运算符:算术运算符、逻辑运算符(and or not )、比较运算符

●动态SQL就是通过一系列的标签来完成判断,进行SQL语句的组装

2、where和if标签

需求:根据用户名、id、state等多个条件查询用户信息

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
            <!--路径要写Mapper接口的路径-->
<mapper namespace="com.bdit.dao.IUserMapper">

    <!--模糊查询like  #后面的名字任意-->
    <select id="find" resultType="User" parameterType="String">
        select * from user where id=#{id} or name like #{name}
    </select>
    
</mapper>
@Test
    public void find() {
        IUserMapper userMapper = sqlSession.getMapper(IUserMapper.class);
        User user = new User();
        user.setId(9);
        user.setUsername("%an%");
        List<User> list = userMapper.findUser(user);
        for (User user1:list) {
            System.out.println(user1);
        }
    }

加入以上查询条件,我们不传递id,而且条件由or换成and,就会查不到任何数据。实际情况下的组合查询,都会进行非空判断,然后进行查询条件的组装。在MyBatis框架中,提供类where标签和if标签来实现动态SQL语句。

●where标签:处理SQL语句,自动添加where关键字,并去掉紧跟在它后面的一个and或者or
●if标签:test属性,判断表达式真假

<select id="find" resultType="user">
        select * from user
    <where>
        <if test="id!=null">
            or id=#{id}
        </if>
        <if test="name!='' and name!=null">
            or name like #{name}
        </if>
    </where>
  </select>

3、SQL标签

将SQL语句通用的部分进行抽取,其它SQL语句通过标签引入也可以使用。

<select id="find" resultType="user">
        select <include refid="user_common"/> from user
    <where>
        <if test="id!=null">
            or id=#{id}
        </if>
        <if test="name!='' and name!=null">
            or name like #{name}
        </if>
    </where>
  </select>

<!--封装sql里面的数据名,便于查询-->
    <sql id="user_common">
        id,name,keyword,description
    </sql>

4、foreach标签传入集合

删除多条数据的SQL语句,delete from user where id in(1,2,4,5,6)

foreach标签遍历集合拼接SQL语
   ●collection 属性:遍历传入的集合,当参数是集合时,collection属性值固定为list
   ●open属性:遍历拼接前
   ●close属性:遍历拼接后
   ●separator属性:拼接的符号
   ●item属性:遍历到的元素

<select id="findList" resultType="user" parameterType="list">
        select <include refid="user_common"></include> from user
        <foreach collection="list" open="where id in(" close=")" separator="," item="item">
            #{item}
        </foreach>
</select>
@Test
    public void findList(){
        IUserMapper iUserMapper=sqlSession.getMapper(IUserMapper.class);
        List<Integer> list=new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        List<User> list2=iUserMapper.findList(list);
        for(User l:list2){
            System.out.println(l);
        }
    }

5、foreach标签传入数组

foreach标签遍历集合拼接SQL语句
   ●collection 属性:遍历传入的数组,当参数是数组时,collection属性值固定为array
   ●open属性:遍历拼接前
   ●close属性:遍历拼接后
   ●separator属性:拼接的符号
   ●item属性:遍历到的元素

<select id="findArray" resultType="user" parameterType="int[]">
        select <include refid="user_common"></include> from user
        <foreach collection="array" open="where id in(" close=")" separator="," item="item">
            #{item}
        </foreach>
</select>
@Test
    public void findArray(){
        IUserMapper iUserMapper=sqlSession.getMapper(IUserMapper.class);
        int[] id={1,2,3};
        List<User> list=iUserMapper.findArray(id);
        for(User l:list){
            System.out.println(l);
        }
    }

6、foreach标签传入POJO对象

foreach标签遍历集合拼接SQL语句
   ●collection 属性:遍历传入的pojo对象中的集合,collection属性值为pojo中的集合属性名
   ●open属性:遍历拼接前
   ●close属性:遍历拼接后
   ●separator属性:拼接的符号
   ●item属性:遍历到的元素

<select id="findQuary" resultType="user" parameterType="quary">
        select <include refid="user_common"></include> from user
        <foreach collection="list" open="where id in(" close=")" separator="," item="item">
            #{item}
        </foreach>
</select>
//批量查询->POJO全局变量是集合
    @Test
    public void findQuary(){
        IUserMapper iUserMapper=sqlSession.getMapper(IUserMapper.class);
        Quary quary=new Quary();
        List<Integer> list=new ArrayList<>();
        list.add(1);
        list.add(25);
        list.add(20);
        quary.setList(list);
        List<User> list2=iUserMapper.findQuary(quary);
        for(User l:list2){
            System.out.println(l);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值