参考:java
1.http://liuqing9382.iteye.com/blog/1574864mysql
2.http://blog.csdn.net/ultrani/article/details/9351573sql
3.mybatis中文文档数据库
做者前言:mybatis
使用Mybatis时,对于不一样数据库好比Oracle、SQL Server、Mysql,它们的主键生成策略是不一样的:oracle
1. Oracle自增主键必须得配一个sequence;dom
2. SQL Server和Mysql的自增使用自动自增设置的;函数
3. 对于非自增的主键,项目也可使用数据库函数来产生惟一主键,好比uuid()。
插入操做:
1. 对于相似mysql、SQL Server这样自增主键的表,插入能够不配置插入的主键列(在sql中显式的写出该id);ui
2. 相似Oracle这类使用sequence或者uuid()这种数据库函数产生惟一主键,若是不作触发器之类的设置的话,通常须要在sql中写出主键列的。spa
获取主键:
mybatis针对以上的不一样生成策略以及不一样的sql主键配置类型,将插入数据返回主键的解决方案分为一下几个状况:
1. 若是使用的数据库支持自动生成主键(如:MySQL 和 SQL Server),那么您就能够简单地将 useGeneratedKeys 设置为”true”,而后使用 keyProperty 设置你但愿自动生成主键的字段就能够了。
例如,若是 Author 表使用一个字段自动生成主键,那么配置语句就能够修改成:
<insert id="insertAuthor" parameterType="domain.blog.Author" useGeneratedKeys=”true” keyProperty=”id”> insert into Author (username,password,email,bio) values (#{username},#{password},#{email},#{bio}) </insert>
对于useGeneratedKeys和keyProperty属性的说明以下图:
2. MyBatis 还有另一种方式为不支持自动生成主键的数据库及 JDBC 驱动来生成键值,下面展现一个可以随机生成 ID 的例子(也许你不会这么作,这仅仅是演示 MyBatis 的功能,文档的词语,意思像是说至于你作不作,反正我作了):
<insert id="insertAuthor" parameterType="domain.blog.Author"> <selectKey keyProperty="id" resultType="java.lang.integer" order="BEFORE"> select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1 </selectKey> insert into Author (id, username, password, email,bio, favourite_section) values (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR}) </insert>
注意:上面的语句中标红的文字,添加了selectKey标签,首先解释以下图:
正如上面的解释咱们只要把握住order的设置,在sql语句执行前(BEFORE)或者执行后(AFTER),执行selectKey 语句来得到主键就能够了,如上面例子selectKey首先执行,生成随机的主键,这时候Author对象中的id首先被赋值了,而后才会调用insert 语句。这至关于在您的数据库中自动生成键值,不须要编写复杂的 java 代码。
固然,是否须要配置<selectKey>根据状况,只要能保证记录有主键便可,一旦配置了<selectKey>,就能够在执行插入操做时获取到新增记录的主键。
注意:若是没有配置<selectKey>那么保存后的对象的主键依旧为null。
小结:
经过上面的方案:
1. 咱们针对uuid()函数的主键返回应该以下:
<insert id="insertTestRole" parameterType="hashmap" > <selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id"> SELECT uuid() </selectKey> insert into testRole(id,name) values(#{id},#{name}) </insert>
2. oracle针对Sequence主键而言,隐式主键插入前必须指定一个主键值给要插入的记录:
<insert id="AltName.insert" parameterType="AltName"> <selectKey resultType="long" keyProperty="id"> SELECT SEQ_TEST.NEXTVAL FROM DUAL </selectKey> insert into altname(primaryName,alternateName,type)values(#{primaryName},#{alternateName},#{type}) </insert>
或者显式主键:
<insert id="insertEnterprise" parameterType="hashmap"> <selectKey resultType="integer" order="AFTER" keyProperty="ENTERPRISE_ID"> select sq_enterprise.currval from dual </selectKey> insert into m_enterprise (ENTERPRISE_ID,ENTERPRISE_NAME,ENTERPRISE_ADDRESS,ENTERPRISE_INTRODUCTION,ENTERPRISE_ZIP,ENTERPRISE_PHONE,ENTERPRISE_NUMBER) values (sq_enterprise.nextval,#{enterprise_name},#{address},#{introduction},#{zip},#{phone},#{enterprise_number}) </insert>
3. MySql、sql server自增主键而言,这类表在插入时不须要主键,而是在插入过程自动获取一个自增的主键:
<insert id="AltName.insert" parameterType="AltName"> <selectKey resultType="long" keyProperty="id"> SELECT LAST_INSERT_ID() </selectKey> insert into altname(primaryName,alternateName,type)values(#{primaryName},#{alternateName},#{type}) </insert>
根据得到自增主键的方法,咱们还能够:
<insert id="AltName.insert" parameterType="AltName">
<selectKey resultType="long" keyProperty="id"> SELECT @@IDENTITY </selectKey> insert into altname(primaryName,alternateName,type)values(#{primaryName},#{alternateName},#{type}) </insert>
可是参考http://blog.csdn.net/ultrani/article/details/9351573 中四种得到自增主键的方法利弊分析,做者推荐使用useGeneratedKeys属性设置来利用JDBC的getGeneratedKeys方法得到自增主键。