Java - 批量插入用法(jdbcTemplate)

批量操作数据库与更新公司类型
本文介绍如何使用Java的JdbcTemplate批量插入书籍信息到数据库,并详细解释如何通过数组更新公司类型及其相关联的数据。

一个List类型的:

public void insertBooks(List<Book>book)
{
final List<Book>tempBook=book;
String sql="insert into book(name,pbYear)values(?,?)";
jdbcTemplate.batchUpdate(sql, newBatchPreparedStatementSetter()
{
public voidsetValues(PreparedStatement ps,int i)throws SQLException
{
Stringname=tempBook.get(i).getName();
intpbYear=tempBook.get(i).getPbYear();
ps.setString(1, name);
ps.setInt(2,pbYear);
}
public intgetBatchSize()
{
returntempBook.size();
}
});

}

两个数组类型的:

public int[] updateCompanyType(String[] unitIds, String[] unitType) {

           final List<String> list=new ArrayList<String>();
            for (int i = 0; i < unitIds.length; i++) {
                for (int j = 0; j < unitType.length; j++) {
                    list.add(unitIds[i]+","+unitType[j]);
                }
            }
        String sql="insert into map_unit_join_type (parentId,unitId,typeId,firstId,secondId,thirdId) values(?,?,?,?,?,?)";
               
        int[] counts=jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter(){
            public int getBatchSize() {
                return list.size();
            }
            public void setValues(PreparedStatement ps, int i)throws SQLException {
                String[] args=list.get(i).split(",");

                ps.setInt(1, Integer.parseInt(args[1]));
                ps.setInt(2, Integer.parseInt(args[0]));
                ps.setInt(3, Integer.parseInt(args[2]));
                ps.setInt(4, Integer.parseInt(args[3]));
                ps.setInt(5, Integer.parseInt(args[4]));
                ps.setInt(6, Integer.parseInt(args[5]));
            }
        });

}

要使用`JdbcTemplate`在ClickHouse中进行批量插入,可按以下步骤操作: ### 1. 添加依赖 首先,在`pom.xml`里添加ClickHouse客户端依赖: ```xml <dependency> <groupId>ru.yandex.clickhouse</groupId> <artifactId>clickhouse-jdbc</artifactId> <version>0.2.4</version> </dependency> ``` ### 2. 配置数据源 在Spring Boot项目的`application.properties`或者`application.yml`中配置ClickHouse数据源: ```properties spring.datasource.url=jdbc:clickhouse://localhost:8123/default spring.datasource.driver-class-name=ru.yandex.clickhouse.ClickHouseDriver spring.datasource.username=default spring.datasource.password= ``` ### 3. 创建JdbcTemplate Bean 在Spring Boot里,`JdbcTemplate`会自动配置。不过,为了明确使用ClickHouse数据源,可手动配置: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; @Configuration public class ClickHouseConfig { @Bean public JdbcTemplate clickHouseJdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } } ``` ### 4. 实现批量插入 下面是使用`JdbcTemplate`进行批量插入的示例代码: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; @Service public class ClickHouseBatchInsertService { @Autowired private JdbcTemplate clickHouseJdbcTemplate; public void batchInsert(List<Map<String, Object>> dataList, String tableName) { if (dataList == null || dataList.isEmpty()) { return; } // 构建SQL语句 StringBuilder sql = new StringBuilder("INSERT INTO ").append(tableName).append(" ("); Map<String, Object> firstRow = dataList.get(0); int columnCount = firstRow.size(); int index = 0; for (String column : firstRow.keySet()) { sql.append(column); if (index < columnCount - 1) { sql.append(", "); } index++; } sql.append(") VALUES ("); for (int i = 0; i < columnCount; i++) { sql.append("?"); if (i < columnCount - 1) { sql.append(", "); } } sql.append(")"); // 构建批量插入参数 Object[][] batchArgs = new Object[dataList.size()][columnCount]; for (int i = 0; i < dataList.size(); i++) { Map<String, Object> row = dataList.get(i); index = 0; for (Object value : row.values()) { batchArgs[i][index] = value; index++; } } // 执行批量插入 clickHouseJdbcTemplate.batchUpdate(sql.toString(), batchArgs); } } ``` ### 5. 使用示例 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @SpringBootApplication public class ClickHouseBatchInsertApp implements CommandLineRunner { @Autowired private ClickHouseBatchInsertService clickHouseBatchInsertService; public static void main(String[] args) { SpringApplication.run(ClickHouseBatchInsertApp.class, args); } @Override public void run(String... args) throws Exception { // 模拟数据 List<Map<String, Object>> dataList = new ArrayList<>(); for (int i = 0; i < 100; i++) { Map<String, Object> row = new HashMap<>(); row.put("id", i); row.put("name", "Name_" + i); dataList.add(row); } // 执行批量插入 clickHouseBatchInsertService.batchInsert(dataList, "your_table_name"); } } ``` ### 代码解释 - **依赖添加**:借助Maven添加ClickHouse JDBC驱动依赖。 - **数据源配置**:在Spring Boot配置文件里配置ClickHouse数据源。 - **JdbcTemplate Bean创建**:手动配置`JdbcTemplate`以使用ClickHouse数据源。 - **批量插入实现**:构建SQL语句与批量插入参数,然后使用`JdbcTemplate`的`batchUpdate`方法执行批量插入
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值