先上一段简单示例

public class MyTemplate {

    private DataSource dataSource;

    public DataSource getDataSource() {
return dataSource;
} public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
} public void insert(String sql) throws SQLException{
Connection conn = this.dataSource.getConnection();
Statement stmt = conn.createStatement();
stmt.executeUpdate(sql);
stmt.close();
conn.close();
}
}

Dao类

public class PersonDao extends MyTemplate{

    public void savePerson() throws Exception{
this.insert("insert into person(pid,pname) values(3,'aaa')");
}
}

spring配置文件

    <!--
引入properties配置文件
-->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:jdbc.properties</value>
</property>
</bean> <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean> <bean id="myTemplate" class="cn.qjc.jdbc.dao.MyTemplate">
<!-- setter注入 -->
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean> <bean id="personDao" class="cn.qjc.jdbc.dao.PersonDao">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean> </beans>

测试类

public class PersonDaoTest {

    @Test
public void testPersonDao() throws Exception{
ApplicationContext context = new ClassPathXmlApplicationContext("cn/qjc/jdbc/applicationContext.xml");
PersonDao personDao = (PersonDao)context.getBean("personDao");
personDao.savePerson();
}
}

  以上代码将DataSource注入给MyTemplate,再把DataSource注入给PersonDao,因为personDao继承MyTemplate,所以拥有Datasource属性。既然PersonDao继承MyTemplate,所以PersonDao类注入可以改为

<bean id="personDao" class="cn.qjc.jdbc.dao.PersonDao" parent="myTemplate"></bean>

以上例子中MyTemplate类似于设计模式中的模板模式也叫模板方法模式,模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术。

  模板模式 = 静态代码+动态变量

在spring中动态变量可以用注入的形式给予。这样的编程方式适合包装成模板。静态代码构成了模板,而动态变量则是需要传入的参数。

spring与jdbc结合核心类JdbcTemplate

  1、基于模板的设置(为什么可以设置成基于模板的形式)

  2、完成了资源的创建和释放的工作

  3、简化为我们对JDBC的操作

  4、完成了对JDBC的核心流程的工作,包括SQL语句的创建和执行

  5、仅需要传递DataSource就可以把它实例化

  6、JdbcTemplate只需要创建一次

  7、JdbcTemplate是线程安全类

使用spring+jdbc修改上面例子(myTemplate类去掉)

public class PersonDao extends JdbcDaoSupport {
public void savePerson(String sql){
this.getJdbcTemplate().execute(sql);
}
}

spring配置文件改为

<bean id="personDao" class="cn.qjc.jdbc.dao.PersonDao">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>

JdbcTemplate类结构图

执行过程

说明:

1、执行数据的操作的是JdbcTemplate

2、最根本的步骤就是要把dataSource注入到JdbcTemplate

3、通过给JdbcTemplate注入dataSource

    a、采用构造器的形式注入

   b、采用setter方法进行注入

4、可以给JdbcDaoSupport注入dataSource

5、可以给JdbcDaoSupport注入JdbcTemplate

所以spring与jdbc整合有三种方法,但实际上核心类为JdbcTemplate

  1、使用JdbcTemplate

   在Dao类中,用JdbcTemplate作为属性,用spring对JdbcTemplate进行注入。再对JdbcTemplate进行DataSource注入。

    注:为什么只要对JdbcTemplate注入DataSource就可以了?

  2、继承jdbcDaoSupport

   在Dao类中,继承JdbcDaoSupport。因为JdbcDaoSupport已经有了JdbcTemplate的引用,所以只要继承JdbcDaoSupport就相当于有了JdbcTemplate属性。

  3、继承JdbcTemplate

spring还提供了其他ORM框架整合模式都差不多,完全可直接套用。

spring+hibernate

spring+Jdo

由此可看出spring IOC 和 DI 的强大,IOC和DI 完成了从接口到类的对应。利用spring容器程序员很容易的在客户端实现面向接口编程,而且很容易给接口装配,结构也可以设置的很灵活。因为接口是自己写的,类也是自己写的,配置文件也是自己写的。spring实际完成了创建对象和装配的工作,它会自动的对应起来。

最新文章

  1. mysql in
  2. win7远程桌面连接总是显示凭证不工作解决方法总结
  3. Spring + Mybatis 使用 PageHelper 插件分页
  4. Android属性动画完全解析(上)
  5. vector、string实现大数加法乘法
  6. Hibernate逍遥游记-第15章处理并发问题-003乐观锁
  7. &#39;EntityValidationErrors&#39; property for more details
  8. 解决windows下Eclipse连接远程Hadoop报错
  9. VisualStudio 自动排版等 快捷键
  10. pl_sql develope连接远程数据库的方法
  11. MongoDB正则表达式
  12. Struts2实现文件下载
  13. 了解 IP 地址,默认网关,子网掩码,DNS 的概念和作用。
  14. python并发编程之多进程1-----------互斥锁与进程间的通信
  15. java 中多线程和锁的使用以及获取多线程执行结果
  16. HTML标记 2 ——表格
  17. 2018.09.28 牛客网contest/197/A因子(唯一分解定理)
  18. Windows环境下的安装gcc
  19. web开发中的MVC框架与django框架的MTV模式
  20. mysql--pymysql 模块

热门文章

  1. 17. Spring Boot 配置嵌入式Servlet容器
  2. 使用 CSS3 的 box-sizing 属性设置元素大小包含 border 与 padding
  3. TCP输出和UDP输出
  4. Nginx 虚拟主机示例
  5. Linux - 文件ACL权限控制
  6. Linux - vim 编辑器
  7. centos7 网卡命名
  8. JavaScript动态修改CSS
  9. mysql 案例~mysql主从复制延迟处理(2)
  10. CSS3动画常用demo