• 【Mybatis/Oracle】如何在Mybatis的Mapper中撰写一个向Oracle某表批量插入数据的函数


    本文例程下载:https://files.cnblogs.com/files/heyang78/myBank_210905_1611.rar

    本文涉及到的Oracle版本:11.2.0.1.0,SpringBoot版本:2.5.4,MyBatis选择SpringBoot提供的2.2.0,不保证下例在其它版本中运转正常。

    下面是正文:

    如果Oracle中有某表Student,它仅包括id和name两个字段,那么向其中批量插值的SQL语句应当这样写:

    Insert all
    
    Insert into student(id,name) values ('1','XXX')
    
    Insert into student(id,name) values ('2','XXX')
    
    Insert into student(id,name) values ('3','XXX')
    
    ....
    
    Insert into student(id,name) values ('n','XXX')
    
    select * from dual

    这个语句实际上就是在多个单条插入语句前面放了一句insert all,后面放了一句 select * from dual。

    由于是一次性推送到DB端执行,所以执行效率比单条运行n次高一截。

    需要注意的是n不是想写多少就多少的,这与Oracle版本和机器性能有关,在我的T440p里,n可以取两百多一点,但超不过300,否则程序运行时可能报错。

    再往下就是把这一整句SQL在Mapper里写出来的过程。

    由于接口类没法写函数体,我们需要把接口函数引向真正的类函数:

    Mapper类:

    @Mapper
    public interface StudentMapper {
    ......
        @SelectProvider(type=StudentSql.class,method="bunchInsert")
        void bunchInsert(int count);
    }

    StudentSQL类:

    package com.hy.mybank.mapper;
    
    public class StudentSql {
        // 利用数据库的批量插入语法,一次性插入批量记录到Student表
        public String bunchInsert(int count) {
            
            StringBuilder sb=new StringBuilder();
            sb.append("INSERT ALL ");
            for(int i=0;i<count;i++) {
                sb.append("   INTO student(id, name) values('"+i+"','"+i+"')");
            }
            sb.append("select * from dual");
            String sql = sb.toString();
            
            return sql;
        }
    }

    很明显,bunchInsert函数主要就是在拼装我们在一开头提到的SQL语句。

    之后在测试函数里调用

        @Test
        void bunchInsert() {
            stuMapper.bunchInsert(202);
        }

    最后看看DB的情况:

    Expected=Actual,看来目的达成了。

    -END-

  • 相关阅读:
    WCF和Socket
    MBA-数学
    80端口被占用
    linux系统root密码忘了怎么办 三种方法快速找回root密码
    px、em、rem、%、vw、wh、vm等单位有什么区别?
    知道id如何进入
    查询两个时间段间隔多久的数据
    jsp中的判断
    判断手机登陆还是电脑登陆
    配置pom.xml、spring.xml、spring-mvc.xml、spring-mybatis.xml、web.xml
  • 原文地址:https://www.cnblogs.com/heyang78/p/15229849.html
Copyright © 2020-2023  润新知