批量快速插入需要驱动版本和url参数满足条件
1.jdbc驱动版本5.1.13以上
2.url:jdbc:mysql://10.10.10.10:3306/db?useUnicode=true&characterEncoding=UTF-8&useSSL=false&rewriteBatchedStatements=true
配置rewriteBatchedStatements=true
这个参数会使用驱动重写sql,改成单条sql的插入多条数据的方式
一、jdbc的方式
private void insertJSONObjects(Connection con,List<JSONObject> array){
try {
PreparedStatement ps = con.prepareStatement("insert into st (id,name) values (?,?)");
con.setAutoCommit(false);
for (JSONObject o : array) {
if (o.getStr("id")==null){
ps.setNull(1, Types.NULL);
}else {
ps.setString(1,o.getStr("id"));
}
if (o.getStr("name")==null){
ps.setNull(2, Types.NULL);
}else {
ps.setString(2,o.getStr("name"));
}
ps.addBatch();
}
ps.executeBatch();
ps.clearBatch();
con.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
二、JdbcTemplate的方式
private void insertJSONObjects(JdbcTemplate jdbcTemplate,List<JSONObject> array){
jdbcTemplate.batchUpdate("insert into st (id,name) values (?,?)", new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
if (array.get(i).getStr("id")==null){
ps.setNull(1, Types.NULL);
}else {
ps.setString(1,array.get(i).getStr("id"));
}
if (array.get(i).getStr("name")==null){
ps.setNull(2, Types.NULL);
}else {
ps.setString(2,array.get(i).getStr("name"));
}
}
@Override
public int getBatchSize() {
return array.size();
}
});
}