JdbcTemplate 配置

第一種方式:
我們可以在自己定義的DAO 實現類中注入一個DataSource 引用來完 成JdbcTemplate 的實例化。也就是它是從外部“注入” DataSource 到DAO 中,然後 自己實例化JdbcTemplate,然後將DataSource 設置到JdbcTemplate 對象中。

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
<property name = "dataSource" ref="dataSource">  
</bean>  
<bean id="userService" class="com.hxzy.account.jdbcTemplate.UserServiceImpl"> 
<property name="jdbcTemplate" ref="jdbcTemplate"/> 
</bean>
public class UserServiceImpl implements UserService {   
    private JdbcTemplate jdbcTemplate;    
    public JdbcTemplate getJdbcTemplate() {  
        return jdbcTemplate;  
    }      
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {  
        this.jdbcTemplate = jdbcTemplate;  
    }   
}

第二種方式:
在 Spring 的 IoC 容器中配置一個 JdbcTemplate 的 bean,將 DataSource 注入進來,然後再把JdbcTemplate 注入到自定義DAO 中。

<bean id="userService" class="com.hxzy.account.jdbcTemplate.UserServiceImpl"> 
<property name="dataSource" ref="dataSource"/> 
</bean>
public class UserServiceImpl implements UserService {  
        private JdbcTemplate jdbcTemplate;  
        public void setDataSource(DataSource dataSource) {  
                   this.jdbcTemplate = new JdbcTemplate(dataSource);  
        }  
}

第三種方式:
Spring 提供了 org.springframework.jdbc.core.support.JdbcDaoSupport 類 , 這 個 類 中 定 義 了 JdbcTemplate 屬性,也定義了DataSource 屬性,當設置DataSource 屬性的時候,會創 建jdbcTemplate 的實例,所以我們自己編寫的DAO 只需要繼承JdbcDaoSupport 類, 然後注入DataSource 即可。提倡採用第三種方法。

<bean id="userDao" class="com.hxzy.account.jdbcTemplate.UserDaoImpl"> 
<property name="dataSource" ref="dataSource"/> 
</bean>
public class UserDaoImpl extends JdbcDaoSupport implements UserDao {  
    @Override  
    public void save(User user) {  
        this.getJdbcTemplate().update("sql");  
    }  
}
batchUpdate():適合於批量增、刪、改操作;
update():使用於增、刪、改操作;第一個參數爲執行sql 、第二個參數爲參數數據、第三個參數爲參數類型;
execute():執行一個獨立的sql語句,包括ddl語句;
queryForInt() 、queryForList()、queryForObject

GeneratedKeyHolder:獲得新建數據主鍵值;
PreparedStatement:防止SQL注入攻擊;
RowMapper:可以將數據中的每一行數據封裝成用戶定義的類

PreparedStatement是Statement的孩子,不同的是,PreparedStatement使用預編譯機制,在創建PreparedStatement對象時就需要將sql語句傳入,傳入的過程中參數要用?替代,這個過程回導致傳入的sql被進行預編譯,
然後再調用PreparedStatement的setXXX將參數設置上去,由於sql語句已經經過了預編譯,再傳入特殊值也不會起作用了。
而且PreparedStatement使用了預編譯機制(因爲預編譯語句有可能被重複調用.所以語句在被DB的編譯器編譯後的執行代碼被緩存下來,
那麼下次調用時只要是相同的預編譯語句就不需要編譯),sql語句在執行的過程中效率比Statement要高。

防止SQL注入攻擊
·直接拼接SQL語句,然後自己實現所有的轉義操作。這種方法比較麻煩,而且很可能沒有PreparedStatement做的好,造成其他更大的漏洞,不推薦。
·直接簡單暴力的過濾掉%。乾脆不讓用戶搜索%,推薦。
select* from users where username='張三'#' and password='njksad'  這條語句真正發揮作用的部分就是:select* from users where username='張三'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章