JdbcTemplate实现批处理(插入、更新)

  此处主要针对execute和batchUpdate中部分内容说明。
  针对大数据量的插入推荐使用批量插入以便提高性能,经过实战说明JdbcTemplate批量插入效率高于循环单条插入。
  JdbcTemplate继承JdbcAccessor类与JdbcOperations接口;其中JdbcAccessor类设置数据源,JdbcOperations定义方法JdbcTemplate来实现。
####1. JdbcTemplate主要提供以下五类方法:

  • execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;

  • update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;

  • query方法及queryForXXX方法:用于执行查询相关语句;

  • call方法:用于执行存储过程、函数相关语句。

####2. maven中添加相应模块

<!--mysql 驱动-->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.40</version>
  </dependency>
  <!--支持jdbc-->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
  </dependency>

####3. 配置数据源

#mysql数据源
spring.datasource.url=jdbc:mysql://192.168.*.*:3306/venus_spb?useUnicode=true&amp;characterEncoding=UTF-8
spring.datasource.username=****
spring.datasource.password=*****
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

####4. Service类中注入JdbcTemplate实例

@Service
public class UserServiceImpl implements UserService {

    //JdbcTemplate注入实例
    @Resource
    private JdbcTemplate jdbcTemplate;
}

####5. 实例说明
#####5.1 查询返回实体List

@Override
public List<UserDto> queryUsers() {
   RowMapper<UserDto> rm = BeanPropertyRowMapper.newInstance(UserDto.class);
   List<UserDto> userList = jdbcTemplate.query("select * from vns_user",rm);
   //userList = jdbcTemplate.queryForList("select * from vns_user",UserDto.class);
   return userList;
}

特别说明:使用queryForList查询出现异常,是因为UserDto.class自动编入一列导致与实际列数不符

{
  "timestamp": 1481377345590,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "org.springframework.jdbc.IncorrectResultSetColumnCountException",
  "message": "Incorrect column count: expected 1, actual 4",
  "path": "/venus/user/getUserList"
}

#####5.2 批量插入
方法1:

@Override
@Transactional
public Integer batchInsertUsers(List<UserDto> listUser) {
    String sql = "insert vns_user(u_code,u_name,u_age) values(?,?,?)";
    jdbcTemplate.batchUpdate(sql,new BatchPreparedStatementSetter()
    {
        public void setValues(PreparedStatement ps, int i)throws SQLException
        {
            String code = listUser.get(i).getuCode();
            String name=listUser.get(i).getuName();
            int age=listUser.get(i).getuAge();
            ps.setString(1,code);
            ps.setString(2, name);
            ps.setInt(3, age);
        }
        public int getBatchSize()
        {
            return listUser.size();
        }
    });
    return 0;
}

方法2:

@Override
@Transactional
public Integer batchInsertUsers(List<UserDto> listUser) {
    String sql = "insert vns_user(u_code,u_name,u_age) values(?,?,?)";
    jdbcTemplate.batchUpdate(sql,setParameters(listUser));
    return 0;
}

/**
 * 设置参预置数
 * @param listUser
 * @return
 */
private List<Object[]> setParameters(List<UserDto> listUser){
    List<Object[]> parameters = new ArrayList<Object[]>();
    for (UserDto u : listUser) {
        parameters.add(new Object[] { u.getuCode(),u.getuName(),u.getuAge()});
    }
    return parameters;
}
### 使用 Spring Boot 中的 JdbcTemplate 进行批量数据插入Spring Boot 应用程序中,`JdbcTemplate` 是一种简单而强大的工具,用于执行 SQL 查询和更新操作。为了提高效率并减少网络开销,在处理大量数据时推荐使用批处理功能。 #### 准备工作 确保已经在项目中引入了必要的依赖项,并配置好了数据源连接池以及 `JdbcTemplate` Bean 的初始化[^2]。 #### 方法定义 创建一个服务类来封装批量插入逻辑: ```java @Service public class BatchInsertService { private final JdbcTemplate jdbcTemplate; @Autowired public BatchInsertService(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } /** * 执行批量插入操作 */ public void batchInsert(List<MyEntity> entities){ String sql = "INSERT INTO my_table (column1, column2) VALUES (?, ?)"; List<Object[]> argsList = new ArrayList<>(); for(MyEntity entity : entities){ Object[] params = {entity.getColumn1(), entity.getColumn2()}; argsList.add(params); } int[] updateCounts = jdbcTemplate.batchUpdate(sql, argsList.toArray(new Object[0][])); // 可选:验证每条记录是否成功插入 for(int count : updateCounts){ if(count != 1){ throw new RuntimeException("Batch insert failed"); } } } } ``` 上述代码展示了如何利用 `batchUpdate()` 方法来进行多条记录的同时写入数据库表内。这里需要注意的是,当构建参数列表时要保证顺序与SQL语句中的占位符相匹配[^1]。 此外,还可以考虑采用事务管理机制以增强可靠性;如果遇到异常情况,则可以回滚整个批次的操作而不是只影响部分数据[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值