Mybatis入门之mapper映射(案例Demo)

动态sql相关

mybatis支持强大的动态生成sql功能,提供了一些标签实现动态sql拼接, 更加灵活。

mapper.xml的常用标签(参考:https://www.cnblogs.com/coder-lzh/p/8960928.html):

标签 描述
<mapper>
根标签,表示mapper需要映射的配置
<resultMap>
指定返回集合的属性,适合使用返回值是自定义实体类的情况
<constructor>
<resultMap>中的子标签,表示构造函数式声明

<idArg>

<constructor>的子标签,表示实体主键
<sql> 可以重用的 SQL 块,也可以被其他语句引用,与<include>标签结合使用,id必须唯一
<include> 表示引用一个<sql>语句体,refid属性指定<sql>标签的id
<insert>、<select>、<update>、<delete> 分别对应C(create)R(read)U(update)D(delete)

 

 

 

 

 

 

 

 

 

 

 

1.if标签的使用,此种方式需要使用注解传参(不使用注解的话test表达式里面参数应该用value表示)

   //1.动态sql之if
   Book queryOneByBookId(@Param("bookId")Integer bookId);
   <if test="null!=bookId and ''!=bookId">
      and id = #{bookId}
    </if>

2.trim标签的使用,包含去除前后缀的操作,可以与if结合使用

<insert id="insertSelective" parameterType="com.star.model.Book" >
    insert into t_book_vue
    <!--
    prefix:代表前缀(
    suffix:代表后缀)
    suffixOverrides:去除末尾的后缀,
    prefixOverrides:去除开头的前缀
     -->
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null" >
        id,
      </if>
      <if test="bookname != null" >
        bookname,
      </if>
      <if test="price != null" >
        price,
      </if>
      <if test="booktype != null" >
        booktype,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        #{id,jdbcType=INTEGER},
      </if>
      <if test="bookname != null" >
        #{bookname,jdbcType=VARCHAR},
      </if>
      <if test="price != null" >
        #{price,jdbcType=REAL},
      </if>
      <if test="booktype != null" >
        #{booktype,jdbcType=VARCHAR},
      </if>
    </trim>
</insert>

3.foreach标签的使用,可以循环遍历标签体的内容

  <!-- foreach用法 -->
  <select id="queryBookByForeach" resultType="com.star.model.Book">
    <include refid="base_query_list"/>
    and id in
    <!--
      conllection:代表要循环的参数
      item: 每一项的别名自定义
      open:开头前缀
      close: 结尾后缀
      separator:每项之间插入字符
    -->
    <foreach collection="list" item="id" open="(" close=")" separator=",">
      #{id}
    </foreach>
    <include refid="base_order"/>
  </select>

4.choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似

  <!--
    id:唯一
    parameterType:参数类型
    resultType:返回类型
   -->
  <select id="dynamicChooseTest" parameterType="com.star.model.Book" resultMap="BaseResultMap">
    <include refid="base_query_list"/>
    <!-- 满足表达式拼接标签体sql语句 -->
    <choose>
      <when test="bookname != null">
        and bookname like concat('%',#{bookname},'%')
      </when>
      <when test="booktype != null">
        and booktype = #{booktype}
      </when>
      <otherwise>
        and 2 = 2
      </otherwise>
    </choose>
    <include refid="base_order"/>
  </select>

5.where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or 条件)

  <!--
    id唯一
    where标签跟在表名的后面,与if标签结合使用
  -->
  <select id="dynamicWhereTest" parameterType="com.star.model.Book" resultMap="BaseResultMap">
    select * from t_book_vue
    <where>
      <if test="bookname != null">
        bookname = #{bookname}
      </if>
      <if test="booktype != null">
        and booktype = #{booktype}
      </if>
    </where>
  </select>

6.set主要是用在更新操作的时候,它的主要功能和where元素其实是差不多的,主要是在包含的语句前输出一个set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果set包含的内容为空的话则会出错。有了set元素我们就可以动态的更新那些修改了的字段

  <!--
    set标签与where标签大同小异
  -->
  <update id="dynamicSetTest" parameterType="com.star.model.Book">
    update t_book_vue
    <set>
      <if test="bookname != null">
        bookname = #{bookname},
      </if>
      <if test="booktype != null">
        booktype = #{booktype},
      </if>
    </set>
    where id = #{id}
  </update>

 

上一篇:SSM整合而成的简单书籍管理项目


下一篇:迭代器模式