2017-02-22 13 views
1

とMySQLでのINSERT文で、私はMySQLでのテーブルを持っている:私は次のようにCURRENT_TIMESTAMPにデフォルトのフィールド値を取得する方法、MyBatisの

以下のようにMyBatisのマッパーを持って

CREATE TABLE `mytable` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT, 
    `phone` VARCHAR(128) NULL DEFAULT NULL, 
    `createTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB 
AUTO_INCREMENT=25 
; 

@Mapper 
public interface MyMapper { 
    Integer insertRecord(List<PhoneModel> list); 
} 


<insert id="insertRecord" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> 
    insert into mytable(phone) values 
    <foreach item="item" index="index" collection="list" separator=","> 
     (#{item.phone}) 
    </foreach> 
</insert> 

PhoneModelにはid,phone,の3つのプロパティがあります。今度はinsertRecordを呼び出してidを得ることができますが、createTimeも取得したいと思います。

私はMybatisのdocumentsを使いました。複数のプロパティ名(createTimeなど)をkeyPropertykeyColumnに追加することができます。

keyProperty(挿入および更新のみ)getGeneratedKeys、またはinsert文のselectKey子要素から返されるキー値をMyBatisが設定するプロパティを指定します。デフォルト:unset。複数の生成された列が予想される場合は、のコンマで区切られたプロパティー名のリストを指定できます。

keyColumn(挿入および更新のみ)生成されたキーを使用して、テーブル内の列の名前を設定します。これは、特定のデータベース(PostgreSQLなど)では、キー列がテーブルの最初の列でない場合にのみ必要です。可能な複数の生成された列がある場合、カンマで区切られた列のリストの名前はとなります。

私は明確ではないカンマ区切りのプロパティ/列名のリストを意味します。私はkeyProperty = "id、createTime"を試しましたが、動作していないようです。

ありがとうございました。

答えて

1

keyProperty="id, createTime"がコードのコピーである場合は、コンマの後のスペースをクリアします。とにかく(唯一の)犯人ではないかもしれません。

auto_incrementは内部的にはシーケンスのように動作すると思います。一方、CURRENT_TIMESTAMPは関数です。 次に、複数のkeyPropertyサポート動作を確認することができます。テスト目的のために、別の列(auto_increment、serial?)を追加して、生成されたキーを確認できるようにすることができます。

インサートからの値はPostgreSQL allows RETURNINGと思われますが、MySQLではこれと同等のものは見つかりませんでした。

CURRENT_TIMESTAMPがどのように動作するのか、1つの複数行の挿入文を実行しますか?すべてのレコードに正確に同じタイムスタンプが挿入されていますか?または値は進化するか?これは、1秒以上かかるレコードの多数を挿入するときに観察することができます。

自分でタイムスタンプを挿入しないのはなぜですか?複数行の挿入の代わりに一括挿入するだけで、Javaのリストを反復すると、セッションはExecutorTYPE.REUSEを使用して文を1回だけ準備する必要があります。

for(PhoneModel model : list) { 
    model.setCreateTime(new Date()); 
    mapper.insertRecord(model); 
} 
関連する問題