我们在讲JDBC的时候讲过在插入新数据值的时候需要获得到自动生成的那个主键id的值
①获取PreparedStatement的对象的时候
PreparedStatement st = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS );
②在执行SQL语句后
st.executeUpdate();ResultSet rs = st.getGeneratedKeys(); //得到插入行的主键③最终拿到:if(rs.next()) System.out.println(rs.getInt(1));
Mybatis是对jdbc封装后的工具,当然也能做jdbc能做所有操作,那么Mybatis怎么获取新增的记录的这个id值?这里有分了两种数据库,一种是mysql这样的数据库支持自动增长,还有一种就是Oracle这样的不支持id自增的
mysql的做法
1.在映射文件的insert配置标签上加上两个属性,就这两个属性起作用
2.测试方法
Oracle的做法
前面我们用hibernate做的sshweb项目切换oracle数据库的时候,主键id自增是通过配置序列来实现的
这个配置本质上是怎么回事呢?本质是orcale为对应的表先添加一个序列列,这个序列列里的序列号是可以自增的
create sequence userid_seq
minvalue 1 //初始序号为1
maxvalue //不设最大序号,用默认就不写,这里也可以设置
start with 1 //从1开始计算
increment by 1 //每次增1
NOCYCLE //直累加,不循环
cache 20 //缓存20个
然后我们发起insert的sql语句的时候,在执行insert之前,我们先通过userid_seq .nextval(序列中的下一个数值),然后把这个值作为用户id插入数据库,这个序列值有个特性userid_seq.nextval拿一次,它递增一次,从而实现id值的自增长。
当前序列列增量的修改:alter sequence 序列名 increment by 数值;
删除序列列:drop sequence 序列名;
①select USERID_SEQ.nextval from dual; 然后在用这个值做id插入数据库。
② 还可一步到位:insert into sb_users (id,username,password,state,reg_date) values (userid_seq.nextval,'tttt','tt',1,to_date('2018-09-01','yyyy-MM-dd'));
以上是orcale通过sequence实现自增长的本质,那么在Mybatis怎么搞呢?
还是设置映射文件,加了一个selectKey的标签(前提核心配置文件中将缓解的default改为orcale)