Mybatis与Db2、Oracle使用时的主键自增问题

1.Mybatis与Db2、Oracle等结合使用时

1.1 使用Sequence生成主键

oracle、db2等数据库中不能像mysql一样设置主键自动增加,因此需要我们为oracle/db2设置序列(Sequence),通过获取序列(Sequence)的值来完成主键的自增操作:
一般情况下当我们创建用户表:User

Create Table User( 
 id number(12) primary key, --通过序列和触发器实现id的自增 
 name varchar2(20) , 
 age number(3) , 
 sex number(1) 
) 

创建序列Sequence

Create Sequence SEQ_USER
minvalue 1 
maxvalue 9999999999999999999
start with 1   --从1开始 
increment by 1 --增量为1 
cache 0 
order; 

此时自增序列已经创建完毕,接下来就是如何在插入数据时获取序列(Sequence)的值:

insert into user (id,name, age, sex) values (SEQ_USER.nextval,?, ?, ?)

此处需要注意几点:

  1. 一个sequence可以被多个表共享。

  2. 被多个表共享的sequence生成的数字序列始终连续,不会重新开始。

  3. 如果不再使用的sequence请删除。

  4. 当手动插入一条数据到User表中之后,此时再使用Sequence的方式插入数据会出现主键重复(违反唯一约束)的异常
    只有使用SEQ_USER.nextval获取序列才会使序列自增,

1.2 在Oracle中使用 sys_guid() 生成主键

平常一直通过获取Sequence的值来当做主键使用,今天遇到了一个表的主键是Varchar类型的,并且此表没有设置Sequence,后来经过别人的提醒才知道Oracle中可以使用sys_guid()函数生成32位的唯一编码,来生成唯一主键。
我们可以在建表时直接这样设置:

create table test
(
id  raw(16) default sys_guid() primary key,
filler varchar2(100)
)

2.在Mybatis中如何生成主键并返回主键的值

    <insert id="addUser" parameterType="user">
    <selectKey resultType="string" order="BEFORE" keyProperty="id">
    --         使用Sequence
        select SEQ_USER.nextval as id from DUAL
  --               使用sys_guid()函数
  --         select sys_guid() as id from DUAL
    selectKey>
     insert into user(id,name,age,sex)
        values (#{id},#{name},#{age},#{sex})
    insert>

使用上述两种方式,都可以获取到插入数据的主键,根据数据库表主键的类型和业务选择适合项目的方式:

User user = new User();
user.setName("小明");
user.setAge("24");
user.setSex("man");
//调用mybatis dao方法
userDao.addUser(user);
//此时的user对象中的id属性已经被返回的主键填充
System.out.println(user.getId());

3. Mybatis+Oracle使用时字段需要设置jdbcType

insert into user(id,name,age,sex)
        values (#{id,jdbcType=INTEGER},
        #{name,jdbcType=VARCHAR},
        #{age,jdbcType=INTEGER},
        #{sex,jdbcType=VARCHAR})

你可能感兴趣的:(Mybatis)