目次
1. @ InsertProviderはデータのバッチ挿入を実現します
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() ;
}