MyBatis動的SQL(注釈付きバージョン)

目次

 

1つ、スクリプト

 

2つ目は、OGNLの表現です。

1.if 

2.選択します

3.どこで

4.セット

5.バインド

 6.foreach

3つ目は、JavaBeanのコンストラクターについてです。

4つの動的SQLの例

5、メソッドにSQLを記述します

1. @ InsertProviderはデータのバッチ挿入を実現します

2、@ SelectProvider in List

6、Mybatisの公式文書


1つ、スクリプト

アノテーションバージョンでは、動的SQLを使用するには、スクリプトタグにsqlステートメントを含める必要があります。

<script> </ script>で特殊記号を使用する場合は、二重引用符 ""などのJavaエスケープ文字を使用してください。代わりに&quot;&quot;を使用するか、\ "\"を使用してください。 

<script></script>

 

2つ目は、OGNLの表現です。

1.if 

SQLステートメントの動的スプライシングを判断することにより、一般的にクエリ条件を決定するために使用されます

<if test=''>...</if>

2.選択します

条件に応じてお選びください

<choose>
    <when test=''> ...
    </when>
    <when test=''> ...
    </when>
    <otherwise> ...
    </otherwise> 
</choose>

3.どこで

通常、ifまたはchooseと組み合わせて使用​​すると、これらのタグは冗長なキーワードまたは記号を削除する場合があります。where 要素は、子要素がコンテンツを返す場合にのみ「WHERE」句を挿入します。さらに、句の先頭が「AND」または「OR」の場合、where 要素もそれらを削除します。といった

<where>
    <if test="id != null "> 
        and t_id = #{id}
    </if>
</where>

4.セット

動的更新ステートメントの同様のソリューションは、setと呼ば ます。set 要素を使用すると、更新する必要のある列を動的に含めることができ、更新されていない他の列は無視されます。set 要素は、行の先頭にSETキーワードを動的に挿入し、余分なコンマを削除します。といった:

<update id="updateAuthorIfNecessary">
  update Author
    <set>
      <if test="username != null">username=#{username},</if>
      <if test="password != null">password=#{password},</if>
      <if test="email != null">email=#{email},</if>
      <if test="bio != null">bio=#{bio}</if>
    </set>
  where id=#{id}
</update>

5.バインド

クエリステートメントに適用できる値をバインドします

<bind name="" value="" />

 6.foreach

ループ。着信と収集をトラバースできます。一般に、バッチ更新とクエリステートメントに使用されます

<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
    #{item}
</foreach>

(1)item:コレクションの要素。#{item.Filed}を使用して要素のFiledにアクセスします。

(2)インデックス:添え字、0から数える

(3)コレクション:受信コレクションパラメータ

(4)オープン:何から始めるか

(5)セパレーター:セパレーターとして使用するもの

(6)閉じる:で終わるもの

たとえば、受信リストはList <String>:["a"、 "b"、 "c"]であり、上記のforeachの結果は:( "a"、 "b"、 "c")です。

 

3つ目は、JavaBeanのコンストラクターについてです。

(1)Beanには、パラメーターを持つコンストラクターが1つだけあります。MyBatisはコンストラクターを呼び出します(パラメーターは順番に並んでいます)。現時点では、@ resultsアノテーションは無効です。また、クエリ結果の数がコンストラクターと矛盾する場合は、例外が報告されます。
(2)Beanには複数のコンストラクターがあり、パラメーターのないコンストラクターはありません。MyBatisは、同じ数のクエリフィールドでコンストラクターを呼び出します。同じ数のコンストラクターがない場合は、例外が報告されます。
(3)Beanには複数の構築メソッドがあり、パラメーターなしのコンストラクターがあります。MyBatisはパラメーターなしのコンストラクターを呼び出します。
(4)要約すると、通常の状況では、Beanはパラメーターを使用してコンストラクターを定義しません。必要に応じて、パラメーターを使用せずにコンストラクターを定義してください。

 

4つの動的SQLの例

