MyBatis 入门系列【3】 主键生成方式

189 阅读2分钟

1. 生成方式

对于主键生成,MyBatis提供了多种生成方式。

1.1 数据库自增

如果数据库支持自动生成主键的字段(比如 MySQLSQL Server),插入数据时,不需要设置主键,数据库会自己生成,但是要想获取到主键则需要使用useGeneratedKeys属性(仅适用于 insertupdate),这会让MyBatis 使用 JDBCgetGeneratedKeys 方法来取出由数据库内部生成的主键。

案例演示

Insert标签添加属性getGeneratedKeys,并指定keyColumnkeyProperty

    <!--插入用户-->
    <insert id="insertUser" parameterType="user" useGeneratedKeys="true" keyColumn="user_id" keyProperty="userId">
        INSERT INTO base_user (user_id,user_name,login_name)
        VALUES (#{user.userId},#{user.userName},#{user.loginName})
    </insert>

执行SQL,并获取数据库自动生成的主键:

image.png

1.2 不支持自增的数据库

对于不支持自动生成主键列的数据库和可能不支持自动生成主键的 JDBC 驱动,可以使用selectKey标签来生成主键。

selectKey 元素描述如下:

<selectKey
  keyProperty="id"
  resultType="int"
  order="BEFORE"
  statementType="PREPARED">

selectKey 元素的属性:

属性描述
keyPropertyselectKey 语句结果应该被设置到的目标属性。如果生成列不止一个,可以用逗号分隔多个属性名称。
keyColumn返回结果集中生成列属性的列名。如果生成列不止一个,可以用逗号分隔多个属性名称。
resultType结果的类型。通常 MyBatis 可以推断出来,但是为了更加准确,写上也不会有什么问题。MyBatis 允许将任何简单类型用作主键的类型,包括字符串。如果生成列不止一个,则可以使用包含期望属性的 ObjectMap
order可以设置为 BEFOREAFTER。如果设置为 BEFORE,那么它首先会生成主键,设置 keyProperty 再执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 中的语句 - 这和 Oracle 数据库的行为相似,在插入语句内部可能有嵌入索引调用。
statementType和前面一样,MyBatis 支持 STATEMENTPREPAREDCALLABLE 类型的映射语句,分别代表 Statement, PreparedStatementCallableStatement 类型。

案例演示

添加selectKey 标签,设置生成ID算法:

    <insert id="insertUser" parameterType="user" useGeneratedKeys="true" keyColumn="user_id" keyProperty="userId">
        <selectKey keyProperty="user.userId" keyColumn="user_id" resultType="long" order="BEFORE" >
            select max(user_id)+1 as user_id from base_user
        </selectKey>
        INSERT INTO base_user (user_id,user_name,login_name)
        VALUES (#{user.userId},#{user.userName},#{user.loginName})
    </insert>

执行语句测试,可以看出是先生成了ID,然后设置到实体类中:

在这里插入图片描述