测试类:com.yjw.demo.PrimaryKeyTest

自增长列

数据库表的主键为自增长列,在写业务代码的时候,经常需要在表中新增一条数据后,能获得这条数据的主键 ID,MyBatis 提供了实现的方法。

StudentMapper.xml

  1. <insert id="insertByAutoInc" parameterType="studentDO" keyProperty="id"
  2. useGeneratedKeys="true">
  3. insert into t_student (name, sex, selfcard_no, note)
  4. values (
  5. #{name,jdbcType=VARCHAR},
  6. #{sex,jdbcType=TINYINT},
  7. #{selfcardNo,jdbcType=BIGINT},
  8. #{note,jdbcType=VARCHAR}
  9. )
  10. </insert>

通过配置两个属性(keyProperty、useGeneratedKeys)获取表中生成的自增长主键。

  • keyProperty:表示以哪个列作为属性的主键,不能和 keyColumn 同时使用,如果你是联合主键可以用逗号将其隔开;
  • useGeneratedKeys:这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键,例如,MySQL 和 SQL Server 自动递增字段,Oracle 的序列等,但是使用它就必须要给 keyProperty 或者 keyColumn 赋值。useGeneratedKeys 的取值为布尔值,true/false,默认值为 false;

批量新增数据,也可以采用和上面一样的方式。

  1. <insert id="batchInsertByAutoInc" parameterType="list" keyProperty="id"
  2. useGeneratedKeys="true">
  3. insert into t_student (name, sex, selfcard_no, note)
  4. values
  5. <foreach collection="list" item="item" index="index" separator=",">
  6. (
  7. #{item.name,jdbcType=VARCHAR},
  8. #{item.sex,jdbcType=TINYINT},
  9. #{item.selfcardNo,jdbcType=BIGINT},
  10. #{item.note,jdbcType=VARCHAR}
  11. )
  12. </foreach>
  13. </insert>

非自增长列

假设我们取消表 t_student 的 id 自增的规则,我们的要求是:如果表 t_student 没有记录,则我们需要设置 id=1,否则我们就取最大 id 加2,来设置新的主键。对于一些特殊的要求,MyBatis 也提供了对应方法。

  1. <insert id="insertByNoAutoInc" parameterType="studentDO">
  2. <selectKey keyProperty="id" resultType="long" order="BEFORE">
  3. select if(max(id) is null, 1, max(id) + 2) as newId from t_student
  4. </selectKey>
  5. insert into t_student (id, name, sex, selfcard_no, note)
  6. values (
  7. #{id,jdbcType=BIGINT},
  8. #{name,jdbcType=VARCHAR},
  9. #{sex,jdbcType=TINYINT},
  10. #{selfcardNo,jdbcType=BIGINT},
  11. #{note,jdbcType=VARCHAR}
  12. )
  13. </insert>

批量新增数据,也可以采用和上面一样的方式。

  1. <insert id="batchInsertByNoAutoInc" parameterType="list">
  2. <selectKey keyProperty="id" resultType="long" order="BEFORE">
  3. select if(max(id) is null, 1, max(id) + 2) as newId from t_student
  4. </selectKey>
  5. insert into t_student (name, sex, selfcard_no, note)
  6. values
  7. <foreach collection="list" item="item" index="index" separator=",">
  8. (
  9. #{item.name,jdbcType=VARCHAR},
  10. #{item.sex,jdbcType=TINYINT},
  11. #{item.selfcardNo,jdbcType=BIGINT},
  12. #{item.note,jdbcType=VARCHAR}
  13. )
  14. </foreach>
  15. </insert>

作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/ki9mha 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。