/**
     * if 对内容进行判断
     * concat函数:mysql拼接字符串的函数
     */
    @Select("<script>"
            + "select t_id, t_name, t_age                          "
            + "from sys_user                                       "
            + "<where>                                             "
            + "  <if test='id != null and id != ""'>     "
            + "    and t_id = #{id}                                "
            + "  </if>                                             "
            + "  <if test='name != null and name != ""'> "
            + "    and t_name like CONCAT('%', #{name}, '%')       "
            + "  </if>                                             "
            + "</where>                                            "
            + "</script>                                           ")
    @Results(id="userResults", value={
        @Result(property="id",   column="t_id"),
        @Result(property="name", column="t_name"),
        @Result(property="age",  column="t_age"),
    })
    List<User> selectUserWithIf(User user);
    
    /**
     * choose when otherwise 类似Java的Switch,选择某一项
     * when...when...otherwise... == if... if...else... 
     */
    @Select("<script>"
            + "select t_id, t_name, t_age                                     "
            + "from sys_user                                                  "
            + "<where>                                                        "
            + "  <choose>                                                     "
            + "      <when test='id != null and id != ""'>          "
            + "            and t_id = #{id}                                   "
            + "      </when>                                                  "
            + "      <otherwise test='name != null and name != ""'> "
            + "            and t_name like CONCAT('%', #{name}, '%')          "
            + "      </otherwise>                                             "
            + "  </choose>                                                    "
            + "</where>                                                       "
            + "</script>                                                      ")
    @ResultMap("userResults")
    List<User> selectUserWithChoose(User user);
    
    /**
     * set 动态更新语句,类似<where>
     */
    @Update("<script>                                           "
            + "update sys_user                                  "
            + "<set>                                            "
            + "  <if test='name != null'> t_name=#{name}, </if> "
            + "  <if test='age != null'> t_age=#{age},    </if> "
            + "</set>                                           "
            + "where t_id = #{id}                               "
            + "</script>                                        ")
    int updateUserWithSet(User user);
    
    /**
     * foreach 遍历一个集合,常用于批量更新和条件语句中的 IN
     * foreach 批量更新
     */
    @Insert("<script>                                  "
            + "insert into sys_user                    "
            + "(t_id, t_name, t_age)                   "
            + "values                                  "
            + "<foreach collection='list' item='item'  "
            + " index='index' separator=','>           "
            + "(#{item.id}, #{item.name}, #{item.age}) "
            + "</foreach>                              "
            + "</script>                               ")
    int insertUserListWithForeach(List<User> list);
    
    /**
     * foreach 条件语句中的 IN
     */
    @Select("<script>"
            + "select t_id, t_name, t_age                             "
            + "from sys_user                                          "
            + "where t_name in                                        "
            + "  <foreach collection='list' item='item' index='index' "
            + "    open='(' separator=',' close=')' >                 "
            + "    #{item}                                            "
            + "  </foreach>                                           "
            + "</script>                                              ")
    @ResultMap("userResults")
    List<User> selectUserByINName(List<String> list);
    
    /**
     * bind 创建一个变量,绑定到上下文中
     */
    @Select("<script>                                              "
            + "<bind name=\"lname\" value=\"'%' + name + '%'\"  /> "
            + "select t_id, t_name, t_age                          "
            + "from sys_user                                       "
            + "where t_name like #{lname}                          "
            + "</script>                                           ")
    @ResultMap("userResults")
    List<User> selectUserWithBind(@Param("name") String name);

 

5、メソッドにSQLを記述します

@InsertProvider 
@UpdateProvider 
@DeleteProvider 
@SelectProvider

 

1. @ InsertProviderはデータのバッチ挿入を実現します

MySqlバッチ挿入データベースステートメントの形式:

INSERT INTO 

[表名]([列名],[列名]) 

 VALUES

([列值],[列值])),

([列值],[列值])),

([列值],[列值]));

例えば:

INSERT INTO 

items(name,city,price,number,picture) 

VALUES

('耐克运动鞋','广州',500,1000,'003.jpg'),

('耐克运动鞋2','广州2',500,1000,'002.jpg');

エンティティクラス:

public class WetSortVillage {
    
    private Integer id;
    
    private Integer areaId;
    
    private String areaName;
    
    private Integer streetId;
    
    private String village;
    
    private String street;
    
    private Integer villageId;
    
    private Integer households;//户数
    
    private Integer kegStationNum;//桶站数
    
    private Integer workerNum;//分类员数量
    
    private Integer status;//有效状态 1:开启 2关闭   默认添加就是开启
}

マッパー:

public interface WetSortVillageMapper {

@InsertProvider(type=SQLProvider.class,method="insertSortVillagesByParam")
    public int insertSortVillagesByParam(List<WetSortVillage> list);
}

SQLProvider.java:

  public String insertSortVillagesByParam(Map map){
        StringBuilder sb = new StringBuilder();
        List<WetSortVillage> list = (List<WetSortVillage>) map.get("list");
        sb.append("INSERT INTO t_wet_sort_village ");
        sb.append("(area_id,street_id,village_id,households,");
        sb.append("keg_station_num,worker_num,status)");
        sb.append(" VALUES ");
        int length = list.size();
        MessageFormat mf = new MessageFormat("(#'{'list[{0}].areaId},#'{'list[{0}].streetId},#'{'list[{0}].villageId},#'{'list[{0}].households}"
                + ",#'{'list[{0}].kegStationNum},#'{'list[{0}].workerNum},#'{'list[{0}].status})");
        for(int i=0;i<length;i++){
             sb.append(mf.format(new Object[]{i}));  
             sb.append(StringUtils.join(valueArray, ","));
        }
    
        return sb.toString();
 }

2、@ SelectProvider in List

@Select({"<script>", +

"select ", +

"mysection ", +

"from test_my_table ", +

"where myNo in ", +

"<foreach collection='userDefParamName' item='yourselfItem' open='(' separator=',' close=')'>", +

"#{yourselfItem}", +

"</foreach>"

})

String getMysection (@Param("userDefParamName")List whateverName);

<foreach>メソッドを使用してエラーを報告します。バージョンが低いと言われています。3.5.1より上のバージョンを使用している場合は、自分で確認できます。

以下に、このバージョンのソリューションについて説明します。

public String getMysection (@Param("userDefParamName")List whateverName){

    StringBuffer sql =new StringBuffer();

    sql.append("select mysection  from test_my_table ");

    sql.append(" where myNo IN ");

    if(userDefParamName.size()>0) {

    sql.append("(");

    for (int i =0; i < userDefParamName.size(); i++) {

    if(i>0){

        sql.append(",");

    }

    sql.append("#{userDefParamName[");

    sql.append(i);

    sql.append("]}");

    }

    sql.append(")");

    }

    return sql.toString() ;
}

 

6、Mybatisの公式文書


https://mybatis.org/mybatis-3/zh/index.html

おすすめ

転載: blog.csdn.net/xiao__jia__jia/article/details/110975745