Spring Boot 使用JdbcTemplate

来源:互联网 发布:360软件认证费用 编辑:程序博客网 时间:2024/05/24 07:32

  此处主要针对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-8spring.datasource.username=****spring.datasource.password=*****spring.datasource.driver-class-name=com.mysql.jdbc.Driver

4. Service类中注入JdbcTemplate实例

@Servicepublic class UserServiceImpl implements UserService {    //JdbcTemplate注入实例    @Resource    private JdbcTemplate jdbcTemplate;}

5. 实例说明

5.1 查询返回实体List
@Overridepublic 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@Transactionalpublic 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@Transactionalpublic 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;}
0 0
原创粉丝点击