首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

【第七章】 对JDBC的支持 之 7.5 集成Spring JDBC及最佳实践 ——跟小弟我学spring3

2012-06-26 
【第七章】 对JDBC的支持 之 7.5 集成Spring JDBC及最佳实践 ——跟我学spring37.5 集成Spring JDBC及最佳实践

【第七章】 对JDBC的支持 之 7.5 集成Spring JDBC及最佳实践 ——跟我学spring3

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接口

?

java代码:
package cn.javass.spring.chapter7.dao;import cn.javass.spring.chapter7.UserModel;public interface IUserDao {    public void save(UserModel model);    public int countAll();}

?

2)定义Dao实现,此处是使用Spring JDBC实现:

?

java代码:
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):

?

java代码:
<bean style="font-weight: bold; font-size: medium;">java代码:
<bean id="dataSource" 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}" />          <property name="statistics" value="${proxool.statistics}" />          <property name="simultaneousBuildThrottle"                   value="${proxool.simultaneousBuildThrottle}" />          <property name="trace" value="${proxool.trace}" />      </bean>    </property></bean>

?????? dataSource定义数据源,本示例使用proxool数据库连接池,并使用LazyConnectionDataSourceProxy包装它,从而延迟获取数据库连接;${db.driver.class}将被“classpath:chapter7/resources.properties”中的“db.driver.class”元素属性值替换。

?????? proxool数据库连接池:本示例使用proxool-0.9.1版本,请到proxool官网下载并添加proxool-0.9.1.jar和proxool-cglib.jar到类路径。

?????? ProxoolDataSource属性含义如下:

driver:指定数据库驱动;driverUrl:数据库连接;username:用户名;password:密码;maximumConnectionCount:连接池最大连接数量;minimumConnectionCount:连接池最小连接数量;statistics:连接池使用样本状况统计;如1m,15m,1h,1d表示没1分钟、15分钟、1小时及1天进行一次样本统计;simultaneousBuildThrottle:一次可以创建连接的最大数量;trace:true表示被执行的每个sql都将被记录(DEBUG级别时被打印到相应的日志文件);

?

4)定义资源文件(classpath:chapter7/resources.properties):

?

java代码:
proxool.maxConnCount=10proxool.minConnCount=5proxool.statistics=1m,15m,1h,1dproxool.simultaneousBuildThrottle=30proxool.trace=falsedb.driver.class=org.hsqldb.jdbcDriverdb.url=jdbc:hsqldb:mem:testdb.username=sadb.password= 

?

?????? 用于替换配置元数据中相应的占位符数据,如${db.driver.class}将被替换为“org.hsqldb.jdbcDriver”。

?

?

5)dao定义配置(chapter7/applicationContext-jdbc.xml):

?

java代码:
<bean id="abstractDao" abstract="true">    <property name="dataSource" ref="dataSource"/></bean>   <bean id="userDao"     style="font-weight: bold; font-size: medium;">java代码:
@Testpublic void testBestPractice() {    String[] configLocations = new String[] {            "classpath:chapter7/applicationContext-resources.xml",            "classpath:chapter7/applicationContext-jdbc.xml"};    ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations);    IUserDao userDao = ctx.getBean(IUserDao.class);    UserModel model = new UserModel();    model.setMyName("test");    userDao.save(model);     Assert.assertEquals(1, userDao.countAll());}

?????? 首先读取配置文件,获取IUserDao接口实现,然后再调用IUserDao接口方法,进行数据库操作,这样对于开发人员使用来说,只面向接口,不关心实现,因此很容易更换实现,比如像更换为hibernate实现非常简单。

?

原创内容,转载请注明出处【http://sishuok.com/forum/blogPost/list/0/2493.html】

3 楼 downpour 2012-03-09   挺想看到一些使用感悟的,包括怎么写代码能够提高程序的可读性和可扩展性。

加油! 4 楼 jinnianshilongnian 2012-03-10   downpour 写道挺想看到一些使用感悟的,包括怎么写代码能够提高程序的可读性和可扩展性。

加油!

嗯,我会加油的! 感谢大哥的支持。 5 楼 b_l_east 2012-05-21   请问一下楼主,在继承Support类后,如何通过注释的方式注入DataSource。

貌似继承之后只能使用XML配置的方式了,能否有什么好的方法呢?! 6 楼 jinnianshilongnian 2012-05-21   b_l_east 写道请问一下楼主,在继承Support类后,如何通过注释的方式注入DataSource。

貌似继承之后只能使用XML配置的方式了,能否有什么好的方法呢?!

添加一个自定义的注入方法,让其转发给super的setDataSource

@Autowired
public void setDs(ds) {
   super.setDataSource(ds);
} 7 楼 b_l_east 2012-05-22   jinnianshilongnian 写道b_l_east 写道请问一下楼主,在继承Support类后,如何通过注释的方式注入DataSource。

貌似继承之后只能使用XML配置的方式了,能否有什么好的方法呢?!

添加一个自定义的注入方法,让其转发给super的setDataSource

@Autowired
public void setDs(ds) {
   super.setDataSource(ds);
}

如此。。。也好。

热点排行