java - mybatis是否可以在oracle中插入所有并返回序列(useGenerateKeys)?

标签 java oracle servlets mybatis spring-mybatis

我目前正在从 PostgreSQL 迁移到 Oracle DBMS。但出现一些问题。我希望“在 mybatis 中使用 插入所有序列并将序列返回到应用程序。”

我的 PostgreSQL 代码是(它也适用于 MySQL 和 MariaDB)

 <insert id="insertServiceCodeList" parameterType="serviceCodeVo" useGeneratedKeys="true" keyColumn="code" keyProperty="code">
    insert into service_code (
        serv_info_seq_id,
        name,
        default_key_type,
        cre_date,
        creator,
        description,
        state
    ) values 
    <foreach collection="list" item="item" separator=","> 
    (
        #{item.servInfoSeqId},
        #{item.name},
        #{item.defaultKeyType},
        now(),
        #{item.creator},
        #{item.description},
        0
    )
    </foreach>
</insert>

我尝试过案例。请参阅下文。

案例1

它在Oracle中可以工作,但在mybatis中不起作用,不返回序列。

1.创建序列

Create Sequence service_code_seq;

2.为sequence.nextval创建函数

create or replace function get_seq( seq_name in varchar2 ) 
return 
  number 
is
  v_num number;
  sql_stmt varchar2(64);
begin
  sql_stmt := 'select ' || seq_name || '.nextval from dual';
  execute immediate sql_stmt into v_num;
  return v_num;
end;

3.mybatis插入全部代码

<insert id="insertServiceCodeList" parameterType="serviceCodeVo" useGeneratedKeys="true" keyColumn="code" keyProperty="code">
insert all
     <foreach collection="list" item="item" >
        into service_code (
            code,
            serv_info_seq_id,
            name,
            default_key_type,
            cre_date,
            creator,
            description,
            state
        ) values (
            get_seq( 'service_code_seq' ),
            #{item.servInfoSeqId},
            #{item.name},
            #{item.defaultKeyType},
            systimestamp,
            #{item.creator},
            #{item.description},
            0
        )
    </foreach>
    select * from dual;
</insert>

案例2

它在Oracle中可以工作,但在mybatis中不起作用,不返回序列。

<insert id="insertServiceCodeList" parameterType="serviceCodeVo" useGeneratedKeys="true" keyColumn="code" keyProperty="code">
    insert into service_code (
        code,
        serv_info_seq_id,
        name,
        default_key_type,
        cre_date,
        creator,
        description,
        state
    ) select
        service_code_seq.nextval,
        servInfoSeqId,
        name,
        defaultKeyType,
        systimestamp,
        creator,
        description,
        0
    from (
    <foreach collection="list" item="item" separator="union all"> 
        select
            #{item.servInfoSeqId} servInfoSeqId,
            #{item.name} name,
            #{item.defaultKeyType} defaultKeyType,
            #{item.creator} creator,
            #{item.description} description
        from
            dual
    </foreach>
    )
</insert>

我希望从 PostgreSQL 迁移到 Oracle,而不修改应用程序代码,仅迁移 SQL 代码。

谢谢!!

最佳答案

Oracle 驱动程序似乎不支持从“多行插入”返回生成的键。
因此,“不修改应用程序代码”可能是不可能的。

仅供引用,如果您切换到“批量插入”,它可能会起作用。
当插入大量行时,它的性能也更好。

int batchSize = 1000;
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
  YourMapper mapper = sqlSession.getMapper(YourMapper.class);
  int size = serviceCodeList.size();
  for (int i = 0; i < size;) {
    mapper.insertServiceCode(serviceCodeList.get(i));
    i++;
    if (i % batchSize == 0 || i == size) {
      sqlSession.flushStatements();
      sqlSession.clearCache();
    }
  }
  sqlSession.commit();
}

映射器语句很简单。

<insert id="insertServiceCode" useGeneratedKeys="true"
    keyColumn="code" keyProperty="code">
  insert into service_code (
    code,
    serv_info_seq_id,
    name,
    default_key_type,
    cre_date,
    creator,
    description,
    state
  ) values (
    service_code_seq.nextval,
    #{item.servInfoSeqId},
    #{item.name},
    #{item.defaultKeyType},
    systimestamp,
    #{item.creator},
    #{item.description},
    0
  )
</insert>

关于java - mybatis是否可以在oracle中插入所有并返回序列(useGenerateKeys)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57797374/

相关文章:

java - 如何从 WEB-INF 文件夹之外的文件夹中读取文件?

Java 按特定步长舍入

java - 如何在 Java 中验证 long 为日期

java - IBM MQ 云连接

java - 404 NoTargetForURIException 访问 Websphere 7 下的 WebContent 文件夹中的静态资源

java - 如何从 Java EE 容器管理的安全性注销?

oracle - 使用 SQLLDR 加载 CSV(已拒绝)

c# - 使用正确的字符集将字符写入数据库

sql - 查找日期间隔

java - Spring MVC HTTP 状态 500 – 内部服务器错误,servlet [dispatcher] 的 Servlet.init() 抛出异常