数据库主键id自增的方法,列举了几种如下

一、数据库自增(部分数据库支持)
创建表的时候设置id自增即可,或者后期修改表id自增

# mysql 语法create table your_table_name(id bigint(20)not null auto_increment primary key comment '主键', // auto_increment 表示自增(固定死id从1开始,每次加1)name varchar(24) not null);# sqlserver 语法create table [dbo].[your_table_name] ([id] int primary key identity(1,1) not null,// identity(1,1) 表示自增(支持id从N开始,每次加M,这里N,m都=1)[name] varchar(24) not null);

二、序列号 (适合oracle)

# 创建序列号create sequence user_seq minvalue 1--最小值 nomaxvalue --最大值 start with 1 --起始值 increment by 1--增长基数 nocycle--不循环一直增加 nocache ; -- 不使用缓存 # 插入数据 insert into user (user_id, user_name, sex) values (user_seq.nextval, #{userName}, #{sex});

三、mybatis获取自增 (通用)
sql语句被执行的时候会自动带上主键字段和填充值去执行,语句中就不用写id字段了。useGeneratedKeys属性默认是false的,keyProperty对应实体对象里面的主键id字段名称,keyColumn对应数据库的字段名称

<insert id="addUser" parameterType="com.yulisao.User" useGeneratedKeys="true" keyProperty="userId" keyColumn="user_id">insert into user (user_name, sex) VALUES (#{userName}, #{sex})</insert>

如果是注解形式的sql,写法如下

@Insert("insert into user (user_name, sex) values (#{userName}, #{sex})")@Options(useGeneratedKeys=true, keyProperty="userId", keyColumn="user_id")Integer addUser(User user);

或者自定义取id值

<insert id="addUser" parameterType="com.yulisao.User" useGeneratedKeys="true"keyProperty="userId"><selectKey keyProperty="userId" resultType="int" order="BEFORE"> <!-- order 属性的值和数据库有关, mysql是 after,oracle是 before--><!-- 自己查询最后使用的id -->select isnull(max(user_id)+1, 1) as userId from user <!-- sqlserver语法--><!-- select 你创建的序列名称.nextval from dual --><!-- oracle 查询最后使用的id --><!-- select LAST_INSERT_ID() --><!-- mysql 查询最后使用的id --><!-- select SCOPE_IDENTITY() --><!-- sqlserver 查询最后的id --></selectKey>insert into user (user_name, sex) values (#{userName}, #{sex});</insert>

拓展知识

  1. 标签包含属性如下
  • id :唯一标识,每条sql语句的id都不一样,如果有重复启动项目时应该会报错
  • parameterType :入参的类名或别名 可选(MyBatis可自动推断入参类型)
  • resultType : 返回结果的类名或别名
  • flushCache :默认值为 true ,任意执行一次都会清空一级缓存和二级缓存
  • timeout :超时时间 单位秒
  • statementType :对于 STATEMENT、PREPARED、ALLABLE, MyBatis 会分别使用对应的 Statement、PreparedStatement、Callable tatement ,默认PREPARED
  • useGeneratedKeys :默认值为false ,如果设置为true, MyBatis 使用 JDBC – getGeneratedKeys 方法来取出由数据库内部生成的主键
  • keyProperty: MyBatis 通过 getGeneratedKeys 获取到的主键id值将要赋值给哪个字段名称(即实体对象里面的驼峰形式userId)
  • keyColumn :只对insert有效,生成的列名是什么 (即数据库表的下划线形式字段名称user_id)是否必须与数据库类型有关,比如PostgreSQL必须
  • databaseId :一个项目用到多个数据库/数据源才使用这个属性。如果配置了 databaseIdProvider,MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略。即如果在mybatis的配置文件中没有配置 databaseIdProvider,则databaseId属性不会生效。

更多属性,以及其他标签的属性可以看这里(从XXXMapper.xml里面按住ctrl点击标签或者属性跳进来)

有时候用了useGeneratedKeys 属性但并不生效,也可以参考以下原因

  • 设置keyProperty,keyColumn 的值不正确
  • 数据库的id字段必须设置为自增的
  • 入参有@Param修饰 会导致id无法自动赋值

最后,通过触发器、事件等去实现id自增的方法就不是很推荐了,所以不举例了。