前面介绍了JdbcTemplate的插入数据和查询数据,占用CURD中的两项,本文则将主要介绍数据更新和删除。从基本使用上来看,姿式和前面的没啥两样java
<!-- more -->git
环境依然借助前面一篇的配置,连接如: 190407-SpringBoot高级篇JdbcTemplate之数据插入使用姿式详解github
或者直接查看项目源码: https://github.com/liuyueyi/spring-boot-demo/blob/master/spring-boot/101-jdbctemplatespring
咱们查询所用数据,正是前面一篇插入的结果,以下图sql
对于数据更新,这里会分为两种进行说明,单个和批量;这个单个并非指只能一条记录,主要针对的是sql的数量而言app
看过第一篇数据插入的童鞋,应该也能发现,新增数据也是用的这个方法,下面会介绍三种不一样的使用姿式ide
先提供一个数据查询的转换方法,用于对比数据更新先后的结果spring-boot
private MoneyPO queryById(int id) { return jdbcTemplate.queryForObject( "select id, `name`, money, is_deleted as isDeleted, unix_timestamp(create_at) as " + "created, unix_timestamp(update_at) as updated from money where id=?", new BeanPropertyRowMapper<>(MoneyPO.class), id); }
这个属于最基本的方式了,前面几篇博文中大量使用了,传入一条完整的sql,执行便可测试
int id = 10; // 最基本的sql更新 String sql = "update money set money=money + 999 where id =" + id; int ans = jdbcTemplate.update(sql); System.out.println("basic update: " + ans + " | db: " + queryById(id));
问好占位,实际内容经过参数传递方式ui
// 占位方式 sql = "update money set money=money + ? where id = ?"; ans = jdbcTemplate.update(sql, 888, id); System.out.println("placeholder update: " + ans + " | db: " + queryById(id));
从前面的几篇文章中能够看出,使用statement的方式,最大的好处有几点
PreparedStatementCreator
方式能够获取db链接,主动设置各类参数下面给出两个常见的使用方式
// 经过 PreparedStatementCreator 方式更新 ans = jdbcTemplate.update(new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { // 设置自动提交,设置100ms的超时,这种方式最大的好处是能够控制db链接的参数 try { connection.setAutoCommit(true); connection.setNetworkTimeout(Executors.newSingleThreadExecutor(), 10); PreparedStatement statement = connection.prepareStatement("update money set money=money + ? where id " + "= ?"); statement.setInt(1, 777); statement.setInt(2, id); return statement; } catch (Exception e) { e.printStackTrace(); return null; } } }); System.out.println("statementCreator update: " + ans + " | db: " + queryById(id)); // 经过 PreparedStatementSetter 来设置占位参数值 ans = jdbcTemplate.update(sql, new PreparedStatementSetter() { @Override public void setValues(PreparedStatement preparedStatement) throws SQLException { preparedStatement.setInt(1, 666); preparedStatement.setInt(2, id); } }); System.out.println("statementSetter update: " + ans + " | db: " + queryById(id));
注意下第一种调用中,设置了超时时间,下面给出一个动图,演示超时的使用姿式
在上图中,
批量方式,执行多个sql,从使用上看和前面没有太大的区别,先给出一个查询的通用方法
private List<MoneyPO> queryByIds(List<Integer> ids) { StringBuilder strIds = new StringBuilder(); for (Integer id : ids) { strIds.append(id).append(","); } return jdbcTemplate.query("select id, `name`, money, is_deleted as isDeleted, unix_timestamp(create_at) as " + "created, unix_timestamp(update_at) as updated from money where id in (" + strIds.substring(0, strIds.length() - 1) + ")", new BeanPropertyRowMapper<>(MoneyPO.class)); }
// 批量修改, // 执行多条sql的场景 int[] ans = jdbcTemplate .batchUpdate("update money set money=1300 where id =10", "update money set money=1300 where id = 11"); System.out.println( "batch update by sql ans: " + Arrays.asList(ans) + " | db: " + queryByIds(Arrays.asList(10, 11)));
// 占位替换方式 ans = jdbcTemplate.batchUpdate("update money set money=money + ? where id = ?", Arrays.asList(new Object[]{99, 10}, new Object[]{99, 11})); System.out.println("batch update by placeHolder ans: " + Arrays.asList(ans) + " | db: " + queryByIds(Arrays.asList(10, 11)));
// 经过 statement ans = jdbcTemplate .batchUpdate("update money set money=money + ? where id = ?", new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement preparedStatement, int i) throws SQLException { preparedStatement.setInt(1, 99); preparedStatement.setInt(2, i + 10); } @Override public int getBatchSize() { return 2; } }); System.out.println( "batch update by statement ans: " + Arrays.asList(ans) + " | db: " + queryByIds(Arrays.asList(10, 11)));
注意下上面的方法中,getBatchSize
返回实际的sql条数,setValues
中的i从0开始
原始数据中,money都是300,经过一系列的修改,输出以下
删除的操做姿式和上面基本同样,也就是sql的写法不一样罢了,所以没有太大的必要从新写一篇,下面给出一个简单的demo
@Component public class DeleteService { @Autowired private JdbcTemplate jdbcTemplate; public void delete() { int ans = jdbcTemplate.update("delete from money where id = 13"); System.out.println("delete: " + ans); } }
相关博文
尽信书则不如,以上内容,纯属一家之言,因我的能力有限,不免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激