2012-08-24 63 views
6

私はmybatisに初心者です。私は最後に挿入されたレコードのIDを取得しようとしています。私のデータベースは、MySQLで、私のマッパーXMLはmybatisに最後に挿入されたレコードのIDを取得します

<insert id="insertSelective" parameterType="com.mycom.myproject.db.mybatis.model.FileAttachment" > 
    <selectKey resultType="java.lang.Long" keyProperty="id" order="AFTER" > 
    SELECT LAST_INSERT_ID() as id 
</selectKey> 
insert into fileAttachment 
<trim prefix="(" suffix=")" suffixOverrides="," > 
    <if test="name != null" > 
    name, 
    </if> 
    <if test="attachmentFileSize != null" > 
    size, 
    </if>  
</trim> 
<trim prefix="values (" suffix=")" suffixOverrides="," > 
    <if test="name != null" > 
    #{name,jdbcType=VARCHAR}, 
    </if> 
<if test="attachmentFileSize != null" > 
    #{attachmentFileSize,jdbcType=INTEGER}, 
    </if> 
</trim> 
</insert> 

私はここに書かれた文を考えている「idとLAST_INSERT_ID()はSELECT」最後に挿入されたレコードのIDを返す必要がありますが、私は、レコードを挿入した後、必ず1を取得しています。私は

int型のID = fileAttachmentMapper.insertSelective(fileAttachment)を使用しています私のDAOクラスで

マイmapper.javaクラス、私が持っている方法

int insertSelective(FileAttachment record); 

新しいレコードが挿入されたとき、常にIdの値が1になります。私のIDフィールドは自動インクリメントされ、レコードは正しく挿入されます。

答えて

13

idはオブジェクト内に注入されます。

+0

thats great jddsantaella ...このスレッドセーフなのですか? – user965884

+0

私は知らないが、私はmyBatisを信頼しているので、私ははいと言うだろう。 – jddsantaella

+0

良い..ありがとうJddsantaella – user965884

1

返されている1は、更新/挿入されたレコードの数を表します。 idは、insertSelectiveの呼び出しに渡したfileAttachmentパラメータに設定されていると思います。何selectKey

int num_of_record_inserted = fileAttachmentMapper.insertSelective(fileAttachment); 

int id = fileAttachment.getId(); 

は、そのプロパティidfileAttachmentで、この場合には、あなたが挿入されているオブジェクトのidを設定することで、レコードが挿入された後:

+0

レスポンスエドのおかげで、どうしたらそのIDを取得できますか? – user965884

6

あなただけMyBatisの中に挿入タグ内に選択クエリを実行する必要はありません

<insert id="insert" parameterType="com.mycom.myproject.db.mybatis.model.FileAttachment" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> 

を使用する必要があります。挿入operation.HereがuseGeneratedKeysに= "true" を、keyPropertyは= "ID" 場合、KeyColumnは= "ID" を定義することが)fileAttachment.getId(

FileAttachment fileAttachment=fileAttachmentMapper.insertSelective(fileAttachment); 
    Integer id=fileAttachment.getId(); 

。あなたは次のようにidの値をretriveことができ、あなたに新しいパラメータを提供します挿入タグkeyColumn = "id"が定義されているため、FileAttachmentのfileAttachment参照内にすべての戻り値が取得されるためです。

0

私はライターであれば、あなたはカスタム合成ライターを持っていて、そこにIDを挿入することができます。

0

(1)insert文で、useGeneratedKeys = true、parameterType = "object"、keyProperty = "objectId"およびkeyColumn = "objectId"属性を同じプライマリキーで設定する必要がありますオブジェクト・レコードを格納する表の列名(objectId)。主キー列(objectId)は、データベース表のAUTO_INCREMENTに設定する必要があります。

(2)挿入ステートメントがトリガーされると、新しい生成された主キー(objectId)がオブジェクトに格納され、このメソッド(object.getObjectId()またはobject.objectId )。これで、正確かつ新しく生成されたプライマリが得られるはずです。それは私のために働いた....

3

実際には、MyBatisはすでにこの機能を提供しています。 "useGeneratedKeys"オプションを使用して最後の挿入IDを取得できます。

MyBatisからの説明です(詳細は、MyBatisの公式ページを参照してください)。

useGeneratedKeys(挿入と更新のみ)これは、データベース(MySQLやSQL ServerなどのRDBMSで、例えば自動インクリメントフィールド)によって内部生成されたキーを取得するために、JDBC getGeneratedKeysメソッドを使用するようにMyBatisのを伝えます。デフォルト:falseは

は、XMLを使用している場合:あなたは、アノテーションを使用している場合

<insert id="" parameterType="" useGeneratedKeys="true"> 

を:あなたは、挿入操作を終了すると

@Insert("your sql goes here") 
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") 
int insert(FileAttachment fileAttachment) throws Exception; 

を、fileAttachmentのSETID()メソッドは次のようになります呼び出され、最後に挿入されたレコードのIDに設定されます。 fileAttachmentのgetId()を使用して、最後の挿入IDを取得できます。

これがお役に立てば幸いです。

関連する問題