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

本文详细介绍了Spring框架中的JdbcTemplate和JdbcDaoSupport两种数据库访问方式的原理及使用方法,包括数据源配置、DAO层实现、Service层注入等内容。

目录

  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初学阶段,如有错误,欢迎指正。一起学习,共同进步~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值