一、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 List findAll() { 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 List findAll() { 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<Map> rows = jdbcTemplate.queryForList(sql); for (Map row : rows) { System.out.println(row.get("id") + " " + row.get("name") + " " + row.get("email")); }
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資料庫操作工具,使用它進行數據操作可以提高開發效率,減少冗餘代碼的產生。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/306501.html