spring使用JdbcTemplate、JdbcDaoSupport模板类的数据源配置及db访问

来源:互联网 发布:mac windows触摸板 编辑:程序博客网 时间:2024/06/05 16:41

目录

  1. spring的JdbcTemplate类与JdbcDaoSupport类原理
  2. 使用JdbcDaoSupport的数据库访问
  3. 使用JdbcTemplate的数据库访问

spring的JdbcTemplate类与JdbcDaoSupport类原理

spring访问数据库的方式有很多,自我理解,大体分为三类:
1.原始jdbc,通过获取数据库连接,然后自己创建、处理和释放连接等原始方式。
2.使用例如:JdbcTemplate、JdbcDaoSupport模板类,这种模板类spring将原始的jdbc的连接处理,封装至模板类中,使用起来方便快捷,避免处理各种资源和异常。
3.使用第三方orm框架,如hibernate、ibatis、mybatis等,与spring结合,配置完成,可方便访问数据库。
今天只是简单分享一下第二种方式。
对于JdbcDaoSupport,其实是在JdbcTemplate之上的一层封装,使dao层的类直接继承该类,就可以获取数据源或模板,对数据库进行操作。JdbcDaoSupport不仅兼容JdbcTemplate,同时还兼容了dataSource。而兼容dataSource,则也是将dataSource封装至JdbcTemplate。看源码,涉及两个方法:
<span style="white-space:pre"></span>public final void setDataSource(DataSource dataSource) {<span style="white-space:pre"></span>if (this.jdbcTemplate == null || dataSource != this.jdbcTemplate.getDataSource()) {<span style="white-space:pre"></span>this.jdbcTemplate = createJdbcTemplate(dataSource);<span style="white-space:pre"></span>initTemplateConfig();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>protected JdbcTemplate createJdbcTemplate(DataSource dataSource) {<span style="white-space:pre"></span>return new JdbcTemplate(dataSource);<span style="white-space:pre"></span>}
由以上源码可知,使用JdbcDaoSupport时,是不能使用Autowired直接注入数据源的,因为setDataSource方法为final类型,无法被重写,只能在xml里配置实例化的dao,配置引用的数据源。
在JdbcTemplate类中,存在构造方法
<span style="white-space:pre"></span>public JdbcTemplate(DataSource dataSource) {setDataSource(dataSource);afterPropertiesSet();}
由此构造方法可知,我们可以对JdbcTemplate的数据源进行手动设置,此时,可以使用@Autowired注解,将数据源注入,然后再重新new一个JdbcTemplate。

使用JdbcDaoSupport的数据库访问

无论哪一种方式,都需要配置好数据源,才可以进行数据库访问。

1.配置数据源

<span style="white-space:pre"></span><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName" value="${test.jdbc.driver}" /><property name="url" value="${test.jdbc.url}" /><property name="username" value="${test.jdbc.username}" /><property name="password" value="${test.jdbc.password}" /><property name="initialSize" value="${test.jdbc.initialSize}" /><property name="maxActive" value="${test.jdbc.maxActive}" /><property name="maxWait" value="60000" /><property name="poolPreparedStatements" value="true" /><!-- 连接被泄露时是否打印 --><property name="logAbandoned" value="true" /><!--removeAbandoned: 是否自动回收超时连接 --><property name="removeAbandoned" value="true" /><!--removeAbandonedTimeout: 超时时间(以秒数为单位) --><property name="removeAbandonedTimeout" value="10" /><property name="testOnBorrow" value="true" /><property name="validationQuery" value="show databases" /></bean>

2.实现DAO层类

<span style="white-space:pre"></span>import java.util.List;<span style="white-space:pre"></span>import java.util.Map;<span style="white-space:pre"></span>import org.springframework.beans.factory.annotation.Autowired;<span style="white-space:pre"></span>import org.springframework.jdbc.core.support.JdbcDaoSupport;<span style="white-space:pre"></span>import org.springframework.stereotype.Repository;<span style="white-space:pre"></span>public class MyDAO extends JdbcDaoSupport {<span style="white-space:pre"></span>public List<Map<String, Object>> test() {<span style="white-space:pre"></span>String sql = "select * from test limit 10";<span style="white-space:pre"></span>return this.getJdbcTemplate().queryForList(sql);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}

3.在xml中配置DAO实例,并引用数据源

<span style="white-space:pre"></span><bean id="myDAO" class="com.test.MyDAO"><property name="dataSource" ref="dataSource"></property></bean>

4.实现service层,并注入dao层实例引用

<span style="white-space:pre"></span>import java.util.List;<span style="white-space:pre"></span>import java.util.Map;<span style="white-space:pre"></span>import org.springframework.beans.factory.annotation.Autowired;<span style="white-space:pre"></span>import com.baidu.waimai.dao.impl.MyDAO;<span style="white-space:pre"></span>public class TestService {<span style="white-space:pre"></span>@Autowired<span style="white-space:pre"></span>private MyDAO myDAO;<span style="white-space:pre"></span>public void test() {<span style="white-space:pre"></span>List<Map<String, Object>> result = myDAO.test();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}
此种方式,容器在xml配置中拿到dataSource并将其赋给JdbcDaoSupport,并在JdbcDaoSupport中,调用createJdbcTemplate(DataSrouce dataSource)方法,以该数据源创建JdbcTemplate模板。然后进行数据库的操作。

使用JdbcTemplate的数据库访问

1.数据源配置

同上

2.实现DAO层

<span style="white-space:pre"></span>import java.util.List;<span style="white-space:pre"></span>import java.util.Map;<span style="white-space:pre"></span>import javax.sql.DataSource;<span style="white-space:pre"></span>import org.springframework.beans.factory.annotation.Autowired;<span style="white-space:pre"></span>import org.springframework.jdbc.core.JdbcTemplate;<span style="white-space:pre"></span>import org.springframework.stereotype.Repository;<span style="white-space:pre"></span>@Repository<span style="white-space:pre"></span>public class MyDAO {<span style="white-space:pre"></span>@Autowired<span style="white-space:pre"></span>private DataSource dataSource;<span style="white-space:pre"></span>public List<Map<String, Object>> test() {<span style="white-space:pre"></span>String sql = "select * from test limit 10";<span style="white-space:pre"></span>return getJdbcTemplate().queryForList(sql);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>private JdbcTemplate getJdbcTemplate() {<span style="white-space:pre"></span>return new JdbcTemplate(dataSource);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}

3.无需在xml中配置dao实例,因为用注解@Repository。

4.同上

哪种方式,看个人习惯,原理都是一样的,只是形式的不同。


附:spring初学阶段,如有错误,欢迎指正。一起学习,共同进步~

0 0
原创粉丝点击