无效的列类型: getInt not implemented for class oracle.jdbc.driver.T4CRowidAccessor
以userinfo表为例:
- --创建userinfo表
- CREATE TABLE userinfo (
- id number(11) NOT NULL,
- name varchar2(20) ,
- age number(3)
- );
- 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;
- }
Oracle字段是不支持自增的,但是我们可以通过自增序列去实现该效果:
- --设置自增序列,名称为"seq_userinfo",名字任意命名
- create sequence seq_userinfo
- increment by 1 --每次+1
- start with 1 --从1开始
- nomaxvalue --不限最大值
- nominvalue --不限最小值
- cache 20; --设置取值缓存数为20
sequence详解可以参考该文章:Oracle中sequence(序列)详解_睡竹的博客-CSDN博客
- <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}
- 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);
-
- }
- //注入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());
- }
结果如下:
注意:
我们也可以直接在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);
-
- }
测试代码与上面一致,结果如下: