一、JdbcTemplate使用方法
JdbcTemplate是Spring Framework 提供的一个基于JDBC的核心库,提供了简洁的Java数据库操作方式,同时也支持ORM框架集成如Hibernate、MyBatis等。
JdbcTemplate的使用非常简单,首先需要将数据源注入到JdbcTemplate中,如下:
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" > <constructor-arg ref="dataSource"> </bean>
然后就可以通过调用JdbcTemplate的方法来进行相关操作了,下面是一个查询操作的示例:
public ListfindAll() { String sql = "SELECT * FROM users"; List users = jdbcTemplate.query(sql, new RowMapper () { public User mapRow(ResultSet rs, int rowNum) throws SQLException { User user = new User(); user.setId(rs.getLong("id")); user.setName(rs.getString("name")); user.setEmail(rs.getString("email")); return user; } }); return users; }
上述代码中,调用了JdbcTemplate的query方法,传入了SQL语句和RowMapper对象。
二、JdbcTemplate使用问题
进行JdbcTemplate开发时,常见的问题有以下:
1、JdbcTemplate方法中异常返回问题
JdbcTemplate的方法中异常返回问题,常见原因是因为JdbcTemplate方法本身不抛出异常而是返回null或者空的集合,在方法中需要自行处理异常。
一个查询操作示例:
public ListfindAll() { try { String sql = "SELECT * FROM users"; List users = jdbcTemplate.query(sql, new RowMapper () { public User mapRow(ResultSet rs, int rowNum) throws SQLException { User user = new User(); user.setId(rs.getLong("id")); user.setName(rs.getString("name")); user.setEmail(rs.getString("email")); return user; } }); return users; } catch (Exception e) { logger.error("findAll exception", e); throw new RuntimeException("findAll exception", e); } }
2、JdbcTemplate参数类型处理问题
JdbcTemplate在绑定参数时,需要注意传参的类型问题。例如,传入NULL或空字符串时需要指定参数的类型:
String sql = "UPDATE users SET name=? WHERE id=?"; jdbcTemplate.update(sql, new Object[]{null, 101}, new int[]{Types.VARCHAR, Types.INTEGER});
三、JdbcTemplate使用事务
JdbcTemplate事务的使用和Spring事务的使用类似,使用TransactionTemplate对象来实现事务管理。需要指定事务的传播行为、隔离级别等,例如:
DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); def.setIsolationLevel(TransactionDefinition.ISOLATION_DEFAULT); TransactionStatus status = transactionManager.getTransaction(def); try { // 执行JdbcTemplate的操作 transactionManager.commit(status); } catch (Exception ex) { transactionManager.rollback(status); throw ex; }
四、JdbcTemplate使用了什么设计模式
JdbcTemplate使用了模板方法模式,将模板方法定义在JdbcTemplate类中,供用户实现具体方法,如query、update、batchUpdate等。用户只需要实现相关的回调方法,就可以完成数据访问的操作。这样可以将大量的模板代码集中在一起,使代码更简洁清晰。
五、JdbcTemplate增删改查
使用JdbcTemplate进行增删改查的操作非常简单,示例如下:
1、查询操作
String sql = "SELECT * FROM users WHERE id=?"; User user = jdbcTemplate.queryForObject(sql, new Object[]{1}, (ResultSet rs, int rowNum) -> { User u = new User(); u.setId(rs.getLong("id")); u.setName(rs.getString("name")); u.setEmail(rs.getString("email")); return u; });
2、插入操作
String sql = "INSERT INTO users(name, email) VALUES(?,?)"; jdbcTemplate.update(sql, new Object[]{"Jack", "jack@abc.com"});
3、删除操作
String sql = "DELETE FROM users WHERE id=?"; jdbcTemplate.update(sql, new Object[]{1});
六、JdbcTemplate方法
除了常见的query、update、batchUpdate方法外,JdbcTemplate还提供了一些其他常用的方法,例如:
1、execute方法
execute方法可以用于执行任何带参数的SQL语句,可以返回一些随机对象,如下:
String sql = "DELETE FROM users WHERE id=?"; jdbcTemplate.execute(sql, new AbstractLobCreatingPreparedStatementCallback(lobHandler) { protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException { lobCreator.setBlobAsBytes(ps, 1, new byte[0]); ps.setInt(2, 1); } });
2、queryForList方法
执行SQL查询后将结果转换成List,每个结果直接对应于Map中的一个项目:
String sql = "SELECT id, name, email FROM users"; List
3、queryForObject方法
查询单个结果,例如获取用户的姓名:
String sql = "SELECT name FROM users WHERE id=?"; String name = jdbcTemplate.queryForObject(sql, new Object[]{1}, String.class); System.out.println("name=" + name);
七、JdbcTemplate找不到
在使用JdbcTemplate时,可能会出现找不到JdbcTemplate类的问题。这通常是因为没有在pom.xml文件中引入Spring JDBC相关依赖或者版本冲突导致的。
正确的依赖应该类似如下:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.9</version> </dependency> ... </dependencies>
八、JdbcTemplate批量insert
批量插入数据时,可以使用JdbcTemplate的batchUpdate方法,只需要把多组数据放在二维数组中即可:
String sql = "INSERT INTO users(name,email) VALUES (?, ?)"; List
九、JdbcTemplate常用方法
除了常用的query、update、batchUpdate方法外,JdbcTemplate还提供了以下常用的方法。
1、queryForRowSet方法
执行SQL查询并将结果放入SqlRowSet中,每个结果直接对应于SqlRowSet中的一个项目:
String sql = "SELECT id, name FROM users"; SqlRowSet rs = jdbcTemplate.queryForRowSet(sql); while (rs.next()) { long id = rs.getLong("id"); String name = rs.getString("name"); System.out.println(id + " " + name); }
2、update方法
使用update方法可以执行任何不返回结果集的SQL语句,例如删除、修改等:
String sql = "DELETE FROM users WHERE name=?"; jdbcTemplate.update(sql, new Object[]{"jack"});
3、batchUpdate方法
批量执行SQL语句,例如批量插入、修改等:
String sql = "INSERT INTO users(name, email) VALUES (?, ?)"; List
4、execute方法
用于执行任意类型的SQL语句,例如插入二进制数据到数据库:
String sql = "INSERT INTO users(id, name) VALUES (?, ?)"; final byte[] bytes = new byte[1024]; Random random = new Random(); random.nextBytes(bytes); jdbcTemplate.execute(sql, new AbstractLobCreatingPreparedStatementCallback(lobHandler) { @Override protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException { ps.setInt(1, 1); lobCreator.setBlobAsBytes(ps, 2, bytes); } });
总结
本文介绍了JdbcTemplate的使用方法、常用操作、事务管理以及常见问题。JdbcTemplate是一个非常简单实用的Java数据库操作工具,使用它进行数据操作可以提高开发效率,减少冗余代码的产生。