Spring 具名參數NamedParameterJdbcTemplate


具名參數:

具名參數:SQL 按名稱(以冒號開頭)而不是按位置進行指定. 具名參數更易於維護, 也提升了可讀性. 具名參數由框架類在運行時用占位符取代

我們之前一直是用JDBCTemplate  進行Sql語句的 拼寫 , 但是 當 一個行中有 多個 占位符時,很容易 搞混哪個值 是 哪個值。 那我們可以使用具名參數。

如何使用具名參數?

1. 在 xml 文件中加入對具名參數的支持

注意具名參數只能 使用 constructor-arg  並且必須對 dataSource 賦值

<!-- 具名參數 必須要有參數的構造器   沒有無參的 -->
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg name="dataSource" ref="DataSource"></constructor-arg>
</bean>
applicationContext.xml

2. 在Java 類中引入 具名參數

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.EmptySqlParameterSource;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.stereotype.Repository;

import com.myth.springJDBC.exception.AddFailedException;
import com.myth.springJDBC.po.Employee;

@Repository
public class EmployeeDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    @Autowired
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
    
    private String sql;
    
  //這個使用的 是 傳統的 JdbcTemplate
public Employee getEmployee(int id) { sql = "Select * from employees where id = ?"; RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<Employee>(Employee.class); Employee employee = jdbcTemplate.queryForObject(sql, rowMapper,id); return employee; } //引入一個 空 的Map EmptySqlParameterSource.INSTANCE public Integer getCount() { sql = "select count(*) from employees"; int result = namedParameterJdbcTemplate.queryForObject(sql, EmptySqlParameterSource.INSTANCE, Integer.class); return result; } /*這里也可以使用BeanPropertySqlParameterSource
* 這個意思就是把Map 轉換為對象 來對待
*/
public void insertEmployee(Employee employee) { sql = "INSERT INTO employees values (:ID,:ln,:email,:departID)"; Map<String, Object> paramMap = new HashMap<>(); paramMap.put("ID", employee.getId()); paramMap.put("ln", employee.getLast_name()); paramMap.put("email", employee.getEmail()); paramMap.put("departID", employee.getDept_id()); try { namedParameterJdbcTemplate.update(sql, paramMap); System.out.println("添加成功"); } catch (Exception e) { throw new AddFailedException("添加失敗"); } }    //要注意具名參數要和Bean中的屬性值要一致。
   public void updateEmployee(Employee employee) {
      sql = "UPDATE employees set LAST_NAME =:last_name,EMAIL=:email,DEPT_ID =:dept_id WHERE ID = :id";
      SqlParameterSource paramSource = new BeanPropertySqlParameterSource(employee);
      try {
       namedParameterJdbcTemplate.update(sql, paramSource);
       System.out.println("修改成功");
      } catch (Exception e) {
       System.out.println(e.toString());
       throw new AddFailedException("修改失敗");
      }
     }    
/* 這樣子 會報錯 * public void deleteEmployee(int id) { sql = "DELETE FROM EMPLOYEES WHERE ID = :ID"; Map<String, Object> paramMap = new HashMap<>(); paramMap.put("ID", id); try { namedParameterJdbcTemplate.update(sql, paramMap); System.out.println("刪除成功"); } catch (Exception e) { throw new AddFailedException("刪除失敗"); } }*/ //必須傳入Employee 只傳入int id 會報錯 public void deleteEmployee(Employee employee) { sql = "DELETE FROM EMPLOYEES WHERE ID = :ID"; Map<String, Object> paramMap = new HashMap<>(); paramMap.put("ID", employee.getId()); try { namedParameterJdbcTemplate.update(sql, paramMap); System.out.println("刪除成功"); } catch (Exception e) { throw new AddFailedException("刪除失敗"); } } }

3.然后寫Junit Test 類

 1 package com.myth.springJDBC;
 2 
 3 
 4 import org.junit.Test;
 5 import org.junit.runner.RunWith;
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.test.context.ContextConfiguration;
 8 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 9 
10 import com.myth.springJDBC.dao.EmployeeDao;
11 import com.myth.springJDBC.po.Employee;
12 @RunWith(SpringJUnit4ClassRunner.class)
13 @ContextConfiguration(locations="classpath:applicationContext.xml")
14 public class TestJDBC {
15     @Autowired
16     private EmployeeDao employeeDao; 
17     
18     @Test
19     public void testQuery() {
20         System.out.println(employeeDao.getEmployee(12));
21     }
22 
23     @Test
24     public void testInsert() {
25         Employee employee = new Employee();
26         employee.setId(12);
27         employee.setLast_name("FF");
28         employee.setEmail("FF@email.com");
29         employee.setDept_id(4);
30         
31         employeeDao.insertEmployee(employee);
32     }
33     
34     @Test
35     public void testUpdate() {
36         Employee employee = new Employee();
37         employee.setId(12);
38         employee.setLast_name("FFF");
39         employee.setEmail("FF@email.com");
40         employee.setDept_id(4);
41         
42         employeeDao.updateEmployee(employee);
43     }
44     
45     @Test
46     public void testDelete() {
47         Employee employee = new Employee();
48         employee.setId(12);
49         employeeDao.deleteEmployee(employee);
50     }
51     
52     @Test
53     public void testGetCount() {
54         System.out.println(employeeDao.getCount());
55     }
56 }
Junit

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM