MyBatis知识点复习-08动态SQL

MyBatis知识点复习-08动态SQL

上一篇:MyBatis知识点复习-07resultType与resultMap讲解

下一篇:MyBatis知识点复习-09多表操作讲解
本节为大家讲解动态SQL,所谓动态SQL就是可以动态变化SQL语句。

一.where和if标签的联合使用

这一小节不为大家编写Test方法的内容,大家理解后自行使用验证,我已经运行通过了
在UserMapper接口中添加下面函数:

public List<User> findByUser(User user);

现在假设我们要求该函数实现这样的功能:

如果传入的参数user的username不叫李成且不为空就按照user的属性返回
否则返回所有

实现方式为在mapper/UserMapper.xml文件里面添加如下内容:

    <select id="findByUser" parameterType="user" resultType="user">
        select * from user
        <where>
            <if test="username !=null and username!='李成'">
                name = #{username}
            </if>
        </where>
    </select>

下面我们来解析一下上面的内容:
<where>标签相当于在 select * from user语句后面加上了where语句,但是如果最后if判断后<where>标签里面没有了sql语句会自动的把where去掉,同时<where>标签还拥有灵活去掉and语句的功能(上面这个例子没有体现),将下来是<if>标签里面的test属性值,这里的username应该是参数user的属性名,如果没有这个属性会报错(如果传递的参数的有成员对象A,可以用A.A的属性名来获取A的属性值,上面的例子也没有体现这一点)。
最后需要说明的是如果要判断参数user是否为空貌似mybatis无法实现(反正我不知道,不知道是否可以实现),同时<select>不可以在使用<where>与<if>后而导致其标签体内容为空,这样会报错前面的<insert>、<delete>、<update>也同理
注意点:在使用<if>标签时要注意判断:如果是对象要看是不是null,如果是字符串要判断是不是null和‘’

二.SQL片断

利用SQL片断我们可以把上一小节的内容等效改为下面这样:

 <!--声明SQL片断-->
 <sql id="select_by_user">
     name = #{username}
 </sql>
 <select id="findByUser" parameterType="user" resultType="user">
     select * from user
     <where>
         <if test="username !=null and username!='李成'">
         	 <!--引入SQL片断-->
             <include refid="select_by_user"></include>
         </if>
     </where>
 </select>

具体语法看上面的就懂了,我就不细讲了

三.foreach遍历

在UserMapper接口里面添加如下函数:

public List<User> findByIds(UserQueryVO vo);

在UserQueryVO类添加下面属性:

List<Integer> ids;

记得生成他的getter与setter方法
在mapper/UserMapper.xml文件中添加如下内容:

<select id="findByIds" parameterType="vo" resultType="user">
    <!--性别和名字 SELECT * FROM user WHERE id in (10,16,24) -->
    SELECT * FROM user
    <where>
        <if test="ids != null and ids.size > 0">
            <!--
            collection:集合,写集合属性
            item:遍历接收变量
            open:遍历开始
            close:遍历结束
            separator:拼接格式
            for(Integer id : ids){
            }
            -->
            <foreach collection="ids" item="id" open="id in(" close=")" separator=",">
                ${id}
            </foreach>
        </if>
    </where>
</select>

上面注释已经介绍了含义这里就不解释了。
Test方法内容:

	UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    UserQueryVO vo = new UserQueryVO();
    List<Integer> list = new ArrayList<Integer>(){
        {
            add(10);
            add(16);
            add(24);
        }
    };
    vo.setIds(list);
    List<User> byIds = mapper.findByIds(vo);
    System.out.println(byIds);
    sqlSession.commit();//提交事务,否则会事务回滚

结果:
在这里插入图片描述
上一篇:MyBatis知识点复习-07resultType与resultMap讲解
下一篇:MyBatis知识点复习-09多表操作讲解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值