Spring JDBC中jdbcTemplate.batchUpdate参数不匹配错误及用法咨询
使用JdbcTemplate.batchUpdate()批量插入学生数据的问题及解决方法
我尝试使用jdbcTemplate.batchUpdate()将批量学生数据插入数据库,以下是我的实现代码:
public void insert(List<Student> students) { String sql = "INSERT INTO sqlDB.Student VALUES(?,?,?)"; ArrayList<Object[]> sqlargs = new ArrayList<Object[]>(); for(Student tempstudent : students) { Object[] studentData = {tempstudent.getRollNo(),tempstudent.getName(),tempstudent.getAddress()}; sqlargs.add(studentData); } jdbcTemplate.batchUpdate(sql, sqlargs); System.out.println("Batch Update Completed-->"); }
运行后出现以下错误:
log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext). log4j:WARN Please initialize the log4j system properly. ApplicationContext is Loaded Exception in thread "main" java.lang.Error: Unresolved compilation problem: The method batchUpdate(String, BatchPreparedStatementSetter) in the type JdbcTemplate is not applicable for the arguments (String, ArrayList<Object[]>) at com.jdbc.dao.StudentDAOimpl.insert(StudentDAOimpl.java:76) at com.jdbc.service.StudentDAOHelper.setUpStudentTable(StudentDAOHelper.java:35) at com.jdbc.test.Runner.main(Runner.java:21)
我目前仅学习过Spring和JDBC,想咨询是否有其他使用batchUpdate接口的方式?
解决方案
方式1:适配batchUpdate(String sql, List<Object[]> batchArgs)重载方法
报错的核心是参数类型不匹配,JdbcTemplate提供了直接接收List<Object[]>的重载方法,只要确保Spring版本(2.5及以上)支持,直接调整代码即可:
public void insert(List<Student> students) { String sql = "INSERT INTO sqlDB.Student VALUES(?,?,?)"; List<Object[]> sqlArgs = new ArrayList<>(); for(Student student : students) { Object[] studentData = {student.getRollNo(), student.getName(), student.getAddress()}; sqlArgs.add(studentData); } // 调用匹配String和List<Object[]>参数的batchUpdate重载方法 jdbcTemplate.batchUpdate(sql, sqlArgs); System.out.println("Batch Update Completed-->"); }
方式2:实现BatchPreparedStatementSetter接口
这是报错提示中提到的方法,手动实现参数绑定逻辑,适合需要自定义参数处理的场景:
public void insert(List<Student> students) { String sql = "INSERT INTO sqlDB.Student VALUES(?,?,?)"; jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement ps, int i) throws SQLException { Student student = students.get(i); ps.setInt(1, student.getRollNo()); ps.setString(2, student.getName()); ps.setString(3, student.getAddress()); } @Override public int getBatchSize() { return students.size(); } }); System.out.println("Batch Update Completed-->"); }
方式3:使用NamedParameterJdbcTemplate(可选)
如果希望SQL语句更直观,可以用命名参数绑定数据,适合字段较多的场景:
public void insert(List<Student> students) { String sql = "INSERT INTO sqlDB.Student (rollNo, name, address) VALUES(:rollNo, :name, :address)"; List<Map<String, Object>> params = new ArrayList<>(); for(Student student : students) { Map<String, Object> paramMap = new HashMap<>(); paramMap.put("rollNo", student.getRollNo()); paramMap.put("name", student.getName()); paramMap.put("address", student.getAddress()); params.add(paramMap); } NamedParameterJdbcTemplate namedJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource()); namedJdbcTemplate.batchUpdate(sql, params.toArray(new Map[0])); System.out.println("Batch Update Completed-->"); }
内容的提问来源于stack exchange,提问作者Ajay Jeripothula
相关产品推荐
相关产品推荐

