像MySql、Sql Server有自动生成主键(递增),Oracle只能用序列生成,或者UUID 那么在MyBatis怎么处理呢,有两个处理方式,那么咱们接下来看看怎么处理数据库
useGeneratedKeys编码
<insert id="insertAuthor"> insert into Author (id,username,password,email,bio) values (#{id},#{username},#{password},#{email},#{bio}) </insert>
如前所述,插入语句的配置规则更加丰富,在插入语句里面有一些额外的属性和子元素用来处理主键的生成,并且有多种生成方式。code
首先,若是你的数据库支持自动生成主键的字段(好比
MySQL
和SQL Server
),那么你能够设置useGeneratedKeys=”true”
,而后再把keyProperty
设置到目标属性上就OK了。例如,若是上面的 Author 表已经对 id 使用了自动生成的列类型,那么语句能够修改成:xml
<insert id="insertAuthor" useGeneratedKeys="true" keyProperty="id"> insert into Author (username, password, email, bio) values <foreach item="item" collection="list" separator=","> (#{item.username}, #{item.password}, #{item.email}, #{item.bio}) </foreach> </insert>
固然上述只能经过哪些有自动生成功能的数据库,那么在Oracle怎么处理这个事情呢?或者有其余方式生成随机数等等吗?索引
selectKey字符串
对于不支持自动生成类型的数据库或可能不支持自动生成主键 JDBC 驱动来讲,MyBatis 有另一种方法来生成主键。it
这里有一个简单(甚至很傻)的示例,它能够生成一个随机 ID(你最好不要这么作,但这里展现了 MyBatis 处理问题的灵活性及其所关心的广度):io
<insert id="insertAuthor"> <selectKey keyProperty="id" resultType="int" 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 元素描述以下:table
<selectKey keyProperty="id" resultType="int" order="BEFORE" statementType="PREPARED">
属性 | 描述 |
---|---|
keyProperty |
selectKey 语句结果应该被设置的目标属性。若是但愿获得多个生成的列,也能够是逗号分隔的属性名称列表。 |
keyColumn |
匹配属性的返回结果集中的列名称。若是但愿获得多个生成的列,也能够是逗号分隔的属性名称列表。 |
resultType |
结果的类型。MyBatis 一般能够推算出来,可是为了更加肯定写上也不会有什么问题。MyBatis 容许任何简单类型用做主键的类型,包括字符串。若是但愿做用于多个生成的列,则可使用一个包含指望属性的 Object 或一个 Map。 |
order |
这能够被设置为 BEFORE 或 AFTER。若是设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 而后执行插入语句。若是设置为 AFTER,那么先执行插入语句,而后是 selectKey 元素 - 这和像 Oracle 的数据库类似,在插入语句内部可能有嵌入索引调用。 |
statementType |
前面相同,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 语句的映射类型,分别表明 PreparedStatement 和 CallableStatement 类型。 |