摘要:使用JDBCTemplate
?
對于一個基本的JDBC存取,Connection的取得,Statement的建立,異常處理,Statement的關閉,Connection的關閉這些流程大致在不同的數據庫技術上大致是相同的。Spring提供的JdbcTemplate類,被設計為線程安全,當中所提供的一些操作方法封裝了類似上面的流程。
?
?
●????
對于UserDAO.java的JdbcTemplate改進
?
只需要改進相應的方法就可以了,其它的程序與文件不用變動。
?
package com.kela.spring.jdbc;
?
import java.util.Iterator;
import java.util.List;
import java.util.Map;
?
import javax.sql.DataSource;
?
import org.springframework.jdbc.core.JdbcTemplate;
?
import com.kela.spring.util.Util;
?
public class Test implements IUserDAO {
???
??? private JdbcTemplate jdbcTemplate;
?
??? public void setDataSource(DataSource dataSource) {
??????? jdbcTemplate = new JdbcTemplate(dataSource);
??? }
?
??? public void insert(User user) {
??????? String name = user.getName();
??????? int age = user.getAge().intValue();
?
??????? String sql = "INSERT INTO user (name, age) VALUES ('" + name + "', " + age + ")";
??????? //
轉碼
??????? sql = Util.GBKToISO(sql);
???????
??????? jdbcTemplate.update(sql);
??? }
?
??? public User find(Integer id) {
???????
??????? String sql = "SELECT * FROM user WHERE id = " + id.intValue();
???????
??????? List rs = jdbcTemplate.queryForList(sql);
???????
??????? Iterator it = rs.iterator();
???????
??????? if(it.hasNext()) {
??????????? Map userMap = (Map)it.next();
??????????? Integer i = new Integer(userMap.get("id").toString());
??????????? String name = Util.getStr(userMap.get("name").toString());//
轉碼
??????????? Integer age? = new Integer(userMap.get("age").toString());
???????????
??????????? User user = new User();
??????????? user.setId(i);
??????????? user.setAge(age);
??????????? user.setName(name);
??????????? return user;
??????? }
??????? return null;
??? }
}
?
●????
幾種JdbcTemplate執行與更新,查詢的演示
?
A.?
使用JdbcTemplate的execute()方法執行SQL陳述。
jdbcTemploat.execute(sql);
B.?
如果是Update或insert,使用update()方法。
?
… … …
使用預編譯SQL,
public void insert(User user) {
??????? final String name = user.getName();
??????? final int age = user.getAge().intValue();
???????
??????? jdbcTemplate.update(new PreparedStatementCreator() {
?
??????????? public PreparedStatement createPreparedStatement(Connection conn) throws SQLException {
??????????????? String sql = "INSERT INTO user (name, age) VALUES (?, ?)";
??????????????? PreparedStatement ps = conn.prepareStatement(sql);
??????????????? ps.setString(1, name);
??????????????? ps.setInt(2, age);
??????????????? return ps;
??????????? }
??????? }
??????? );
??? }
?
… … …
?
public void insert(User user) {
??????? final String name = user.getName();
??????? final int age = user.getAge().intValue();
???????
??????? String sql = "INSERT INTO user (name, age) VALUES (?, ?)";
??????? jdbcTemplate.update(sql, new PreparedStatementSetter() {
?
??????????? public void setValues(PreparedStatement ps) throws SQLException {
??????????????? ps.setString(1, name);
??????????????? ps.setInt(2, age);
??????????? }
??????? });
??? }
?
… … …
?
public void insert(User user) {
??? String sql = "INSERT INTO user (name, age) VALUES (?, ?)";
??? jdbcTemplate.update(sql, new Object[] {user.getName(), user.getAge()});
}
?
… … …
?
C.?
使用JdbcTemplate進行查詢時,可是使用queryForXXX()等方法。
?
//
返回一個整型
jdbcTemplate.queryForInt(“select count
(*) from user“);
?
//
返回一個查詢后的結果對象
jdbcTemplate.queryForObject(“select name from user where id = ?”,
new Object[] {id},
java.lang.String.class);
?
//
返回多筆資料的列表
jdbcTemplate.queryForList
(“select * from user”);
?
List
中包括的事Map對象,每個Map對象代表查詢結果的一行記錄。
?