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级别记入入职。

  1. 如何获取一个表中的所有行数:

int rowCount = jdbcTemplate.queryForInt("SELECT COUNT(*) FROMERM_CHILD2");

  1. 列出每列的值:

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"));

                  }

  1. 如何进行参数绑定

intcountOfActorsNamedJoe = jdbcTemplate. queryForInt (

                          "select count(*) from ERM_CHILD2 where CHILD2_COL3 = ?", new Object[]{"2"});

  1. 查询一个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);

  1. 更新(插入/更新/删除)

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)});

  1. 其他操作
               jdbcTemplate.execute("create table mytable (id integer, name varchar(100))");
jdbcTemplate.update(
        "call SUPPORT.REFRESH_ACTORS_SUMMARY(?)", 
        new Object[]{Long.valueOf(unionId)});