日期:2014-05-16  浏览次数:20428 次

Spring笔记6---JDBC的集成

一. 无论采用何种持久化技术,JDBC始终都是它们的支撑件,如果没有底层的JDBC,ORM是没有办法操控RDBMS的。

??Spring 对 JDBC的集成主要包含了:

??1.提供各种模板类,简化了对RDBMS的CRUD操作,这些模板包括 ? ? ? ? ? ? ? ? ? ?

?? ? JdbcTemplate,NamedParameterJdbcTemplate,SimpleJdbcTemplate等等。这些模板类都是线程安全的,即在多线程环境中能始终保持一致的行为,尤其是Web环境。

?

??2.提供了各种DaoSupport辅助类,进一步简化了模板类的使用。?比如

?? ? JdbcDaoSupport,NamedParameterJdbcDaoSupport,SimpleJdbcDaoSupport。

?

??3.提供了SimpleJdbcInsert和SimpleJdbcCall辅助类。

?

??4.提供了各种数据源类,借助DI容器实现了DataSource的灵活配置。

?

??5.提供了更多高级辅助类,比如:

?? ? ?将JDBC CRUD操作建模成JAVA对象、LOB处理、操控存储过程、大批量数据处理、获得和生成主键等。

?

二. JdbcTemplate是JDBC集成的核心类,简化了JDBC API的使用。

?

1. 不用重新写调用java.sql.Connection对象的语句。

?

?

jdbcTemplate.execute(new ConnectionCallback(){
   public Object doInConnectin(Connection con) throws SQLException,DataAccessException{
      log.info(con.getMetaData().getDriverName);
      return null;
  }
});

?? ?*Spring 自身会从数据源中获得一Connection对象,并传入到doInConnection回调方法中。

?

2. 有若干方法用于执行静态SQL语句,即使用java.sql.Statement API.

?

?

..... execute(....) throws ....
..... query(.....) throws .....
..... queryForObject (.....) throws .....
..... queryForList (.....) throws .....
..... queryForMap (.....) throws .....
..... queryForRowSet (.....) throws .....
int  update (.....) throws .....
int[]  batchUpdate (.....) throws .....

?? *结果集处理接口:ResultSetExtractor,RowCallbackHandler,RowMapper(线程安全,用的最多,包含许多子集,例如ColumnMapRowMapper,BeanPropertyRowMapper).

?

3. 有若干方法用于执行动态sql语句,即使用java.sql.PrepareStatement API.

?

?

..... execute(....) throws ....
..... query(.....) throws .....
..... queryForObject (.....) throws .....
..... queryForList (.....) throws .....
..... queryForMap (.....) throws .....
..... queryForRowSet (.....) throws .....
int  update (.....) throws .....
int[]  batchUpdate (.....) throws .....
?

?*大多方法都含有Object[] args参数,即这些方法都会采用预编译语句,执行效率更高。Hibernate就大量采用了预编译语句。

?

4. 有若干方法用于执行RDBMS的存储操作,即使用java.sql.CallableStatement API.

?

?

..... execute(....) throws ....
Map call(CallablestatementCreator csc,List declaredParameters) throws DataAccessException;
?

三. JdbcDaoSupport是建立在JdbcTemplate基础上的支持类,其辅助类会自动创建相应模板类。

?

?? ?在使用JdbcDaoSupportImpl实现类之前,需要配置示例如下:

?

?

<bean id="jdbcDaoSupport" class="org.springframework.samples.JdbcDaoSupportImpl">
<property name="dataSource" ref="dataSource"/>
<bean>

?

?? ?或者直接提供一个JdbcTemplate给JdbcDaoSupportImpl,如下配置:

?

?

<bean id="jdbcDaoSupport" class="org.springframework.samples.JdbcDaoSupportImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
<bean>
?

四. SimpleJdbcDaoSupport及NamedParameterJdbcDaoSupport;NamedParameterJdbcTemplate及 ? ? SimpleJdbcTemplate的相应支持类。

?

?例如:SimpleJdbcInsert和SimpleJdbcCall支持辅助类,前者用于操作表,后者用于操作存储过程或函数,它们的某些功能比SimpleJdbcTemplate更为强大,而且都是线程安全的。

?

*.SimpleJdbcInsert的usingGeneratedKeyColumns()能自动生成主键id,例子如下:

?

?

ownerInsert = new SimpleJdbcInsert(dataSource).withTableName("owner").usingGeneratedKeyColumns("id");

param = new HashMap<String,Object>();
param.put("fistname","Nedd");
param.put("lastname","Want");

log.info(ownerInsert.executeAndReturnKey(param));

?

五.内置的DataSource继承。

?

1.基于测试目的DriverManagerDataSource,SimpleDriverDataSource和SingleConnectionDataSource.

?