第一種方式:
我們可以在自己定義的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='張三'