ref:Spring JdbcTemplate+JdbcDaoSupport實例
阿新 • • 發佈:2018-09-13
lis 符號表 xsd div sim array htm arr 自己
ref:https://www.yiibai.com/spring/spring-jdbctemplate-jdbcdaosupport-examples.html
在Spring JDBC開發中,可以使用 JdbcTemplate 和 JdbcDaoSupport 類來簡化整個數據庫的操作過程。 在本教程中,我們將重復上一篇文章 Spring+JDBC例子,看之前(無JdbcTemplate支持)和之後(含JdbcTemplate的支持)之間不同的例子。1. 不使用JdbcTemplate示例:如果不用JdbcTemplate,必須創建大量的冗余代碼(創建連接,關閉連接,處理異常)中的所有DAO數據庫的操作方法 - 插入,更新和刪除。它的效率並不是很高,容易出錯和乏味。
conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, customer.getCustId());
2. 使用JdbcTemplate示例:使用JdbcTemplate可節省大量的冗余代碼,因為JdbcTemplate類會自動處理它。
private DataSource dataSource; private JdbcTemplate jdbcTemplate; public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public void insert(Customer customer){ String sql = "INSERT INTO CUSTOMER " + "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)"; jdbcTemplate = new JdbcTemplate(dataSource); jdbcTemplate.update看看有什麽不同?(sql, new Object[] { customer.getCustId(), customer.getName(),customer.getAge() }); }
3. 使用JdbcDaoSupport示例通過擴展 JdbcDaoSupport,設置數據源,並且 JdbcTemplate 在你的類中不再是必需的,只需要正確的數據源註入JdbcCustomerDAO。可以使用 getJdbcTemplate()方法得到 JdbcTemplate。
customerDAO類函數:
public class JdbcCustomerDAO extendsJdbcDaoSupport implements CustomerDAO { //no need to set datasource here public void insert(Customer customer){ String sql = "INSERT INTO CUSTOMER " + "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
customer.setName("test‘,2);show databases;#");//無法註入!spring自動將‘進行轉義。即使為test\‘,2)也無法註入。
getJdbcTemplate().update(sql, new Object[] { customer.getCustId(),customer.getName(),customer.getAge() }); }//此處將
4.相應的xml文件設置dataSource/customerDAO
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/yiibaijava" /> <property name="username" value="root" /> <property name="password" value="password" /> </bean> </beans> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="customerDAO" class="com.yiibai.customer.dao.impl.JdbcCustomerDAO"> <property name="dataSource" ref="dataSource" /> </bean> </beans>註: 在Spring JDBC開發,它總是建議使用 JdbcTemplate和JdbcDaoSupport,而不使用自己的JDBC編程代碼。同時,從安全的角度看也防止了sql註入。 5.查詢單列
public String findCustomerNameById(int custId){ String sql = "SELECT NAME FROM CUSTOMER WHERE CUST_ID = ?"; String name = (String)getJdbcTemplate().queryForObject( sql, new Object[] { custId }, String.class); return name; }//此處查詢條件為int custID,顯然php中整數型註入無法應用。
字符串查詢情況:
public Customer findByCustomerName(String name){ String sql = "SELECT * FROM CUSTOMER WHERE NAME = ?"; name="name1‘;show databases;#";//spring直接轉義‘name1\‘;show databases;#‘。無法註入! Customer customer = (Customer)getJdbcTemplate().queryForObject( sql, new Object[] { name }, new CustomerRowMapper()); return customer; }
與php不同,java中對象為強類型,int無法註入,而字符串又直接轉義,避免了註入的可能性。
6.查詢多列,利用RowMapper。public Customer findByCustomerId(int custId){ String sql = "SELECT * FROM CUSTOMER WHERE CUST_ID = ?"; Customer customer = (Customer)getJdbcTemplate().queryForObject( sql, new Object[] { custId }, new CustomerRowMapper()); return customer; } public class CustomerRowMapper implements RowMapper { public Object mapRow(ResultSet rs, int rowNum) throws SQLException { Customer customer = new Customer(); customer.setCustId(rs.getInt("CUST_ID")); customer.setName(rs.getString("NAME")); customer.setAge(rs.getInt("AGE")); return customer; } }
7.Spring SimpleJdbcTemplate類命名參數 在JdbcTemplate,這些SQL參數通過一個特殊的占位符“?”符號表示,並通過位置綁定。現在的問題是,每當參數的順序發生了變化,你必須也要改變參數綁定,這是容易出錯,繁瑣的維護。
為了解決這個問題,可以使用“命名參數”,SQL參數是由一個冒號開始後續定義的名稱,而不是位置。在另外的,命名參數只是在SimpleJdbcTemplate類和NamedParameterJdbcTemplate支持。
例子向您展示如何使用命名參數在一個 INSERT 語句。 //insert with named parameter public void insertNamedParameter(Customer customer){ String sql = "INSERT INTO CUSTOMER " + "(CUST_ID, NAME, AGE) VALUES (:custId, :name, :age)"; Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("custId", customer.getCustId()); parameters.put("name", customer.getName()); parameters.put("age", customer.getAge()); getSimpleJdbcTemplate().update(sql, parameters); } 示例 2 例子來說明如何使用命名參數在批處理操作語句。 public void insertBatchNamedParameter(final List<Customer> customers){ String sql = "INSERT INTO CUSTOMER " + "(CUST_ID, NAME, AGE) VALUES (:custId, :name, :age)"; List<SqlParameterSource> parameters = new ArrayList<SqlParameterSource>(); for (Customer cust : customers) { parameters.add(new BeanPropertySqlParameterSource(cust)); } getSimpleJdbcTemplate().batchUpdate(sql, parameters.toArray(new SqlParameterSource[0])); }View Code
ref:Spring JdbcTemplate+JdbcDaoSupport實例