MySQL批量插入数据(addBatch(),executeBatch())(解决数据库插入汉字乱码问题)

利用addBatch()和executeBatch()批量插入数据

  1. addBatch()将多条sql语句装载在一起
  2. executeBatch()将addBatch()装载在一起的多条sql语句一次性执行,并返回一个数组,每执行成功一次就在数组中添加一个1,否则添加一个0

现在有一个需求,将99条学生信息加载到表studentTest中,并且每一条数据都变成十条,总共990条数据
使用连接池来连接数据库,下面是DBCP连接池工具类的代码

package com.demo.spring.util;
import org.apache.commons.dbcp2.BasicDataSource;

import java.sql.Connection;
import java.sql.SQLException;
public class DBCPUtil {
    private static BasicDataSource bds;
    static {
        System.out.println("创建连接池");
        bds = new BasicDataSource();
        // 配置连接池大小
        bds.setInitialSize(5);
        //配置连接信息
        bds.setUrl("jdbc:mysql://master:3306/show1?useUnicode=true&characterEncoding=utf-8");
        bds.setDriverClassName("com.mysql.jdbc.Driver");
        bds.setUsername("root");
        bds.setPassword("123456");
    }

    public static Connection getConn(){
        System.out.println("获取连接");
        try {
            return bds.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

这里需要注意的是,在获取数据库信息时,要在后面配置一下编码格式,否则插入到数据库中的汉字会变成乱码
在数据库名后面加上 ?useUnicode=true&characterEncoding=utf-8

然后就是具体插入数据的代码

package com.demo.spring.test;

import com.demo.spring.util.DBCPUtil;
import java.io.BufferedReader;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.PreparedStatement;

public class BatchMySQL {
    public static void main(String[] args) throws Exception{
        String path="F:\\idea2018.1\\workplace\\spring\\src\\main\\resources\\words\\students.txt";
        BufferedReader br = new BufferedReader(new FileReader(path));
        String line;
        Connection conn = null;
        PreparedStatement ps = null;
        while((line=br.readLine())!=null){
            String[] split = line.split(",");
            String id = split[0];
            String name = split[1];
            String age = split[2];
            String sex = split[3];
            String clazz = split[4];
            //插入数据
            conn=DBCPUtil.getConn();
            String sql = "insert into studentTest values(?,?,?,?,?)";
            ps=conn.prepareStatement(sql);
            //这里是将students文件里面的每一行内容,都变成10条,然后插入数据库中
            //为了避免主键重复,所以每一行内容的id都加上for循环的i
            for(int i=1;i<=10;i++){
                String newid = id+i;
                ps.setString(1,newid);
                ps.setString(2,name);
                ps.setString(3,age);
                ps.setString(4,sex);
                ps.setString(5,clazz);
                //students文件里面有99行内容,每一行都变成十行,总计990行
                //990行如果一条一条插入速度太慢,所以批量插入
                //addBatch()是把若干sql语句装载到一起,然后一次性传送到数据库执行,即是批量处理sql数据的
                //将当前循环的sql语句加入addBatch(),一共循环十次,所以一个批次有十行sql语句
                ps.addBatch();
            }
            //这里是把一条语句经过for循环后变成的十条语句作为一个批次进行执行
            //按批次执行sql语句
            ps.executeBatch();
            System.out.println("单条数据放大十倍后的批量插入完成");
            ps.close();
            conn.close();
        }
        br.close();
    }
}

在这里插入图片描述
到数据库中查询
在这里插入图片描述
再查询一下行数 select count(*) from studentTest;
在这里插入图片描述
批量插入数据成功,另外看一下executeBatch()获取的数组情况

package com.demo.spring.test;

import com.demo.spring.util.DBCPUtil;
import java.io.BufferedReader;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.PreparedStatement;

public class BatchMySQL {
    public static void main(String[] args) throws Exception{
        String path="F:\\idea2018.1\\workplace\\spring\\src\\main\\resources\\words\\students.txt";
        BufferedReader br = new BufferedReader(new FileReader(path));
        String line;
        int count=0;
        Connection conn = null;
        PreparedStatement ps = null;
        while((line=br.readLine())!=null){
            String[] split = line.split(",");
            String id = split[0];
            String name = split[1];
            String age = split[2];
            String sex = split[3];
            String clazz = split[4];
            conn=DBCPUtil.getConn();
            String sql = "insert into studentTest values(?,?,?,?,?)";
            ps=conn.prepareStatement(sql);
            for(int i=1;i<=10;i++){
                String newid = id+i;
                ps.setString(1,newid);
                ps.setString(2,name);
                ps.setString(3,age);
                ps.setString(4,sex);
                ps.setString(5,clazz);

                ps.addBatch();
            }
            int[] ints = ps.executeBatch();
            for (int anInt : ints) {
                if(anInt==1){
                    count+=1;
                }
            }
            System.out.println("总共增加了"+count+"条数据");
            ps.close();
            conn.close();
        }
        br.close();
    }
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
同样的,创建成功

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一纸春秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值