1. 程式人生 > >ref:Spring JdbcTemplate+JdbcDaoSupport實例

ref:Spring JdbcTemplate+JdbcDaoSupport實例

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 extends
JdbcDaoSupport 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實例