mybatis中动态sql的使用

mybatis之动态sql

1.1. foeach标签

例:

原始的sql语句: select * from emp IN (1001,1003,1006,1009)

分析:
此时括号中的查询条件为多个数值,此时我们应该想到用list集合去装载该多个数值,list中的数值我们通常都要用遍历的方式获取其中的值。此时我们就需要在xml(当前的映射文件)中使用到foeach标签。

foeach标签所包含的属性:

  • collection: 是一个固定的,表示遍历的开始
  • item: 为所需要遍历的对象起一个别名
  • open: sql开始拼接的字符串(拼接完毕后就开启循环)
  • separator: 设置每个循环对象之间的分隔符
  • close: 最后循环完毕之后拼接的字符串

xml文件中的实现:

    <!-- 原始的sql语句: select * from emp IN (需要遍历list集合获取的数值)    -->
    <select id="findEmployerByIds" parameterType="java.util.List" resultType="emp">

        select * from emp where id

        <foreach collection="list" item="eid" open=" IN (" separator="," close=")">

            #{eid}

        </foreach>
    </select>

1.2. where标签和if标签

首先分析它们的应用场景(模糊查询):

我们经常在使用淘宝之类的软件时会使用它们的筛选功能,他们有多种可以筛选的条件,这个时候客户只要按自己的需求填入自己需要筛选的字段即可。

我们知道日常开发中后端的数据都是由前台传递过来的,当用户输入筛选的字段或者字段的个数不同时,我们就需要进行sql语句的动态的改变,如果我们对每一种情况都写出不同的查询的sql语句或者每次都要对传入的字段进行判断,这样会大大增加我们的代码量以及其复杂度。此时我们有什么解决的办法呢,这个时候where和if标签的出场将大大的解决我们的问题。

where标签和if标签一般搭配使用

1.2.1. where标签的使用

我们在使用where条件查询的时候,可以直接敲出标签,然后将要查询的字段写在该标签之内即可,如果where标签中的各种查询条件都不满足一定的约束,where在之后的sql语句运行时会自动消失(可在后面的if标签中看到详细的应用)

1.2.2. if标签的使用

在平常的开发中,我们知道if就是做判断用的,此处也不例外

if标签中的属性:

test: 在该属性中写判断的条件,如果判断为false,if标签中的该语句就不会在where后进行条件的拼接

    <if test="xxx != null ">
    
        xxxxxxx
    
    </if>

1.2.3. where和if的配合使用

    
    select * from product
    <where>
    
    <if test="price != null ">
    
       price=#{price}
    
    </if>

    <if test="pname != null ">
    
       and pname=#{pname}
    
    </if>
    
    </where>

    

很多人在执行这里时会有疑问,如果where后面拼接的第一个满足的条件的语句中带有and 岂不是就变成 where and xxxx 了,这样就不会符合sql语句的语法规范了,会报错。这点完全不用东西,标签的设计者想到了这个,如果where后第一个拼接的语句带有and,它会自动消掉and,这样就完全不用担心会出问题了。

1.3. sql片段的抽取

应用场景的分析:

  1. 如果我们在xml中的多个增删改查的标签中用到了同一条sql语句,考虑到代码复用性的原则,我们完全可以将改句sql语句抽取出来。
  2. 如果我们某一天要对多处用到的相同的sql语句进行某个地方的修改,如果有一万条相同的,我们就需要去改一万遍。如果我们对该条sql语句进行sql片段的抽取即可,然后在每一个用到相同的sql语句的增删改查的标签中通过引用该片段就行了。之后只需要修改该一个片段就可以达到修改多个地方的效果了。

例:假如select * from user 为一条在多个标签中复用性极高的sql语句

此时我们对该条语句就行sql片段的抽取,此时我们要用到sql标签

    <!-- id为类似于为该sql语句片段设置唯一的标识-->
    <sql id="selectUser" > select * from user </sql>

对该sql片段的引用要用到include标签(是不是感觉很熟悉,jsp的动态资源加载)

示例:


  <select id="findEmployerByIds"  resultType="user">
    
    <!-- 此处的refid属性代表要引用的 某sql片段的id值-->
    <include refid="selectUser"></include>

    </select>
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值