7.5 集成Spring JDBC及最佳实践
大多数情况下Spring JDBC都是与IOC容器一起使用。通过配置方式使用Spring JDBC。
而且大部分时间都是使用JdbcTemplate类(或SimpleJdbcTemplate和NamedParameterJdbcTemplate)进行开发,即可能80%时间使用JdbcTemplate类,而只有20%时间使用其他类开发,符合80/20法则。
Spring JDBC通过实现DaoSupport来支持一致的数据库访问。
Spring JDBC提供如下DaoSupport实现:
- JdbcDaoSupport:用于支持一致的JdbcTemplate访问;
- NamedParameterJdbcDaoSupport:继承JdbcDaoSupport,同时提供NamedParameterJdbcTemplate访问;
- SimpleJdbcDaoSupport:继承JdbcDaoSupport,同时提供SimpleJdbcTemplate访问。
由于JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate类使用DataSourceUtils获取及释放连接,而且连接是与线程绑定的,因此这些JDBC模板类是线程安全的,即JdbcTemplate对象可以在多线程中重用。
接下来看一下Spring JDBC框架的最佳实践:
1)首先定义Dao接口
2)定义Dao实现,此处是使用Spring JDBC实现:
package cn.javass.spring.chapter7.dao.jdbc; import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport; import cn.javass.spring.chapter7.UserModel; import cn.javass.spring.chapter7.dao.IUserDao; public class UserJdbcDaoImpl extends SimpleJdbcDaoSupport implements IUserDao { private static final String INSERT_SQL = "insert into test(name) values(:myName)"; private static final String COUNT_ALL_SQL = "select count(*) from test"; @Override public void save(UserModel model) { getSimpleJdbcTemplate().update(INSERT_SQL, new BeanPropertySqlParameterSource(model)); } @Override public int countAll() { return getJdbcTemplate().queryForInt(COUNT_ALL_SQL); } }
此处注意首先Spring JDBC实现放在dao.jdbc包里,如果有hibernate实现就放在dao.hibernate包里;其次实现类命名如UserJdbcDaoImpl,即×××JdbcDaoImpl,当然如果自己有更好的命名规范可以遵循自己的,此处只是提个建议。
3)进行资源配置(resources/chapter7/applicationContext-resources.xml):
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:chapter7/resources.properties</value> </list> </property> </bean>
PropertyPlaceholderConfigurer用于替换配置元数据,如本示例中将对bean定义中的${…}占位符资源用“classpath:chapter7/resources.properties”中相应的元素替换。
<bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy"> <property name="targetDataSource"> <bean class="org.logicalcobwebs.proxool.ProxoolDataSource"> <property name="driver" value="${db.driver.class}" /> <property name="driverUrl" value="${db.url}" /> <property name="user" value="${db.username}" /> <property name="password" value="${db.password}" /> <property name="maximumConnectionCount" value="${proxool.maxConnCount}" /> <property name="minimumConnectionCount" value="${proxool.minConnCount}" /> <prop