目录
- spring的JdbcTemplate类与JdbcDaoSupport类原理
- 使用JdbcDaoSupport的数据库访问
- 使用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初学阶段,如有错误,欢迎指正。一起学习,共同进步~