Mybatis 自动生成主键

介绍

像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

首先,若是你的数据库支持自动生成主键的字段(好比 MySQLSQL 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 类型。
相关文章
相关标签/搜索