摘要:使用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对象代表查询结果的一行记录。