網頁

2020/3/28

Spring JDBC JdbcTemplate 與 NamedParameterJdbcTemplate 差別

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)的應用。



參考:

沒有留言:

張貼留言