Spring的配置:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
<property name="url" value="jdbc:mysql://localhost:3306/bekiz?characterEncoding=utf-8"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
需要Jar包:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
-------------------------------
Spring 提供了大量的模板类:JdbcTemplate、TransactionTemplate、JmsTemplate、JpaTemplate、HibernateTemplate等。
同时这些模板类还暴露了策略(回调)接口,一旦模板类本身的方法不能够满足客户需求,开发者可以使用策略接口,完成复杂的开发任务。
JdbcTemplate 暴露了如下回调接口:
下面的使用java.sql.Statement API:
1. ConnectionCallback :回调方法:doInConnection(Connection conn)
jt.execute(new ConnectCallback(){
public Object doInConnection(Connection conn) throws SQLException,DataAccessException{
log.info(conn.getMetaDta().getDriverName());
return null;
}
});
2. StatementCallback : 回调方法:doInStatement(Statement stat) : 开发者能够使用同一个Statement对象完成若干SQL的操作。-这个需要手工关闭 ResultSet对象。
3.ResultSetCallback : 回调方法:extractData(ResultSet rs ) :完成结果集的处理,开发者不用手工关闭ResultSet对象。内部对ResultSet进行了迭代,有如下的代码:
while(rs.next()){
Person person = new Person();
person.setName(rs.getString("name"));
personList.add(person);
}
4.RowCallbackHandler : 回调方法:processRow(ResultSet rs):在ResultSetCallback的基础上,去掉了ResultSet的迭代。
注意:Spring为RowCallbackHandler提供了一个默认实现类:RowCountCallbackHandler,可以统计出结果集的元数据信息,比如:列明、列类型、列的数量、行的数量。 这两个类都不是线程安全的,是有状态的实例!不能在多线程环境下使用!
5.RowMapper:回调方法:mapRow(ResultSet rs,int rowNum)
即不用迭代,又不用再回调接口中维护有状态信息。这个类是线程安全的!
Spring内置的RowMapper类有很多实现类:ColumnMapRowMapper(用于ResultSet含有若干列的场景)、SingleColumnRowMapper(用于ResultSet含有单列的场景)、
BeanPropertyRowMapper(会将结果集的每行取值映射成单个的对象)等等。
下面的使用java.sql.PreparedStatement API:
JdbcTemplate中暴露的使用PreparedStatment的方法,大部分含有 Object[] args参数。即这些方法的执行会采用预编译语句!
1.PreparedStatementCallback:回调方法:doInPreparedStatement(PreparedStatement pst)
2. PreparedStatementSetter 回调方法:setValues() :借助这个接口,开发者能够设置SQL中的动态参数!
3.PreparedStatementCreator:回调方法:createPreparedStatement(Connection conn):可以控制预编译语句的生成!
其他的与上面的类似。
执行RDBMS的存储过程:java.sql.CallableStatement API