在Spring中使用连接池和JdbcTemplate

原文地址:https://blog.csdn.net/fancheng614/article/details/85543816

一、Spring数据访问简介

1、Spring数据访问方式

   可以使用JDBC、Hibernate、Java持久化API、Mybatis或任意的持久化框架。

2、数据访问模块化

  Spring提供了多个可选的模板,如果直接使用JDBC,那可以选择JdbcTemplate。如果使用对象映射框架,可以使用 HibernateTemplate或者JpaTemplate。

Spring提供的数据访问模板,分别适用于不同的持久化机制
模板类(org.springframework.*)用途
jca.cci.core.CciTemplateJCA CCI连接
jdbc.core.JdbcTemplateJDBC连接
jdbc.core.namedparam.NamedParameterJdbcTemplate支持命名参数的JDBC连接
jdbc.core.simple.SimpleJdbcTemplate通过java5简化后的JDBC连接(Spring3.1中已废弃)
orm.hibernate3.HibernateTemplateHibernate3.X以上的session
orm.ibatis.SqlMapClientTemplateibatis SqlMap客户端
orm.jdo.JdoTemplatejava 数据对象(Java Data Object)实现
orm.jpa.JpaTemplateJava持久化API的实体管理器

二、配置数据源

1、使用JNDI数据源(推荐使用)(可以参考:https://www.cnblogs.com/xuan52rock/p/4745241.html

在JavaEE的应用服务器中,都允许通过JNDI获取数据源。这种配置的好处在于数据源完全可以在应用程序之外进行管理,这样应用程序只需要在访问数据库的时候查找数据源就可以了。而且在应用服务器中管理的数据源通常以池的方式组织,具备更好的性能,并且还支持系统管理员对其进行热切换。

JNDI的XML配置:

<jee:jndi-lookup id="dataSource" jndi-name="OracleConnection"></jee:jndi-lookup>
 
 

JNDI的Java配置:


 
 
  1. @Bean
  2. public JndiObjectFactoryBean dataSource(){
  3. JndiObjectFactoryBean factoryBean = new JndiObjectFactoryBean();
  4. factoryBean.setJndiName( "OracleConnection");
  5. factoryBean.setProxyInterface(DataSource.class);
  6. return factoryBean;
  7. }

2、使用数据源连接池(推荐使用)

Spring并没有提供数据源连接池的实现,可以通过DBCP、c3p0、BoneCP实现连接池。

DBCP、c3p0、BoneCP的Maven依赖:


 
 
  1. <!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
  2. <dependency>
  3. <groupId>commons-dbcp </groupId>
  4. <artifactId>commons-dbcp </artifactId>
  5. <version>1.4 </version>
  6. </dependency>
  7. <!-- https://mvnrepository.com/artifact/c3p0/c3p0 -->
  8. <dependency>
  9. <groupId>c3p0 </groupId>
  10. <artifactId>c3p0 </artifactId>
  11. <version>0.9.1.2 </version>
  12. </dependency>
  13. <!-- https://mvnrepository.com/artifact/com.jolbox/bonecp -->
  14. <dependency>
  15. <groupId>com.jolbox </groupId>
  16. <artifactId>bonecp </artifactId>
  17. <version>0.8.0.RELEASE </version>
  18. </dependency>

DBCP、c3p0、BoneCP数据库连接池的三种方式的xml配置:


 
 
  1. <!-- 数据源连接池配置三种方式(推荐使用):DBCP、C3P0、BoneCP -->
  2. <!-- DBCP配置数据源 -->
  3. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  4. <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"> </property>
  5. <property name="url" value="jdbc:oracle:thin:@localhost:1521:ORCL"> </property>
  6. <property name="username" value="scott"> </property>
  7. <property name="password" value="scott"> </property>
  8. </bean>
  9. <!-- C3P0配置数据源 -->
  10. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  11. <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"> </property>
  12. <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:ORCL"> </property>
  13. <property name="user" value="scott"> </property>
  14. <property name="password" value="scott"> </property>
  15. </bean>
  16. <!-- BoneCP配置数据源 -->
  17. <bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource">
  18. <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"> </property>
  19. <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:ORCL"> </property>
  20. <property name="user" value="scott"> </property>
  21. <property name="password" value="scott"> </property>
  22. </bean>

DBCP的Java配置(另外两种类似,这里不再展示):


 
 
  1. @Bean
  2. public BasicDataSource dataSource(){
  3. BasicDataSource dataSource = new BasicDataSource();
  4. dataSource.setDriverClassName( "");
  5. dataSource.setUrl( "");
  6. dataSource.setUsername( "");
  7. dataSource.setPassword( "");
  8. return dataSource;
  9. }

其中在DBCP配置中并不仅仅只有上面的这些配置属性,更多属性见下表:

BasicDataSource的池配置属性
池配置属性所指定的内容
initialSize池启动时创建的链接数量
maxActive同一时间可从池中分配的最多连接数。如果设置为0,表示无限制
maxIdle池里不会被释放的最多空闲连接数。如果设置为0,表示无限制
maxOpenPreparedStatements在同一时间能够从语句池中分配的预处理语句(prepared statement)的最大数量,如果设置为0,表示无限制
maxWait在抛出异常之前,池等待连接回收的最大时间(当没有可用连接时)。如果设置为-1,表示无限等待
minEvictableIdleTimeMillis连接在池中保持空闲而不被回收的最大时间
minIdle在不创建新连接的情况下,池中保持空闲的最小连接数
poolPreparedStatements是否对预处理语句(prepared statement)进行池管理(boolean值)

3、基于JDBC驱动的数据源(不推荐使用)

   ①DriverManagerDataSource:在每个连接请求时都会返回一个新的连接,没有进行池化管理

   ②SimpleDriverDataSource:与DriverManagerDataSource类似,但它是直接使用JDBC驱动的,来解决在特定环境下的类加载问题,这样的环境包括OSGi容器。

   ③SingleConnectionDataSource:在每个连接请求时,都会返回同一个连接。不适用于多线程应用程序。

以上三种方式的XML配置:


 
 
  1. <!-- 基于JDBC驱动的数据源三种方式(不推荐使用) -->
  2. <!--DriverManagerDataSource -->
  3. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  4. <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"> </property>
  5. <property name="url" value="jdbc:oracle:thin:@localhost:1521:ORCL"> </property>
  6. <property name="username" value="scott"> </property>
  7. <property name="password" value="scott"> </property>
  8. </bean>
  9. <!--SimpleDriverDataSource -->
  10. <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
  11. <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"> </property>
  12. <property name="url" value="jdbc:oracle:thin:@localhost:1521:ORCL"> </property>
  13. <property name="username" value="scott"> </property>
  14. <property name="password" value="scott"> </property>
  15. </bean>
  16. <!--SingleConnectionDataSource -->
  17. <bean id="dataSource" class="org.springframework.jdbc.datasource.SingleConnectionDataSource">
  18. <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"> </property>
  19. <property name="url" value="jdbc:oracle:thin:@localhost:1521:ORCL"> </property>
  20. <property name="username" value="scott"> </property>
  21. <property name="password" value="scott"> </property>
  22. </bean>

DriverManagerDataSource的Java配置(其它两种的Java配置类似,这里不记录):


 
 
  1. @Bean
  2. public DriverManagerDataSource dataSource(){
  3. DriverManagerDataSource dataSource = new DriverManagerDataSource();
  4. dataSource.setDriverClassName( "");
  5. dataSource.setUrl( "");
  6. dataSource.setUsername( "");
  7. dataSource.setPassword( "");
  8. return dataSource;
  9. }

4、使用嵌入式的数据源(用的比较少,这里不记录)

参考:https://www.cnblogs.com/achengmu/p/8301488.html

5、使用profile选择数据源(用的比较少,这里不记录)

参考:https://blog.csdn.net/qq_33460264/article/details/82426139

 

三、在Spring中使用JDBC

1、相信在学习Java的过程中都经历过使用原生的JDBC进行数据库的CURD操作,其繁琐估计也是都见过的,首先要创建连接,然后操作数据,操作数据要写一大堆的get、set,操作完成之后还需要关闭连接,而且每一次操作数据库都需要这些步骤。这里就不再赘述这种繁琐的操作了。

2、使用JDBC模板进行数据库的CURD操作。

Spring为JDBC提供了三个模板类:

①JdbcTemplate(推荐):最基本的Spring JDBC模板,这个模板支持简单的JDBC数据库访问功能以及基于索引参数的查询

②NamedParameterJdbcTemplate:使用该模板类执行查询时可以将值以命名参数的形式绑定到SQL中,而不是使用简单的索引参数。

③SimpleJdbcTemplate:该模板利用Java5的一些特性如自动装箱、泛型以及可变参数列表来简化JDBC模板的使用。

3、JdbcTemplate的使用:

在Spring容器中添加JdbcTemplate的bean:


 
 
  1. <!-- DBCP配置数据源 -->
  2. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  3. <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"> </property>
  4. <property name="url" value="jdbc:oracle:thin:@localhost:1521:ORCL"> </property>
  5. <property name="username" value="scott"> </property>
  6. <property name="password" value="scott"> </property>
  7. <property name="poolPreparedStatements"> </property>
  8. </bean>
  9. <!-- 配置JDBC模板 -->
  10. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  11. <property name="dataSource" ref="dataSource"> </property>
  12. </bean>

使用JdbcTemplate的dao类:


 
 
  1. package com.mfc.dao;
  2. import java.sql.ResultSet;
  3. import java.sql.SQLException;
  4. import java.util.List;
  5. import java.util.Map;
  6. import javax.annotation.Resource;
  7. import org.springframework.jdbc.core.JdbcTemplate;
  8. import org.springframework.jdbc.core.RowMapper;
  9. import org.springframework.stereotype.Repository;
  10. import com.mfc.entity.Tuser;
  11. @Repository(value = "tuserDao")
  12. public class TuserDaoImpl implements TuserDao {
  13. @Resource(name = "jdbcTemplate")
  14. private JdbcTemplate jdbcTemplate;
  15. @Override
  16. public void add(Tuser tuser) {
  17. String sql = "insert into tuser (userId, userName, userPassword) values (?, ?, ?)";
  18. jdbcTemplate.update(sql, tuser.getUserId(), tuser.getUserName(), tuser.getUserPassword());
  19. }
  20. @Override
  21. public void delete(Tuser tuser) {
  22. String sql = "delete from tuser whete userId = ?";
  23. jdbcTemplate.update(sql, tuser.getUserId());
  24. }
  25. @Override
  26. public void update(Tuser tuser) {
  27. String sql = "update tuser set userName=?, userPassword=? where userId=?";
  28. jdbcTemplate.update(sql, tuser.getUserName(), tuser.getUserPassword(), tuser.getUserId());
  29. }
  30. @Override
  31. public List<Map<String, Object>> find(Tuser tuser) {
  32. String sql = "select * from tUser";
  33. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
  34. return list;
  35. }
  36. @Override
  37. public Tuser findByPrimary(String userId) {
  38. String sql = "select * from tUser where userId = ?";
  39. Tuser tuser = jdbcTemplate.queryForObject(sql, new TuserRowMapper(), userId);
  40. return tuser;
  41. }
  42. private static final class TuserRowMapper implements RowMapper<Tuser>{
  43. @Override
  44. public Tuser mapRow(ResultSet rs, int rowNum) throws SQLException {
  45. return new Tuser(rs.getString( "userId"), rs.getString( "userName"), rs.getString( "userPassword"));
  46. }
  47. }
  48. }

 

补充:对于连接池技术推荐使用Druid,DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池(据说是目前最好的连接池)。
使用教程:Spring中使用Druid连接池配置详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值