java向数据库批量插入数据

话不多说,代码附上。

复制代码
    // 配置文件获取数据库信息
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.driver-class-name}")
    private String driver;
    @Value("${spring.datasource.username}")
    private String user;
    @Value("${spring.datasource.password}")
    private String password;
复制代码

 

复制代码
public void batcheInsert(List<Map<String,Object>>listMap, String tableName){
        try {
            String sql = "";
            String sqlStr1 = "INSERT INTO "+tableName+" (";
            String sqlStr2=  ") VALUES (";
            String sqlStr3 = ")";
            String sqlKey = "";
            String sqlValue = "";
            for (Object key: listMap.get(0).keySet() ) {
                sqlKey+= key + ",";
                sqlValue += "?,";
            }
            sqlKey = sqlKey.substring(0,sqlKey.length() -1);
            sqlValue = sqlValue.substring(0,sqlValue.length() -1);
            sql = sqlStr1 + sqlKey + sqlStr2 + sqlValue + sqlStr3;
            logger.info("拼接的insert into SQL:" + sql);

            Connection conn = getConnection();
            conn.setAutoCommit(false);
            //构造预处理statement
            PreparedStatement pst = conn.prepareStatement(sql);
            int count = 0;
            int index = 1;
            for(int i = 1;i <= listMap.size();i++){
                for (Object val: listMap.get(i-1).values() ) {
                    pst.setString((index++),nullToNull(val));
                }
                index = 1;
                pst.addBatch();
                //每10000次提交一次
                if(i % 10000 == 0){//可以设置不同的大小;
                    ++count;
                    pst.executeBatch();
                    conn.commit();
                    pst.clearBatch();
                }
            }
            // 最后插入不足1w条的数据
            pst.executeBatch();
            conn.commit();
            logger.info("批次提交次数:" + ++count);
            pst.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
复制代码

 

复制代码
public Connection getConnection() {//建立返回值为Connectiong的方法
        Connection con = null;//声明Connection对象
        try {//加载数据库驱动类
            Class.forName(driver);
            System.out.println("数据库驱动加载成功");
        } catch (ClassNotFoundException e) {

            e.printStackTrace();
        }
        try {//通过访问数据库的URL获取数据库连接对象
            con = DriverManager.getConnection(url, user, password);
            System.out.println("数据库连接成功");

        } catch (SQLException e) {

            e.printStackTrace();
        }
        return con;//按方法要求返回一个Connectiong对象
    }
复制代码

 

posted @   丿小师傅灬  阅读(1528)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示