配数据源过程—JdbcTemplate, DataSource
前提:配个数据源(mysql or oracle),设置到JdbcTemplate中,然后直接执行sql以及带绑定变量的sql
对于普通sql:
JdbcTemplate
- 用于create/drop
jdbcTemplate.execute("CREATE TABLE USER (user_id integer, name varchar(100))");
- 用于insert/update/delete
jdbcTemplate.update("INSERT INTO USER VALUES('123', 'bieber')");
jdbcTemplate.update("UPDATE USER SET name = ? WHERE user_id = ?", new Object[] {name, id});
- 用于select
int count = jdbcTemplate.queryForInt("SELECT COUNT(*) FROM USER"); // 条数
String name = (String) jdbcTemplate.queryForObject("SELECT name FROM USER WHERE user_id = ?", new Object[] {id}, java.lang.String.class); // 返回单个name
List rows = jdbcTemplate.queryForList("SELECT * FROM USER"); // 返回若干行
Iterator it = rows.iterator();
while(it.hasNext()) {
Map userMap = (Map) it.next(); // 可以直接强转?
System.out.print(userMap.get("user_id") + "\t");
System.out.print(userMap.get("name") + "\t");
}
- 其他
jdbcTemplate.update("INSERT INTO USER VALUES(?, ?)", new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
ps.setString(1, "123");
ps.setString(2, "bieber");
}
});
jdbcTemplate.query("SELECT * FROM USER WHERE user_id = ?", new Object[] {id}, new RowCallbackHandler(){
public void processRow(ResultSet rs) throws SQLException {
User user = new User();
user.setId(rs.getString("user_id"));
user.setName(rs.getString("name"));
}
});
List list = jdbcTemplate.query(sql, new RowMapperResultReader(new UserRowMapper()));
return (User)list.get(0);
class UserRowMapper implements RowMapper {
public Object mapRow(ResultSet rs, int index) throws SQLException {
User user = new User();
user.setId(rs.getString("user_id"));
user.setName(rs.getString("name"));
return user;
}
}
JdbcTemplate将我们使用的JDBC的流程封装起来,包括了异常的捕捉、SQL的执行、查询结果的转换等等。spring大量使用Template Method模式来封装固定流程的动作,XXXTemplate等类别都是基于这种方式的实现。
除了大量使用Template Method来封装一些底层的操作细节,spring也大量使用callback方式类回调相关类别的方法以提供JDBC相关类别的功能,使传统的JDBC的使用者也能清楚了解spring所提供的相关封装类别方法的使用。
更多方法:http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/jdbc/core/JdbcTemplate.html
对于绑定变量的sql:
- JdbcTemplate
String insert = "insert into myTable (id, email, password) values (null, ?, ?)";
jdbcTemplate.update(insert, new Object[] {"happybabyme@gmail.com", "lalalalala"});
无论是按照Object[]或PreparedStatementSetter的方式,参数个数都必须预先知道,顺序也不可变换。如此一来,如果要调整一下sql语句,那么相应的参数顺序都必须进行相应调整。
- NamedParameterJdbcTemplate
String insert = "insert into myTable (id, email, password) values (null, :email, :password)";
Map<String, String> map = new HashMap<String, String>;
map.put("email", "happybabyme@gmail.com");
map.put("password", "lalalalala");
jdbcTemplate.update(insert, map);