1、JDBC代码的弊端

先来简单看一下

public class JdbcDemo01 {public static void main(String[] args) throws SQLException, ClassNotFoundException {Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/hl";String username = "root";String password = "westone";Connection con = (Connection) DriverManager.getConnection(url,username,password);System.out.println(con);Statement state = (Statement) con.createStatement();System.out.println(state);int row = state.executeUpdate("insert into t_sort values(5,'牛仔裤',999,'HHHHHHH')");System.out.println(row);state.close();con.close();}
}

看到这里是不是深恶痛绝,在开发的时候,需要打开数据库连接执行SQL,然后组装结果,最后关闭数据库。为了解决这些问题,Spring提供了自己的方案,使用JdbcTemplate模板,不过在使用JdbcTemplate模板之前,要了解一下在Spring中是如何配置数据库资源的。

2、配置数据库资源

在Spring中配置数据库资源很简单,在实际工作中,大部分会配置称为数据库连接池。我们既可以使用Spring内部提供的类,也可以使用第三方数据库连接池或者web服务器中提供JNDI获取数据源。由于使用了第三方的类库,一般而言在工作找那个会偏向采用XML的方式进行配置,当然也可以采用注解的方式进行配置。只是对于项目的公共资源,建议采用统一的XML进行配置,以便于查找公共资源。

2.1使用简单数据库配置

首先讨论一个简单的数据库配置,它是Spring提供的一个类org.springframework.jdbc.datasource.SimpleDriverDataSource,它很简单,不支持数据库连接池。这里我们可以通过XML的方式配置它。

<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource"><property name="driverClass" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/spring_all"/><property name="username" value="root"/><property name="password" value="root" />
</bean>

这个配置一般用于测试,因为它不是一个数据库连接池,只是一个简单的数据库连接的应用。在更多的时候,可以使用第三方的数据库连接。

2.2 使用第三方数据库连接池

如DBCP数据库连接池,我们在下载了对应的DBCP数据库连接池相关包后,就可以使用它了。配置文件如下:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///spring_all"/><property name="username" value="root"/><property name="password" value="root" /><!-- 连接池的最大数据库连接数 --><property name="maxActive" value="255"/><!-- 最大等待连接中的数量 --><property name="maxIdle" value="5" /><!-- 最大等待毫秒数 --><property name="maxWait" value="10000"/>
</bean>

2.3使用JNDI数据库连接池

在Tomcat、WebLogic等JavaEE服务器上配置数据源,这是它存在一个JNDI的名称。也可以通过Spring提供的JNDI机制获取对应的数据源。假设已经在Tomcat上配置了JNDI为jdbc/chapter的数据源,这样就可以在Web工程中获取这个JNDI数据源。配置:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"><property name="jndiName" value="java:com.hl.spring.jdbc.chapter"/>
</bean>

这样就能够在Spring中定义JNDI数据源了,有了数据源,我们继续深入学习。

2.4使用JdbcTemplate模板

JdbcTemplate是Spring针对JDBC代码失控提供的解决方案,严格来说,它本身也不算成功。但是无论如何JdbcTemplate的方案体现了iSpring框架的主导思想之一:给予常用技术提供模板化开发,减少开发者工作量。当然与现在mybatis相对比,工作量依然很大。

首先对JdbcTemplate进行配置

