db2主键自增和oracle,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,?, ?, ?)

此处需要注意几点:

一个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中如何生成主键并返回主键的值

-- 使用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})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值