mybatisダイナミックSQL、各ラベル使用まとめ


mybatisダイナミックSQLタグ:if where chose others wise trim set foreach
1.ifタグ:
条件判定ラベルは、パラメータの値を判断して、あるクエリー条件を使うかどうかを決定します.基本的な使い方は以下の通りです.
  <select id="testWhere" resultMap="BaseResultMap" parameterType="map">
    select *from employee where  1=1
      --  age    22
    <if test='age =="22"'>
       and age = #{age}
    </if>
       --name         null
    <if test="name != null and name != ''">
       and name like %${name}%
    </if>
</select>
ここでwhereの後の1=1は、両方の条件がtrueでない場合、sql文が合法的ではなくエラーになる問題を解決するために、下のwhereタグで解決できます.
2.whereタグ
  • sqlにはwhere
  • は書かれていません.
  • whereタグは、条件文の最初のandまたはor
  • をフィルタすることができます.
      <select id="testWhere" resultMap="BaseResultMap" parameterType="map">
        select *from employee
        <where> --   ,where          where
        <if test="age != null and age != ''">
            age = #{age}
        if>
        <if test="name != null and name != ''">
            --  age   false,where       and,       
           and name like %${name}%
        if>
        where>
    select>
    
    3.chose、otherswizeラベル
    ある時、私達はすべての条件を適用したくなくて、ただ複数のオプションの中から一つを選びたいです.ifタグは条件が本当ならsql綴りを実行します.この時にchoseラベルを使う必要があります.choseとjavaのswitch機能は似ています.
    <select id="chooseTest" parameterType="map" resultType="map">
            select * from employee  
            <where>
            <choose>
                <when test="name != null">
                    and name = #{name}
                when>
                <when test="age != null">
                    and age = #{age}
                when>
                <otherwise>
                    and address = #{address}
                otherwise>
            choose>
            where>
        select>
    
    mybatisは順番に各choseの中の条件を判断します.whenのある条件が満たされた時、choseから飛び出します.つまり最初の条件を満たすwhenだけを選んで、choseの中の条件が全部満たされないなら、otherswiseの文を実行します.
    まとめ:chose others wise javaのswitchに似ている…in case…default
    4.trimタグ:
    trimタグはsql文のプレフィックスとサフィックスを制御するために使用されます.その具体的な属性は以下の通りです.
    属性
    説明
    prefix
    sql文スティッチングのプレフィックスを指定します.
    subfix
    sql文綴りのサフィックスを指定します.
    prefixOverrides
    sql文の前で削除するキーワードや文字を指定します.ANDカンマ括弧などです.
    スffixOverrides
    sql文の後に削除するキーワードまたは文字を指定します.
    使用方法の例:
    trimタグを使って余分なandまたはorを取り除きます.
    <select id="testWhere" resultMap="BaseResultMap" parameterType="map">
    --  trim   sql       where,           and or
    select *from employee
    <trim prefix="WHERE" prefixOverrides="AND | OR"> 
    	<if test="age != null">
    	  age = #{age}
    	if> 
    	<if test="name != null">
    	  AND name like #{name}
    	if>
    	<if test="address != null ">
    	  or address like #{address}
    	if>
    trim>
    select>
    
    trimを使って余分なコンマを取り除く:
      --  mybatis-generator           sql,      
      <insert id="insertSelective"  parameterType="com.wg.demo.po.Department">
        insert into department
        --        (,    ),           
        <trim prefix="(" suffix=")" suffixOverrides=",">
          <if test="id != null">
            id,
          if>
          <if test="deptName != null">
            dept_name,
          if>
          <if test="descr != null">
            descr,
          if>
          <if test="createTime != null">
            create_time,  --        
          if>
        trim>
        --        (,    ),           
        <trim prefix="values (" suffix=")" suffixOverrides=",">
          <if test="id != null">
            #{id,jdbcType=BIGINT},
          if>
          <if test="deptName != null">
            #{deptName,jdbcType=VARCHAR},
          if>
          <if test="descr != null">
            #{descr,jdbcType=VARCHAR},
          if>
          <if test="createTime != null">
            #{createTime,jdbcType=TIMESTAMP}, --        
          if>
        trim>
      insert>
    
    5.セットラベル
    ダイナミックudate文でset要素を使って列を動的に更新できます.
    udate文でifタグを使うと、前のif条件がfalseの場合、余分なカンマのエラーが発生します.この時setでこの問題を解決できます.
      --  mybatis-generator           sql
      <update id="updateByPrimaryKeySelective" parameterType="com.wg.demo.po.Employee">
        update employee
        <set>
          <if test="name != null">
            name = #{name,jdbcType=VARCHAR},
          if>
          <if test="age != null">
            age = #{age,jdbcType=VARCHAR},
          if>
          <if test="gender != null">
            gender = #{gender,jdbcType=SMALLINT},
          if>
          <if test="deptId != null">
            dept_id = #{deptId,jdbcType=BIGINT},
          if>
          <if test="address != null">
            address = #{address,jdbcType=VARCHAR},
          if>
          <if test="createTime != null">
            create_time = #{createTime,jdbcType=TIMESTAMP}, --           
          if>
        set>
        where id = #{id,jdbcType=BIGINT}
      update>
    
    6.foreachタグ
    動的sqlの1つの一般的な操作は、集合を巡回する必要があります.通常はIN条件文にあります.
    <select id="selectPostIn" resultType="domain.blog.Post">
      SELECT * FROM employee 
      WHERE id in
      <foreach item="item" index="index" collection="list"
          open="(" separator="," close=")">
            #{item}
      foreach>
    select>
    --list    {1,2,3,4}
    --sql      : select * from employee where id in (1,2,3,4)		
    
    foreachタグの属性は以下の通りです.
    属性
    説明
    コレクション
    反復セットの名前を表します.基本的にはリスト、set、array、mapであり、このパラメータは必須パラメータです.
    アイテム
    今回の反復で得られた要素は、例えば、collectionがlist、set、arrayであればitemがその中の要素であり、mapであれば、itemはkey-valueのalueであり、必ずパラメータを記入します.
    open
    この文は何で始まりますか?一番よく見られるのは左括弧()、オプションのパラメータです.
    close
    この文は何で終わりますか?一番よく見られるのは右括弧「)」で、オプションのパラメータです.
    separator
    セパレータ、mybatisは反復後にitemにセパレータを追加します.一般的にコンマ、オプションのパラメータです.
    index
    list set配列において、indexは現在の反復要素の下付きを表し、mapにおいてindexはkey-valueにおけるkeyを表し、オプションのパラメータ
    一組のmapの例では、
    --