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,?, ?, ?)
此处需要注意几点:
-
一个sequence可以被多个表共享。
-
被多个表共享的sequence生成的数字序列始终连续,不会重新开始。
-
如果不再使用的sequence请删除。
-
当手动插入一条数据到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})