MyBatisinsert语句返回主键和selectKey标签⽅式
⽬录
insert语句返回主键和selectKey标签
1.主键⾃增的情况
2.Oracle中⽤Sequence获取主键
MyBatis insert语句key的⽣成和返回
1.使⽤数据库⾃带的⽣成器
2.使⽤selectKey
insert语句返回主键和selectKey标签
往数据库中插⼊⼀条记录后,有时候我们需要这条记录的主键,⽤于后续的操作。
如果在插⼊后再去查⼀次数据库,显然不够优雅和效率,MyBatis中已经有了insert后返回主键的功能,下⾯就主要讲⼏种不同情况的具体做法。
1.主键⾃增的情况
对于MySQL和Sql Server这种⽀持主键⾃增的数据库,可以设置useGeneratedKeys="true"和keyProperty。例如现在有⼀个表tbl_employee,表有id,name,age,create_time四个字段,MyBatis映射⽂件中可以写成如下:
<insert id="insertRecord" parameterType="ity.Employee"
useGeneratedKeys="true"  keyProperty="id">
INSERT INTO tbl_employee(name, age, create_time)
VALUES(#{name}, #{age}, #{createTime})
</insert>
useGeneratedKeys="true":使⽤⾃动⽣成的主键
keyProperty:指定主键是(javaBean的)哪个属性。
useGeneratedKeys:
(insert and update only) This tells MyBatis to use the JDBC getGeneratedKeys method to retrieve keys generated internally by the database (e.g.auto increment fields in RDBMS like MySQL or SQL Server). Default: false
keyProperty:
(insert and update only) Identifies a property into which MyBatis will set the key value returned by
getGeneratedKeys , or by a selectKey child element of the insert statement. Default: unset .
Can be a comma separated list of property names if multiple generated columns are expected.
2.Oracle中⽤Sequence获取主键
insert语句字段顺序
对于Oracle数据库,当要⽤到⾃增字段时,需要⽤到Sequence,假设我们现在已经创建了⼀个名字为SEQ_ADMIN的Sequence,在MyBatis中的映射⽂件中可以结合selectKey标签使⽤。
<insert id="insert"  parameterType="ity.Employee">
<selectKey keyProperty="id" resultType="long" order="BEFORE">
SELECT SEQ_ADMIN.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO tbl_employee(id, name, age, create_time)
VALUES(#{id}, #{name}, #{age}, #{createTime})
</insert>
order="BEFORE"表⽰SELECT SEQ_ADMIN.NEXTVAL FROM DUAL在 INSERT 语句执⾏之前先对id进⾏赋值。相反
的,order还可以设置成AFTER,表⽰在INSERT语句执⾏完后,再查询⼀次slectKey标签中的语句,并赋值到Javabean的keyProperty的那个属性上。
源码分析
从源码上来分析,在BaseStatementHandler⾥⾯有⽣成generateKeys,主要是执⾏:
protected void generateKeys(Object parameter) {
KeyGenerator keyGenerator = KeyGenerator();
ErrorContext.instance().store();
keyGenerator.processBefore(executor, mappedStatement, null, parameter);
ErrorContext.instance().recall();
}
processBefore,表⽰执⾏前处理,对应mapper⾥⾯的selectKey中的order="BEFORE"属性,先执⾏查询key,并设置到参数对象中。
在各个声明处理器中,update有代码:
KeyGenerator keyGenerator = KeyGenerator();
keyGenerator.processAfter(executor, mappedStatement, ps, parameterObject);
processAfter,表⽰执⾏后处理,对应mapper⾥⾯的selectKey中的order="AFTER"属性,表⽰执⾏后,再查⼀遍key,设置到参数对象中。
MyBatis insert语句key的⽣成和返回
1.使⽤数据库⾃带的⽣成器
<insert id="insertOne" keyProperty="userId"  useGeneratedKeys="true" >
insert into user (user_name) values(#{userName})
</insert>
mybatis会获取数据库⾃动⽣成的列,并把值赋值给传⼊参数的userId属性。
2.使⽤selectKey
<insert id="insertOne"    >
insert into user (user_name) values(#{userName})
<selectKey order="AFTER"  keyProperty="userId">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
插⼊语句执⾏后selectKey语句,并把返回值塞进传⼊参数的userId属性。
<insert id="insertOne"    >
insert into user (user_name) values(#{userName})
<selectKey order="BEFORE"  keyProperty="userId">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
先执⾏selectKey,并把返回值赋值给传⼊参数的userId属性,然后执⾏insert语句。
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。