码迷,mamicode.com
首页 > 数据库 > 详细

mybatis教程4(动态SQL)

时间:2019-01-23 12:27:52      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:ace   一个   code   shadow   ade   sql   描述   process   oss   

动态SQL语句

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQL 语言得以改进这种情形。
动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。

if语句

动态 SQL 通常要做的事情是根据条件包含 where 子句的一部分。比如:

<select id="queryUser" resultMap="baseMap"
     resultType="com.sxt.bean.User" parameterType="user"> 
    select id ,name ,age  from t_user 
    where 1 =1 
    <if test="username!=null">
         and name = #{username}
    </if>  
</select> 
// 接口
public List<User> queryUser(User user);

测试
技术分享图片技术分享图片

choose, when, otherwise

有时我们不想应用到所有的条件语句,而只想从中择其一项。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句

<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 != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>

where语句

在使用if语句做动态条件处理的时候如果所有条件都不满足,那么得到的SQL语句如下:

select * from t_user where 

在这种情况下,我们一般会加一个1=1来匹配语法规则

    <select id="queryUser" resultMap="baseMap"
         resultType="com.sxt.bean.User" parameterType="user"> 
        select id ,name ,age  from t_user 
        where 1 =1  
        <if test="username!=null">
             and name = #{username}
        </if>  
    </select> 

此时可以使用标签来处理这种情况

    <select id="queryUser" resultMap="baseMap"
         resultType="com.sxt.bean.User" parameterType="user"> 
        select id ,name ,age  from t_user 
        <where>
            <if test="username!=null">
                 and name = #{username}
            </if>  
        </where>
    </select> 

技术分享图片技术分享图片技术分享图片

set语句

set主要也是用来解决更新问题的。

<update id="updateBookById">
    update t_book
    <set>
            <if test="author!=null"> author=#{author},</if>
            <if test="name!=null"> b_name=#{name},</if>
            <if test="price!=null"> price=#{price},</if>
    </set>
    where id=#{id};
</update>

trim

trim标记是一个格式化的标记,可以完成set或者是where标记的功能

属性 说明
prefix 前缀
prefixOverrides 去掉第一个指定内容
suffix 后缀
suffixoverride 去掉最后一个指定内容

替代<where>的用法

    <select id="queryUser" resultMap="baseMap" resultType="com.sxt.bean.User"
        parameterType="user">
        select id ,name ,age from t_user
        <!-- <where>
            <if test="username!=null">
                and name = #{username}
            </if>
        </where> -->
        <trim prefix="where" prefixOverrides="AND |OR ">
            <if test="username!=null">
                 and name = #{username}
            </if>
            <if test="age != 0">
                and age = #{age}
            </if>
        </trim>
    </select>

替代<set>的用法

<update id="updateUser" parameterType="User">
    update t_user
    <trim prefix="set" suffixOverrides=",">
        <if test="username!=null">
            name = #{username},
        </if>
        <if test="age != 0">
            age = #{age}
        </if>
    </trim>
    where id=#{id}
</update>

或者

<update id="updateUser" parameterType="User">
    update t_user
    set 
    <trim  suffixOverrides=",">
        <if test="username!=null">
            name = #{username},
        </if>
        <if test="age != 0">
            age = #{age}
        </if>
    </trim>
    where id=#{id}
</update>

技术分享图片

foreach语句

foreach用来遍历,遍历的对象可以是数组,也可以是集合。
属性|说明
-----|:------
collection|collection属性的值有三个分别是list、array、map三种
open|前缀
close|后缀
separator|分隔符,表示迭代时每个元素之间以什么分隔
item|表示在迭代过程中每一个元素的别名
index|用一个变量名表示当前循环的索引位置
==接口中方法==

public interface UserMapper {
    // 如果不指定@Param 默认是array
    public List<User> queryUserByIds(@Param("ids")List<Integer> ids);

    public int insertUser(@Param("users")List<User> users);
}
<select id="queryUserByIds" resultType="user">
    select * from t_user where id in 
    <foreach collection="ids" open="(" close=")" separator="," item="id" >
        #{id}
    </foreach>
</select>

<insert id="insertUser">
    insert into t_user(name,age)values
    <foreach collection="users" item="user" separator=",">
        (#{user.name},#{user.age})
    </foreach>
</insert>

技术分享图片技术分享图片

bind

bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。

<select id="getUserById" resultMap="baseMap" resultType="com.sxt.bean.User">
    <!-- 声明了一个参数aaa 在后面就可以使用了 -->
    <bind name="aaa" value="12"/>
    select
    id ,name ,age from t_user where id=${aaa}
</select>

技术分享图片

sql块

sql片段一般用来定义sql中的列
技术分享图片

mybatis教程4(动态SQL)

标签:ace   一个   code   shadow   ade   sql   描述   process   oss   

原文地址:https://www.cnblogs.com/dengpengbo/p/10308149.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!