如何在Java MyBatis 插入数据库返回主键?
第一种方式:
MYSQL数据库中没有设置字段自增长
<!-- 添加角色 -->
<insert id="addSysRole" useGeneratedKeys="true" keyProperty="id" parameterType="com.yang.daily.model.Us.SystemRole">
INSERT INTO system_role (ID,
role_code,
Role_Name,
Role_Status,
Create_By,
Create_At,
Operate_Ip)
VALUES (#{id,jdbcType=VARCHAR},
#{roleCode,jdbcType=VARCHAR},
#{roleName,jdbcType=VARCHAR},
#{roleStatus,jdbcType=INTEGER},
#{createBy,jdbcType=VARCHAR},
NOW(),
#{operateIp,jdbcType=VARCHAR})
</insert>
- useGeneratedKeys=“true” 表示给主键设置自增长
- keyProperty=“id” 表示将自增长后的Id赋值给实体类中的userId字段
- parameterType=“com.yang.daily.model.Us.SystemRole” 这个属性指向传递的参数实体类
- 实体类要有getter() 和 setter() 方法
第二种方式:
MYSQL数据库中设置字段自增长
<!-- 添加角色 -->
<insert id="addSysRole" >
<selectKey resultType="integer" order="AFTER" keyProperty="id">
select last_insert_id()
</selectKey>
INSERT INTO system_role (ID,
role_code,
Role_Name,
Role_Status,
Create_By,
Create_At,
Operate_Ip)
VALUES (#{id,jdbcType=VARCHAR},
#{roleCode,jdbcType=VARCHAR},
#{roleName,jdbcType=VARCHAR},
#{roleStatus,jdbcType=INTEGER},
#{createBy,jdbcType=VARCHAR},
NOW(),
#{operateIp,jdbcType=VARCHAR})
</insert>
- order=“AFTER” 表示先执行插入语句,之后再执行查询语句,可被设置为 BEFORE 或 AFTER
- 如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句
- 如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用
- keyProperty=“id” 表示将自增长后的id赋值给实体类中的id字段
- SELECT LAST_INSERT_ID() 表示MySQL语法中查询出刚刚插入的记录自增长Id