原文地址:http://blog.csdn.net/liuziyingbeidou/article/details/53561792
此处主要针对execute和batchUpdate中部分内容说明。
针对大数据量的插入推荐使用批量插入以便提高性能,经过实战说明JdbcTemplate批量插入效率高于循环单条插入。
JdbcTemplate继承JdbcAccessor类与JdbcOperations接口;其中JdbcAccessor类设置数据源,JdbcOperations定义方法JdbcTemplate来实现。
1. JdbcTemplate主要提供以下五类方法:
-
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
-
update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
-
query方法及queryForXXX方法:用于执行查询相关语句;
-
call方法:用于执行存储过程、函数相关语句。
2. maven中添加相应模块
mysql
mysql-connector-java
5.1.40
org.springframework.boot
spring-boot-starter-jdbc
#mysql数据源
spring.datasource.url=jdbc:mysql://192.168.*.*:3306/venus_spb?useUnicode=true&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 queryUsers() {
RowMapper rm = BeanPropertyRowMapper.newInstance(UserDto.class);
List 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 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 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