配数据源过程—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);

posted @ 2012-11-30 13:31  技术草根女  Views(3495)  Comments(0Edit  收藏  举报