mybatis 插入单条数据时 返回主键
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">SELECT LAST_INSERT_ID() AS id</selectKey>
但是这样配置时批量插入会发现无法在添加后获取主键id
错误示例:
<insert id="insertbatch" parameterType="java.util.List">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID() AS id
</selectKey> insert into document (clone_id, doc_type, data_id,
data_type, online_type, comp_id,
create_account_id, doc_url, invalid_date,
doc_name, document_url, alias_name,
andit_info, create_time, update_time,
status, issue_date, cert_no,
create_by, illustrate, report_number,
archive_flag, review_flag, is_upload,
handle_file, handle_file_size, src_file_size,
pdf_pages, responsible, doc_attribution,
delete_flag)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.cloneId,jdbcType=INTEGER}, #{item.docType,jdbcType=VARCHAR}, #{item.dataId,jdbcType=INTEGER},
#{item.dataType,jdbcType=INTEGER}, #{item.onlineType,jdbcType=INTEGER}, #{item.compId,jdbcType=INTEGER},
#{item.createAccountId,jdbcType=INTEGER}, #{item.docUrl,jdbcType=VARCHAR}, #{item.invalidDate,jdbcType=TIMESTAMP},
#{item.docName,jdbcType=VARCHAR}, #{item.documentUrl,jdbcType=VARCHAR}, #{item.aliasName,jdbcType=VARCHAR},
#{item.anditInfo,jdbcType=VARCHAR}, #{item.createTime,jdbcType=TIMESTAMP}, #{item.updateTime,jdbcType=TIMESTAMP},
#{item.status,jdbcType=INTEGER}, #{item.issueDate,jdbcType=VARCHAR}, #{item.certNo,jdbcType=VARCHAR},
#{item.createBy,jdbcType=VARCHAR}, #{item.illustrate,jdbcType=VARCHAR}, #{item.reportNumber,jdbcType=VARCHAR},
#{item.archiveFlag,jdbcType=INTEGER}, #{item.reviewFlag,jdbcType=INTEGER}, #{item.isUpload,jdbcType=INTEGER},
#{item.handleFile,jdbcType=VARCHAR}, #{item.handleFileSize,jdbcType=VARCHAR}, #{item.srcFileSize,jdbcType=VARCHAR},
#{item.pdfPages,jdbcType=VARCHAR}, #{item.responsible,jdbcType=VARCHAR}, #{item.docAttribution,jdbcType=VARCHAR},
#{item.deleteFlag,jdbcType=INTEGER})
</foreach>
</insert>
正确的是将 单个插入返回主键的 <selectKey></selectKey> 去掉,在insert标签内添加useGeneratedKeys="true" keyProperty="id"
设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。MySQL和SQLServer执行auto-generated key field,
因此当数据库设置好自增长主键后,可通过JDBC的getGeneratedKeys方法获取。但像Oralce等不支持auto-generated key field的数据库就不能用这种方法获取主键了
keyProperty:
返回主键ID到Javabean的属性名称
注意:我在这里做的批量插入,传入的是一个List集合,所以<foreach>的collection属性要写list,插入完成后会直接把主键ID放入你的Javabean中。最重要的是这种写法只能是
Mybatis版本3.3.1以上,不然会报错。数据库要mysql(其他数据库没试过)