具名參數:
具名參數: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>
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 }