        <!-- [1]配置连接池 --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/spring_all"/><property name="username" value="root"/><property name="password" value="root" /></bean><!-- [2]配置JDBC模板类 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource" /></bean>

测试一把:

/*** 测试:使用JDBC模板类*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:com/hl/spring/jdbc/demo02jdbcpool/jdbcAnnoConfig.xml")
public class JdbcAnno {@Resource(name="jdbcTemplate")private JdbcTemplate jdbcTemplate;@Testpublic void run(){// SQL操作,完成数据的添加int insert =  jdbcTemplate.update("insert into t_account values(?,?,?)",4,"ioc",300);System.out.println(insert);}
}

2.5JdbcTemplate的源码分析

        @Overridepublic <T> T execute(StatementCallback<T> action) throws DataAccessException {Assert.notNull(action, "Callback object must not be null");//从数据源中获取一条连接,然后对接口进行回调,在catch语句中会关闭对应的资源Connection con = DataSourceUtils.getConnection(obtainDataSource());Statement stmt = null;try {stmt = con.createStatement();applyStatementSettings(stmt);T result = action.doInStatement(stmt);handleWarnings(stmt);return result;}catch (SQLException ex) {// Release Connection early, to avoid potential connection pool deadlock// in the case when the exception translator hasn't been initialized yet.String sql = getSql(action);JdbcUtils.closeStatement(stmt);stmt = null;DataSourceUtils.releaseConnection(con, getDataSource());con = null;throw translateException("StatementCallback", sql, ex);}finally {JdbcUtils.closeStatement(stmt);DataSourceUtils.releaseConnection(con, getDataSource());}}

可以看出,Spring要实现数据库连接资源获取和释放的逻辑,只要完成回调接口的方法逻辑即可,这便是它所提供的模板功能。但是我们并没有看到任何的事务管理,因为jdbcTemplate是不能支持事务的,还需要引入对应的事务管理器才能够支持事务。

(12)Spring框架----Spring框架是如何配置数据库资源的相关推荐

  1. Greenplum【集群搭建 02】cgroup工具安装+用户资源组配置+集群资源组配置+数据库资源组配置+资源组相关信息(一篇学会资源组配置)

    采用资源组的形式管理数据库集群的内存.cpu等信息,非特殊说明,需要在集群每台机器上执行. 1.安装cgroup工具 # 1.安装 yum install -y libcgroup-tools# 如果 ...

  2. spring 配置只读事务_只读副本和Spring Data第1部分:配置数据库

    spring 配置只读事务 这是有关我们为利用只读副本来提高应用程序性能而寻求的一系列博客文章. 对于这个项目,我们的目标是建立我们的spring数据应用程序,并使用read仓库进行写操作,并基于re ...

  3. 只读副本和Spring Data第1部分:配置数据库

    这是有关我们为利用只读副本来提高应用程序性能而寻求的一系列博客文章. 对于这个项目,我们的目标是建立我们的spring数据应用程序,并使用read仓库进行写操作,并基于read副本进行读操作. 为了模 ...

  4. 最全三大框架整合(使用映射)——数据库资源文件jdbc.properties

    jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl jdbc.driver=oracle.jdbc.OracleDriver jdbc.username=pr ...

  5. oracle11g资源过低,Sun Cluster3.3+Oracle11g配置数据库资源问题

    一次工程交付,软件环境为Solaris10U11+Cluster3.3U2+Oracle11g,最后建立数据库资源的时候,遇到一问题,原始命令如下: # clresource create -g or ...

  6. Sun Cluster3.3+Oracle11g配置数据库资源问题

    一次工程交付,软件环境为Solaris10U11+Cluster3.3U2+Oracle11g,最后建立数据库资源的时候,遇到一问题,原始命令如下: # clresource create -g or ...

  7. Spring(5)——Spring 和数据库编程

    传统 JDBC 回顾 JDBC 我们一定不陌生,刚开始学习的时候,我们写过很多很多重复的模板代码: public Student getOne(int id) {String sql = " ...

  8. 深入学习Spring框架(二)- 注解配置

    1.为什么要学习Spring的注解配置? 基于注解配置的方式也已经逐渐代替xml.所以我们必须要掌握使用注解的方式配置Spring. 关于实际的开发中到底使用xml还是注解,每家公司有着不同的使用习惯 ...

  9. Spring+SpringMvc+Mybatis框架集成搭建教程二(依赖配置及框架整合)

    依赖导入以及框架整合 (1).打开项目的pom.xml文件,声明依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" x ...

  10. spring mysql 多数据源_spring框架学习【多数据源配置】

    在我们的项目中遇到这样一个问题:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库.我们以往在spring和hibernate框架中总是配置一个数据源,因而sessi ...

最新文章

  1. boss直聘Android找工作界面,Android仿Boss直聘我的界面滑动效果
  2. 【图像分割模型】全景分割是什么?
  3. ThinkPHP5下自己写日志
  4. java开发组态软件下载_基于JAVA的煤矿安全监控系统组态软件设计研究.pdf
  5. http://blog.chinaunix.net/uid-25082381-id-3242162.html
  6. JAVA并发编程: CAS和AQS
  7. verilog设置24进制计数器_阅读笔记:《Verilog HDL入门》第3章 Verilog语言要素
  8. 优化算法笔记|萤火虫算法理解及实现
  9. Hadoop高级培训课程大纲-开发者版
  10. 【codevs2333】【BZOJ2002】弹飞绵羊[HNOI2010](分块)
  11. FPGA概述(对FPGA的基本认识)
  12. python3爬虫(2):使用Selenium爬取百度文库word文章
  13. windows下载android源码
  14. c语言编程杭电1008,C语言程序设计_杭州电子科技大学cyy1_3
  15. ubuntu卸载程序
  16. 软件安装下载【Android】
  17. P4043 [AHOI2014/JSOI2014] 上下界最小费用流
  18. kali安装中文输入法(搜狗输入法)
  19. JVM内存不足增大运行时内存
  20. python与分形0021 - 【教程】奥林匹克五环

热门文章

  1. 分布式事务解决方案之TCC方案
  2. ElasticSearch全文搜索引擎之核心概念和IK分词器篇
  3. Java中的JVM虚拟机
  4. 【Oracle学习笔记】索引
  5. CentOS Linux解决Device eth0 does not seem to be pres
  6. cockroachdb设计翻译
  7. 采用C#泛型实现数据库之间的切换
  8. case结构条件语句
  9. SaaS应用出路何在?
  10. 热点聚焦:企业上ERP之前是否需要先进行流程梳理?