MyBatis中mysql 插入数据并返回自增主键和非自增主键的方式
MyBatis的insert操作,如何在插入数据的同时返回主键呢?分为两种情况,一种情况是该主键是自增主键,另一种情况是该主键非自增,接下来对两种情况详细解释。
mysql支持自增主键,而Oracle不支持自增主键,在JDBC中可以使用getGeneratedKeys()
方法获得自增主键。
获取自增主键的值
- CompetitionMapper.java中的接口
int createCompetition(Competition competition);
- CompetitionMapper.xml中的xml写法
<insert id="createCompetition" useGeneratedKeys="true" parameterType="com.ebusiness.reviewer.model.Competition" keyProperty="id">
insert into
competition
(id,c_name,start_time,end_time,create_time)
values
(default ,#{cname},#{startTime},#{endTime},NOW()})
</insert>
以上使用useGeneratedKeys="true"
表示使用自增主键获取策略,keyProperty
指定对应的主键属性,也就是MyBatis获取到主键以后,将这个值封装给javaBean的哪个属性。
- CompetitionService.java中调用CompetitionMapper.java中createCompetition方法以及接收自增主键的写法。
//competitionMapper是注入到容器中的CompetitionMapper对象,competition是传入的对象
competitionMapper.createCompetition(competition);
//id 就是自增主键
int id = competition.getId();
获取非自增主键的方法
<insert id="createCompetition" parameterType="com.ebusiness.reviewer.model.Competition">
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
SELECT uuid()
</selectKey>
insert into
competition
(id,c_name,start_time,end_time,create_time)
values
(#{id},#{cname},#{startTime},#{endTime},NOW())
</insert>
keyProperty:将查询出的主键设置到parameterType中的哪个属性上
order:相对于sql语句的执行顺序,BEFORE代表是在插入之前查询主键
resultType:指定返回值类型
-
selectKey标签中查询非自增主键的值,然后赋值给insert中要插入的主键的值。
-
数据库debug模式打印日志
-
调用完方法接收非递增主键
-
控制台打印日志