zoukankan      html  css  js  c++  java
  • 【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-

  • 相关阅读:
    Smobiler实现手机弹窗
    在 ASP.NET Web API 中使用 Attribute 统一处理异常
    VMWare的网络模式说明
    Windows Server2008 IIS通过Nginx实现绑定多个https域名
    Error while Launching activity
    Android 动态渐变按钮
    mysql安装和配置详解以及Navicat连接失败问题
    selenium的基础学习
    使用Pandas.read_csv时出现OSError: Initializing from file failed
    sklearn 机器学习 Pipeline 模板
  • 原文地址:https://www.cnblogs.com/heyang78/p/15229849.html
Copyright © 2011-2022 走看看