MyBatia详解-下

发布于:2025-03-08 ⋅ 阅读:(75) ⋅ 点赞:(0)

动态SQL

动态SQL是Mybatis的强大特性之一,能够完成不同条件下不同的sql拼接,以下的动态sql均使用XML的方式

举例使用的类

数据库信息

<if>标签

当我们在向数据库插入或者查询一些字段时,相同的sql语句在不同情况下可能会使用不同的字段信息,比如当我们再做一些网上的调查问卷时,会有必选项和非必选项此时就需要我们有选择的插入字段,就用到了<if>标签 

其实可以把<if>就看成是正常的if条件句,test后面跟着的就是判断语句,如果条件符合判断语句就进入<if>标签内部

接口

Integer insertByCondtion(Userinfo userinfo)

 XML实现

<insert id="insertByCondtion">
        insert into userinfo(
            <if test="username != null">
                username
            </if>
            <if test="password != null">
                ,password
            </if>
            <if test="age != null">
                ,age
            </if>
            <if test="gender != null">
                ,gender
            </if>
         )values (     
            <if test="username != null">
                #{username}
            </if>
            <if test="password != null">
                ,#{password}
            </if>
            <if test="age != null">
                ,#{age}
            </if>
            <if test="gender != null">
                ,#{gender}
            </if>)
    </insert>

测试用例

 运行结果

可以看到成功插入我们选择的字段

//注意<if test="username != null">中的username 是传入对象的属性

<trim>标签

刚刚的<if>的XML代码其实有一点bug,如果不插入username直接插入后面的字段的话,那么第一个字段前面会有一个逗号导致sql语句出错(不过这里username没有设定默认值),这时就可以用到<trim>

<trim>有几个属性:

  • prefix:表示整个语句块,以prefix的值作为前缀
  • suffix:表示整个语句块,以suffix的值作为后缀
  • prefixOverrides:表示整个语句块要去除掉的前缀
  • suffixOverrides:表示整个语句块要去除掉的后缀

 加上<trim>后的代码

 <insert id="insertByCondtion">
        insert into userinfo
        <trim prefix="(" suffix=")" prefixOverrides=",">
            <if test="username != null">
                username
            </if>
            <if test="password != null">
                ,password
            </if>
            <if test="age != null">
                ,age
            </if>
            <if test="gender != null">
                ,gender
            </if>
        </trim>
         values
        <trim prefix="(" suffix=")" prefixOverrides=",">
            <if test="username != null">
                #{username}
            </if>
            <if test="password != null">
                ,#{password}
            </if>
            <if test="age != null">
                ,#{age}
            </if>
            <if test="gender != null">
                ,#{gender}
            </if>
        </trim>

测试用例

运行结果

 

<where>标签

接口

List<Userinfo> selectByCondtion(Userinfo userinfo);

 XML代码

<select id="selectByCondtion" resultType="com.wx.demo.model.Userinfo">
        select * from userinfo
<!--        添加关键字where并去掉最前面的and-->
        <where>
            <if test="username != null">
                username = #{username}
            </if>
            <if test="password != null">
                and password = #{password}
            </if>
            <if test="age != null">
                and age = #{age}
            </if>
            <if test="deleteFlag != null">
                and delete_flag = #{deleteFlag}
            </if>
        </where>
    </select>

//这里<where>的作用就是 在标签内部有内容时添加关键字where并去掉最前面的and

测试

运行结果

<where>标签也可以使用<trim prefix="where" prefixOverrides="and">替换,但是当标签内部没有内容时,where关键字也会保留

<set>标签

接口

Integer updateByCondtion(Userinfo userinfo);

XML代码

<update id="updateByCondtion">
        update userinfo
<!--        生成set语句去掉最后面的","-->
        <set>
            <if test="username != null">
                username = #{username},
            </if>
            <if test="password != null">
                password = #{password},
            </if>
            <if test="age != null">
                age = #{age},
            </if>
            <if test="deleteFlag != null">
                delete_flag = #{deleteFlag}
            </if>
        </set>
        where id = #{id}
    </update>

 测试

运行结果

 <set>标签也可以使用<trim prefix="set" prefixOverrides=",">代替

<foreach>标签

<foreach>就和正常的foreach语句差不多,主要用于遍历主要有如下属性

  • collection:绑定方法参数中的集合(要从哪个集合里遍历)
  • item:每一遍遍历的对象
  • open:语句开头的字符串
  • close:语句结尾的字符串
  • separator:每次遍历之间间隔的字符串

接口方法:

Integer deleteMore(List<Integer> ids);

XML代码

//代码目的是删除ids集合里的所有id对应的行

<delete id="deleteMore">
        delete from userinfo
        where id in
        <foreach collection="ids" open="(" close=")" separator="," item="id">
            #{id}
        </foreach>
    </delete>

 测试

运行结果

<include>标签

我们的XML代码其实会有很多重复的部分,那么我们可不可以将这部分提出来封装一下呢?当然是可以的就利用<sql>和<include>标签。

我们可以使用<sql>标签将重复的代码片段提取出来进行封装,然后通过<include>标签在我们需要这个代码片段的地方进行引用(<include>通过属性refid属性来制定sql片段)

接口方法

List<Userinfo> selectUserAll();

XML代码

<sql id="selectAll">
        select * from userinfo
    </sql>
<select id="selectUserAll" resultType="com.wx.demo.model.Userinfo">
<!--        resultType表示返回的类型-->
        <include refid="selectAll"></include>
    </select>

测试结果


网站公告

今日签到

点亮在社区的每一天
去签到