Spring JDBC在存取資料庫時除了用典型的JdbcTemplate
存取,也可用NamedParameterJdbcTemplate
存取,兩者的差別如下。
JdbcTemplate
在代入SQL的參數時,是以佔位符?
出現的先後順序來代入參數,參數為Object[]
的形式,使用上較不直覺且麻煩,尤其是修改SQL參數順序的時候也要同時修改Object[]
的順序。
NamedParameterJdbcTemplate
則可用名稱:param
作為佔位符來代入參數,不用依照順序只要參數名稱符合即可,使用上比較方便。
以查詢EMPLOYEE
資料表為例如下。
package com.abc.demo.dao;
import com.abc.demo.entity.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class DemoDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
// JdbcTemplate
public List<Employee> getEmployeeListByJdbcTemplate(Integer age) {
String sql = "SELECT * FROM EMPLOYEE WHERE AGE >= ?";
Object[] params = new Object[]{age};
List<Employee> employeeList =
jdbcTemplate.query(sql, params, (rs, rowNum) -> {
Employee employee = new Employee();
employee.setId(rs.getLong("ID"));
employee.setName(rs.getString("NAME"));
employee.setAge(rs.getInt("AGE"));
return employee;
});
return employeeList;
}
// 使用NamedParameterJdbcTemplate
public List<Employee> getEmployeeListByNamedParameterJdbcTemplate(Integer age) {
String sql = "SELECT * FROM EMPLOYEE WHERE AGE >= :age";
MapSqlParameterSource params =
new MapSqlParameterSource()
.addValue("age", age);
List<Employee> employeeList =
namedParameterJdbcTemplate.query(sql, params, (rs, rowNum) -> {
Employee employee = new Employee();
employee.setId(rs.getLong("ID"));
employee.setName(rs.getString("NAME"));
employee.setAge(rs.getInt("AGE"));
return employee;
});
return employeeList;
}
}
從上面例子可看出在代入查詢條件AGE
的參數時,NamedParameterJdbcTemplate
是以:age
來代入對應的名稱參數。
NamedParameterJdbcTemplate
其實是對JdbcTemplate
做包裝,實際上資料庫操作仍是交由JdbcTemplate
進行,是典型的轉接器模式(Adapter Pattern)的應用。
參考:
沒有留言:
張貼留言