Spring JdbcTemplate实例
JDBCTemplate:是经典的也是最常用的Spring对于JDBC访问的方案。这也是最低级别的封装,其他的工作模式事实了在底层使用了JdbcTemplate作为其底层的实现基础。
Spring Framework的JDBC抽象框架由四个包构成:core,dataSource,ovject and support。org.springframework.jdbc.core包由JdbcTemplate类以及相关的回调接口(callback interface)和类组成。
org.springframework.jdbc.datasource包提供了一些工具类来简化对DataSource的访问。同时提供了多种简单的DataSource实现。这些实现可以脱离J2EE容器进行独立测试和运行。这些工具类提供了一些静态方法,允许你通过JDNI来获取数据库连接和关闭连接。同时支持绑定到当前线程的数据库连接,例如使用DataSourceTransactionManager。
org.springframework.jdbc.object包包含了一些类,用于将RDBMS查询,更新以及存储过程表述为一些可重用的,线程安全的对象,这种方式通过JDO进行模型化,不过这些通过查询返回的对象是与数据库脱离的对象,这种对于JDBC的高层次的封装是基于org.springframework.jdbc.core包对JDBC的低层次封装之上的。
org.springframework.jdbc.support包定义了SQLException转化类以及一些其他的工具类。
在JDBC调用过程中所抛出的异常都会被转化为在org.springframework.dao包中定义的异常。也就是说,凡是使用Spring的JDBC封装层的代码无需实现任何JDBC或者RDBMS相关的异常处理,所有的这些被转化的异常都是unchecked异常,因而也给了你一种额外的选择,就是可以抓住这些异常,从而转化成其他类型的异常被允许调用者传播。
JdbcTemplate是core包的核心类。它替我们完成了资源的创建以及释放工作,从而简化了我们对JDBC的使用。它还可以帮助我们避免一些常见的错误,比如忘记关闭数据库连接。JdbcTemplate将完成JDBC核心处理流程,比如SQL语句的创建,执行,而把SQL语句的生成以及查询结果的提取工作留给我们的应用代码。它可以完成SQL查询,更新以及调用存储过程,可以对ResultSet进行遍历并加以提取。它还可以捕获JDBC异常并将其转换成org.springframework.dao包中定义的,通用的,信息更丰富的异常。
使用JdbcTemplate进行编码只需要根据明确定义的一组契约来实现回调接口。PreparedStatementCreator回调接口通过给定的Connection创建一个PreparedStatement,包含SQL和任何相关的参数。CallableStatementCreateor实现同样的处理,只不过它创建的是CallableStatement。RowCallbackHandler接口则从数据集的每一行中提取值。我们可以在DAO实现类中通过传递一个DataSource引用来完成JdbcTemplate的实例化,也可以在Spring的IOC容器中配置一个JdbcTemplate的bean并赋予DAO实现类作为一个实例,需要注意的是DataSource在Spring的IOC容器中总是配成一个bean,第一种情况下,DataSource bean将传递给service,第二种情况下DataSource bean 传递给JdbcTemplate bean。
最后JdbcTemplate中使用的所有SQL将会以DEBUG级别记入入职。
- 如何获取一个表中的所有行数:
int rowCount = jdbcTemplate.queryForInt("SELECT COUNT(*) FROMERM_CHILD2");
- 列出每列的值:
Stringsql = "SELECT * FROM ERM_CHILD1";
List<Map<String,Object>> rows = jdbcTemplate.queryForList(sql);
for (Map row : rows) {
System.out.println(row.get("CHILD1_COL1"));
System.out.println(row.get("CHILD1_COL2"));
System.out.println(row.get("CHILD1_COL3"));
System.out.println(row.get("CHILD1_COL4"));
}
- 如何进行参数绑定
intcountOfActorsNamedJoe = jdbcTemplate. queryForInt (
"select count(*) from ERM_CHILD2 where CHILD2_COL3 = ?", new Object[]{"2"});
- 查询一个String
Map<String,Object> results =
jdbcTemplate.queryForMap(
"selectCHILD2_COL1,CHILD2_COL2 from ERM_CHILD2 where CHILD2_COL1 = ? "
,new Object[]{new BigDecimal(501)});
String column1 = (String)jdbcTemplate.queryForObject("selectCHILD2_COL2 from ERM_CHILD2 where CHILD2_COL1 = ?", new Object[]{newBigDecimal(501)}, String.class);
- 更新(插入/更新/删除)
jdbcTemplate.update(
"insertinto ERM_CHILD1 (CHILD1_COL1,CHILD1_COL2,CHILD1_COL3,CHILD1_COL4) values(?,?,?,?)",
new Object[] {999, "1","2","3"});
int rows = jdbcTemplate.update(
"UPDATEERM_CHILD1 SET CHILD1_COL1 = ? WHERE CHILD1_COL1 = ?",
new Object[] {“444”,new BigDecimal(999)});
int rows = jdbcTemplate.update(
"DELETEFROM ERM_CHILD1 WHERE CHILD1_COL1 =?",
new Object[] {new BigDecimal(999)});
- 其他操作
jdbcTemplate.execute("create table mytable (id integer, name varchar(100))");
jdbcTemplate.update(
"call SUPPORT.REFRESH_ACTORS_SUMMARY(?)",
new Object[]{Long.valueOf(unionId)});