Mybatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同。基本上经常会遇到的就是Oracle Sequece和Mysql自增主键。
1、不返回自增主键值
如果考虑到插入数据的主键不作为其他表插入数据的外键使用,那么可以考虑使用这种方式
对于MySQL
由于mysql数据库中,可以设置表的主键为自增,所以对于Mysql数据库在mybatis配置插入语句时,不指定插入ID字段即可。主键的自增交由Mysql来管理。
<sql id='TABLE_NAME'>TEST_USER</sql>
<!-- 注意这里的插入SQL中是没有指明ID字段的! -->
<insert id="insert" parameterType="User">
insert into <include refid="TABLE_NAME" /> (NAME,AGE)
values (#{name}, #{age} )
</insert>
注意:不能在完成插入操作后将插入时的主键值存放到保存的对象中
对于Oracle
Oracle数据库中没有自增主键,只能用序列号来进行操作
<sql id='TABLE_NAME'>TEST_USER</sql>
<sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_ID.nextval</sql>
<!-- 注意这里直接调用sequence的nextval函数 -->
<insert id="insert" parameterType="User">
insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
values ( <include refid="TABLE_SEQUENCE" /> ,#{name}, #{age} )
</insert>
注意:不能在完成插入操作后将插入时的主键值存放到保存的对象中
2、插入后获取自增主键值
有时候遇到类似一对多的那种表结构,在插入多端数据时,需要获取刚刚保存了的一段的主键使用Mybatis提供的
<selectKey />
来单独配置针对自增逐渐的处理。当然有两种方式:一种是使用useGemeratedKeys,一种是使用<selectKey/>的方式
对于MySQL
将selectKey放在insert之后,通过LAST_INSERT_ID() 获得刚插入的自动增长的id的值
完成插入操作后将插入时的主键值存放到保存的对象中
对于Oracle
完成插入操作后将插入时的主键值存放到保存的对象中
注意:
当数据插入操作不关心插入后数据的主键(唯一标识),那么建议使用 不返回自增主键值 的方式来配置插入语句,这样可以避免额外的SQL开销。
参考地址当执行插入操作后需要立即获取插入的自增主键值,比如一次操作中保存一对多这种关系的数据,那么就要使用 插入后获取自增主键值 的方式配置。
序列号命名还是要注意一下,可以执行SQL语句进行验证。当建立序列的时候,序列的名字最好是写成大写,虽然Oracle会自动进行转换,但是最近在用的时候却没有注意,写成的小写序列名字并没有转成大写,可能造成错误。
https://blog.csdn.net/lin910429/article/details/22808963
https://blog.csdn.net/zknxx/article/details/53558850
http://www.cnblogs.com/yangchao/archive/2010/09/28/2044415.html