Mybatis一括書込み有則修正無則新規、同時に空選択書込みフィールドを判断
単行データに対して有則修正無則新規作成
このケースのテーブル作成文は次のとおりです.
したがって、プライマリ・キーは文字列タイプであり、自己増加タイプではありません.
一括書込みデータがある場合は修正なしで新規作成し、同時に空選択書込みフィールドを判断する
データテーブルは上のままで、
上記のコードでは
くぼみ
上記の
このケースのテーブル作成文は次のとおりです.
-- auto-generated definition
create table contact_type
(
sid varchar(50) not null
primary key,
name varchar(50) default '' null,
status int default 1 null comment ' , 1 ,0 ',
seq float default 0 null,
create_time datetime default CURRENT_TIMESTAMP null
)
comment ' ';
したがって、プライマリ・キーは文字列タイプであり、自己増加タイプではありません.
Mybatis
のxml
ファイルに書かれているSQL文は次のとおりです.<insert id="saveOne" parameterType="com.ccsoft.femis.model.ContactType">
insert into contact_type
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="create_time != null"> create_time, if>
<if test="name != null"> name, if>
<if test="seq != null"> seq, if>
<if test="sid != null"> sid, if>
<if test="status != null"> status, if>
trim>
values
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="create_time != null"> #{create_time},if>
<if test="name != null"> #{name},if>
<if test="seq != null"> #{seq},if>
<if test="sid != null"> #{sid},if>
<if test="status != null"> #{status},if>
trim>
ON DUPLICATE KEY UPDATE
<trim suffixOverrides=",">
<if test="create_time != null"> create_time = #{create_time}, if>
<if test="name != null"> name = #{name}, if>
<if test="seq != null"> seq = #{seq}, if>
<if test="sid != null"> sid = #{sid}, if>
<if test="status != null"> status = #{status}, if>
trim>
insert>
が使用されているため、Java
端から渡されたオブジェクトの一部の属性が設定されていないため、オブジェクト内の属性が空である場合、最終的に実行されるSQL
文にはこのフィールドは存在しないことがわかります.テストテーブルで作成されたプライマリ・キー・フィールドは自己増加ではないため、上記のxml
のヘッダSQL
文(新規行のプライマリ・キー・フィールド値を返す)をコメントに削除し、自己増加フィールドを示す削除コメントがあれば、新規行の自己増加フィールド値を得ることができます.java
でテストしたところ、上の文が1行追加された後に1を返し、修正に成功した後に2を返すことが分かった(ここで疑問があるが、原因が明らかになったらフォローして科学普及の下).設定されていない属性がデータベース側の対応するフィールドに適切に設定されていない場合、デフォルト値がなく、新規または変更に失敗した場合、例外java.sql.SQLException
が報告されます.一括書込みデータがある場合は修正なしで新規作成し、同時に空選択書込みフィールドを判断する
データテーブルは上のままで、
Mybatis
と書かれたXML
のファイルに直接貼られているSQL
は、<insert id="saveBatch" parameterType="java.util.List">
insert into contact_type
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="ele.create_time != null"> create_time, if>
<if test="ele.name != null"> name, if>
<if test="ele.seq != null"> seq, if>
<if test="ele.sid != null"> sid, if>
<if test="ele.status != null"> status, if>
trim>
values
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="ele.create_time != null"> #{ele.create_time},if>
<if test="ele.name != null"> #{ele.name},if>
<if test="ele.seq != null"> #{ele.seq},if>
<if test="ele.sid != null"> #{ele.sid},if>
<if test="ele.status != null"> #{ele.status},if>
trim>
ON DUPLICATE KEY UPDATE
<trim suffixOverrides=",">
<if test="ele.create_time != null"> create_time = #{ele.create_time}, if>
<if test="ele.name != null"> name = #{ele.name}, if>
<if test="ele.seq != null"> seq = #{ele.seq}, if>
<if test="ele.sid != null"> sid = #{ele.sid}, if>
<if test="ele.status != null"> status = #{ele.status}, if>
trim>
foreach>
insert>
上記のコードでは
SQL
文の最外層にfor
ループが使用されており、List
型の集合を転送してデータを書き込む際に新たに変更されたものもあれば、例えば3行のデータもあり、第1の3行はプライマリ・キーフィールド対応属性sid
がNULL
に設定されているため、データベースに新たに行が追加され、第2行のデータはsid
に設定され、この値はデータベースに対応行があり、すると、データベース内のローのデータが変更されます.ただし、Java
に返されるデータは常に1であり、各オブジェクト構成のSQL
文間で使用される間隔記号が;
であるため、最終的に返される影響の行数は最後のSQL
文の影響の行数である.これについて他の見解があれば、科学普及にフォローしてください.くぼみ
上記の
SQL
はデータベース側で複数の文であるため、Java
接続データベースの文字列に&allowMultiQueries=true
を設定する必要がある