ITPub博客

首页 > 应用开发 > IT综合 > 好程序员分享MyBatis之动态SQL语句

好程序员分享MyBatis之动态SQL语句

原创 IT综合 作者:好程序员 时间:2020-07-20 14:05:24 0 删除 编辑

  好程序员分享MyBatis 之动态 SQL 语句,我们在进行项目开发时,经常遇到需要根据不同的需求,对原有 SQL 语句的内容进行修改,原来这是一个比较头疼的问题,因为需要对原有 SQL 语句进行拼接、重组,费时费力还容易出错,今天我们将学习 MyBatis 的动态 SQL 功能,可以解决这个问题。

  动态SQL 语句简介

  动态SQL 语句是 MyBatis 的一个非常强大的功能,允许我们根据不同的需求,组合出不同的 SQL 语句,在 select update insert delete 标签中都可以添加动态 SQL 语句。

  IF 标签

  IF 标签可以在条件成立时,在 SQL 语句中插入 IF 标签中的内容,不成立就不插入

  示例:

  <select id="selectUserByUser" parameterType="User" resultMap="userMap">

  select * from tb_user where

  <if test="realname != null">

  u_realname=#{realname}

  </if>

  <if test="gender != null">

  and u_gender=#{gender}

  </if>

  </select>

  上面代码中是按照User 对象的各个属性进行查询,如果姓名不为空就插入姓名作为条件,如果性别不为空就插入性别作为条件。

  但是我们会发现如果姓名为空,性别不为空,SQL 语句就会变成: select * from tb_user where and u_gender=#{gender}

  或者姓名、性别都为空就会变成:select * from tb_user where

  这样都会出现语法错误,这样我们就需要下一个标签:where

  Where 标签

  Where 标签 用于配置 where 条件,会去掉多余的 and or ,如果一个条件都不成立,会自动去掉 sql 中的 where

  代码改为:

  <select id="selectUserByUser" parameterType="User" resultMap="userMap">

  select * from tb_user

  <where>

  <if test="realname != null">

  u_realname=#{realname}

  </if>

  <if test="gender != null">

  and u_gender=#{gender}

  </if>

  <if test="age != null">

  and u_age=#{age}

  </if>

  </where>

  </select>

  这样就不会出现上面可能的错误了

  Trim 标签

  上面where 标签的功能,也可以使用 trim 标签实现, trim 能去掉多余的前缀和后缀。

  语法:

  <trim prefix=" 前缀 SQL" suffix=" 后缀 " prefixOverrides=" 删除前面的符号 " suffixOverrides=" 删除后面的符号 ">

  <if 标签 >

  </trim>

  示例:

  <trim prefix="where" prefixOverrides="and|or">

  ...

  </trim>

  Set 标签

  用于配置update 语句中的 set 部分,可以自动添加 set 关键字,删除多余的逗号

  示例:

  <update id="update" parameterType="User">

  update tb_user

  <set>

  <if test="name != null">

  u_name=#{name},

  </if>

  <if test="password != null">

  u_password=#{password},

  </if>

  </set>

  where u_id=#{id}

  </update>

  也可以使用trim 实现:

  <trim prefix="set" suffixOverrides=",">

  <if test="name != null">

  u_name=#{name},

  </if>

  ...

  </trim>

  Foreach 标签

  用于循环遍历集合或数组的值,如:按多个人姓名查询

  select * from tb_user where u_realname in (' 张三 ',' 李四 '....)

  语法:

  <foreach collection=" 集合名 " item=" 变量名 " index=" 下标名 " open=" 开始符号 " close=" 结束符号 " seperator=" 分割符号 ">

  #{ 变量名 }

  </foreach>

  注意:集合名在Mapper 接口中需要使用 @Param 注解配置

  示例:

  <select id="selectUserByRealnames" resultMap="userMap">

  select * from tb_user where u_realname in

  <foreach collection="realnames" item="name" index="i" separator="," open="(" close=")">

  #{name}

  </foreach>

  </select>

  Choose 标签

  Java 中有 if ,也会有 if-else switch 语句来判断多个条件, MyBatis 也有 Choose 标签可以进行多条件判断

  示例:

  <select id="findActiveBlogLike"

  resultType="Blog">

  SELECT * FROM BLOG WHERE state = ACTIVE

  <choose>

  <when test="title != null">

  AND title like #{title}

  </when>

  <when test="author != null">

  AND author_name like #{author}

  </when>

  <otherwise>

  AND featured = 1

  </otherwise>

  </choose>

  </select>

  这里从第一个when 进行判断,如果成立就插入条件,结束 choose 标签,如果不成立再判断下一个 when ,如果所有 when 都不成立,就插入 otherwise 中的语句。

  总结

    动态SQL 语句是 MyBatis 非常重要的特性,能够让我们根据不同需求组合 SQL 语句,而且不容易出错。动态 SQL 的标签有: if where set choose foreach 等。掌握好它们我们可以写出更加灵活、高效的数据库操作代码。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69913864/viewspace-2705601/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-03-20

  • 博文量
    342
  • 访问量
    150005