一、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-hant/n/306501.html
微信掃一掃
支付寶掃一掃