1、前言
- Oracle与MySQL、SQL server不同,本身是不能直接支持字段自增的,需要添加自增序列(sequence)去实现
- mybatis中,insert(插入)时,获取自增字段返回的数值,通过useGeneratedKeys=
“true”实现,然而useGeneratedKeys是需要数据库本身支持字段自增的,而Oracle不支持,从而会导致以下异常:
无效的列类型: getInt not implemented for class oracle.jdbc.driver.T4CRowidAccessor
2、准备工作
以userinfo表为例:
建表语句:
--创建userinfo表
CREATE TABLE userinfo (
id number(11) NOT NULL,
name varchar2(20) ,
age number(3)
);
userinfo对应的实体类User:
package com.shuizhu.domain;
import lombok.Data;
import java.io.Serializable;
/**
* MySQL库user表实体类
* @author 睡竹
* @date 2022/9/15
*/
@Data
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private Integer age;
}
3、实现步骤
1、在Oracle中,创建自增序列(sequence)
Oracle字段是不支持自增的,但是我们可以通过自增序列去实现该效果:
--设置自增序列,名称为"seq_userinfo",名字任意命名
create sequence seq_userinfo
increment by 1 --每次+1
start with 1 --从1开始
nomaxvalue --不限最大值
nominvalue --不限最小值
cache 20; --设置取值缓存数为20
sequence详解可以参考该文章:Oracle中sequence(序列)详解_睡竹的博客-CSDN博客
2、编写insert语句(xml映射文件中)
<insert id="insertUser" parameterType="com.shuizhu.domain.User">
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer">
select seq_userinfo.nextval from dual --"seq_userinfo"为你创建的自增序列名称
</selectKey>
insert into userinfo(id,name,age) values(#{id},#{name},#{age})
</insert>
注意:
1>mybatis实现Oracle主键返回自增值,与MySQL、SQL server不同,insert标签中不需要useGeneratedKeys属性和KeyProperty属性!
2>需要在insert标签中,使用selectKey标签,并指明:
①KeyProperty=”你需要自增的字段名称”
②order=”BEFORE” 表示在insert语句执行前,获取到自增序列,组装到#{id}中,使用到insert语句中,并同时使mybatis获取到该自增序列
3>insert语句中,需要显式的写出字段的字段,如 id,并在values中,使用#{id}
3、Dao代码
package com.shuizhu.dao.db2;
import com.shuizhu.domain.User;
import org.springframework.stereotype.Repository;
/**
* 测试mybatis自增主键返回
* @author 睡竹
* @date 2022/9/29
*/
@Repository
public interface UserInfoDao {
int insertUser(User user);
}
4、单元测试代码
//注入dao
@Resource
UserInfoDao dao;
/**
* 测试主键Oracle自增返回
*/
@Test
void testPrimaryKey() {
//模拟创建一个user对象,用于插入数据
User user = new User();
user.setName("睡竹");
user.setAge(18);
//获取的i是insert语句影响的行数,单条插入语句,若插入成功,i=1,不成功:i=0
int i = dao.insertUser(user);
System.out.println("成功插入:"+i+"条数据");
//此时,mybatis自动组装的主键ID,在user对象中!
System.out.println("返回的自增主键为:"+user.getId());
}
结果如下:
注意:
- insert方法返回的是影响表数据的行数,单条插入,成功,则返回1,失败,则返回0
- 获取的自增数值会被mybatis自动组装到实体类对象中,通过”对象.getId()”获取
5、@insert注解写法
我们也可以直接在Dao方法上去实现,不需要在XML文件中,如下:
package com.shuizhu.dao.db2;
import com.shuizhu.domain.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.SelectKey;
import org.springframework.stereotype.Repository;
/**
* 测试mybatis自增主键返回
* @author 睡竹
* @date 2022/9/29
*/
@Repository
public interface UserInfoDao {
@SelectKey(
before = true
,resultType = Integer.class
,keyProperty = "id"
,statement = "select seq_userinfo.nextval from dual"
)
@Insert("insert into userinfo(id,name,age) values(#{id},#{name},#{age})")
int insertUser(User user);
}
测试代码与上面一致,结果如下:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99561.html