Mybatis一括書込み有則修正無則新規、同時に空選択書込みフィールドを判断

26876 ワード

単行データに対して有則修正無則新規作成
このケースのテーブル作成文は次のとおりです.
-- 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 '      ';

したがって、プライマリ・キーは文字列タイプであり、自己増加タイプではありません.Mybatisxmlファイルに書かれている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行はプライマリ・キーフィールド対応属性sidNULLに設定されているため、データベースに新たに行が追加され、第2行のデータはsidに設定され、この値はデータベースに対応行があり、すると、データベース内のローのデータが変更されます.ただし、Javaに返されるデータは常に1であり、各オブジェクト構成のSQL文間で使用される間隔記号が;であるため、最終的に返される影響の行数は最後のSQL文の影響の行数である.これについて他の見解があれば、科学普及にフォローしてください.
くぼみ
上記のSQLはデータベース側で複数の文であるため、Java接続データベースの文字列に&allowMultiQueries=trueを設定する必要がある