SpringBootJdbcTemplate批量操作
前⾔
在我们做后端服务Dao层开发,特别是⼤数据批量插⼊的时候,这时候普通的ORM框架(Mybatis、hibernate、JPA)就⽆法满⾜程序对性能的要求了。当然我们⼜不可能使⽤原⽣的JDBC进⾏操作,那样尽管效率会⾼,但是复杂度会上升。
综合考虑我们使⽤Spring中的JdbcTemplate和具名参数namedParameterJdbcTemplate来进⾏批量操作。
改造前
在开始讲解之前,我们⾸先来看下之前的JPA是如何批量操作的。
jdbctemplate批量insert实体类User
public class AppStudent {
private Integer id;
private Integer classId;
private String name;
private Integer age;
//伪代码、省略构造和get、set⽅法
}
DynamicQuery伪代码:
@Repository
public class DynamicQueryImpl implements DynamicQuery {
@PersistenceContext
private EntityManager em;
public EntityManager getEntityManager() {
return em;
}
//其实就是for循环、使⽤EntityManager的persist⽅法循环保存⽽已
@Override
public <T> void saveList(List<T> resultList) {
for (int i = 0; i < resultList.size(); i++) {
T t = (i);
em.persist(t);
}
}
}
改造后
JdbcTemplate
JdbcTemplate提供的主要⽅法:
1. execute⽅法:可以⽤于执⾏任何SQL语句,⼀般⽤于执⾏DDL语句;
2. update⽅法及batchUpdate⽅法:update⽅法⽤于执⾏新增、修改、删除等语句;batchUpdate⽅法⽤于执⾏批处理相关语句;
3. query⽅法及queryForXXX⽅法:⽤于执⾏查询相关语句;
4. call⽅法:⽤于执⾏存储过程、函数相关语句。
我们只需要在使⽤jdbcTemplate类中使⽤@Autowired进⾏注⼊即可
public void batchSave(){
List<Object[]> batchArgs=new ArrayList<Object[]>();
batchArgs.add(new Object[]{1,"⼩明",21});
batchArgs.add(new Object[]{2,"⼩红",22});
batchArgs.add(new Object[]{3,"露西",23});
String sql = "insert into user (username,password) values (?,?)";
jdbcTemplate.batchUpdate(sql, batchArgs);
}
以上基本实现了批量插⼊功能,但是当数据库字段⽐较多的时候,再以?占位符的形式编码的话就可能不是那么好⼀ ⼀对应了,这⾥spring 还提供了SimpleJdbcTemplate(Spring3.1+ 以后被标记为过时,到Spring 4.3则被完全移除,后⾯这个完全能满⾜需求)和NamedParameterJdbcTemplate模板引擎。
NamedParameterJdbcTemplate
相信使⽤过Hibernate的同学都知道,HQL中可以使⽤?或者:*的⽅式在外部配置查询参数。在 Spring JDBC 框架中,也提供了⼀种绑定SQL 参数的⽅式,使⽤具名参数(named parameter)。
我们只需要在使⽤NamedParameterJdbcTemplate类中使⽤@Autowired进⾏注⼊即可:
@Autowired
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
批量插⼊操作
public void batchSave(){
List<User> list = new ArrayList<User>();
//新增⽤户
list.add(new AppStudent(1,"张三",21));
list.add(new AppStudent(1,"李四",22));
list.add(new AppStudent(1,"王⼆⿇⼦",23));
//批量转数组
SqlParameterSource[] beanSources = Array());
String sql = "INSERT INTO app_student(class_id,name,age) VALUES (:classId,:name,:age)";
namedParameterJdbcTemplate.batchUpdate(sql, beanSources);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论