DataSource--DBCP--C3P0--DBUtils

一.DataSource 接口(javax.sql)
     1.连接池:
         由于与数据库连接的创建和销毁非常占用资源,因此提出了连接池技术,用于提升java程序操作数据库的性能;连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。
     2.介绍:DataSource是java提供的一个接口,规范着所有的想写连接池的人需要做的事情;具体的连接池都需要实现该接口;程序员可以面向Datasource操作具体的连接池对象;
     3.定义:public interface DataSource extends CommonDataSource, Wrapper
     4.常用方法:只有一个getConnection()
         Connection getConnection() throws SQLException{}: Attempts to establish a connection with the data source that this
             DataSource object represents.
         Connection getConnection(String username,String password) throws SQLException{}:
     5.具体的连接池实现技术主要有两类:DBCP和C3P0

二.DBCP--(DataBase Connection Pool)
     1.介绍:
     数据库连接池,是java数据库连接池的一种,由Apache开发,通过数据库连接池,可以让程序自动管理数据库连接的创建。
     2.使用步骤:
         1):下载并解压zip;(DBCP有两个zip文件)
         2):复制核心的jar包到工程中;(commons-dbcp-1.4.jar,  commons-pool-1.5.6.jar)
         3):添加到本地;
         4):复制配置文件到src目录下;并修改配置文件的信息;(该配置文件的名称和位置可以任意)
         5):使用核心类;
     3.核心类介绍:BasicDataSourceFactory
         定义:public class BasicDataSourceFactory extends Object implements ObjectFactory
         构造方法:只有一个空参构造
             public BasicDataSourceFactory()
         常用方法:
             public static DataSource createDataSource(Properties properties) throws Exception{}:
             注意参数为Properties类的实例化对象,返回值为DataSource;
     4.自定义DBCP工具类:配置文件("dbcp.properties")需放在工程根目录下;

  1  //需要首先导入包:mysql-connector-java-5.1.39-bin.jar(mysql驱动),commons-dbcp-1.4.jar,commons-pool-1.5.6.jar
  2      import java.io.FileInputStream;
  3      import java.sql.Connection;
  4      import java.sql.SQLException;
  5      import java.util.Properties;
  6      import javax.sql.DataSource;
  7      import org.apache.commons.dbcp.BasicDataSourceFactory;
  8
  9      public class MyDBCPUtils {
 10          private static DataSource ds = null;
 11          //使用静态代码块技术初始化ds对象(成员变量)
 12          static {
 13              // 获取DataSource
 14              try {
 15                  FileInputStream in = new FileInputStream("dbcp.properties");
 16                  Properties p = new Properties();
 17                  p.load(in);
 18                  ds = BasicDataSourceFactory.createDataSource(p);//面向DBCP核心类,调用createDataSource()方法,返回DataSource
 19              } catch (Exception e) {
 20                  e.printStackTrace();
 21              }
 22          }
 23          // 获取Connection
 24          public static Connection getConnection() {
 25              Connection c = null;
 26              try {
 27                  c = ds.getConnection();
 28              } catch (SQLException e) {
 29                  e.printStackTrace();
 30              }
 31              return c;
 32          }
 33      }

三.C3P0
     1.介绍:
     C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。c3p0与dbcp区别:c3p0有自动回收空闲连接功能,dbcp做不到.
     2.使用步骤:
         1):下载并解压zip;
         2):复制核心jar包到工程中即可:c3p0-0.9.1.2.jar;
         3):添加到本地;
         4):复制配置文件必须到src目录下,且配置文件的名称(c3p0-config.xml)不能改变;
         5):直接创建ComboPooledDataSource核心类对象即可使用;
     3.核心类 ComboPooledDataSource 类(com.mchange.v2.c3p0)
         定义:public final class ComboPooledDataSource extends com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource
                                                     implements PooledDataSource, java.io.Serializable, javax.naming.Referenceable
              public interface PooledDataSource extends javax.sql.DataSource
    
                 ComboPooledDataSource类实现了PooledDataSource接口,该接口继承了DataSource接口;
         构造方法:
                 public ComboPooledDataSource()
         配置文件选项(补充):

4.自定义C3P0工具类:导入包:mysql-connector-java-5.1.39-bin.jar,c3p0-0.9.1.2.jar

  1  /*配置文件必须到src目录下,且配置文件的名称(c3p0-config.xml)不能改变,程序中不会出现,但是会自动读取.
  2      如果报超时错误,有可能是1.包没导入/2.文件没找到/3.数据库服务未开启*/
  3
  4         import java.sql.Connection;
  5          import javax.sql.DataSource;
  6         import com.mchange.v2.c3p0.ComboPooledDataSource;
  7
  8          public class MyC3P0Utils {
  9              // 定义DataSource
 10              private static DataSource ds = new ComboPooledDataSource(); // 多态,子类实例赋值给父类的父类
 11
 12              // 获取Connection
 13              public static Connection getConnection() throws Exception {
 14                  Connection c = ds.getConnection();
 15                  return c;
 16              }
 17              // 返回连接池对象
 18             public static DataSource getDataSource() {
 19                  return ds;
 20              }
 21          }
 22 

四.DBUtils--工具类,commons-dbutils-1.6.jar
     1.概述:Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。
     2.使用步骤:
         1):下载并解压zip;
         2):复制核心jar包到工程中即可:commons-dbutils-1.6.jar; 
         3):添加到本地;
         4):直接创建核心类对象即可使用;
     3.核心类3个:
         1):QueryRunner,用于封装sql执行对象;
         2):ResultSetHandler用于封装ResultSet;
         3):DButils, 用于事务的控制;
     4.QueryRunner
         定义:public class QueryRunner extends AbstractQueryRunner
         构造方法:
             public QueryRunner()
             public QueryRunner(DataSource ds)
         常用方法:
         public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)throws SQLException{}:
         public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)throws SQLException{}:
        
         public int update(Connection conn, String sql, Object... params)throws SQLException{}:Execute an SQL INSERT, UPDATE, or DELETE query.返回值为数据表里受影响的行数(int类型);
         public int update(String sql, Object... params)throws SQLException{}:Executes the given INSERT, UPDATE, or DELETE SQL statement. The Connection is retrieved from the DataSource set in the constructor. This Connection must be in auto-commit mode or the update will not be saved.
     5.ResultSetHandler
         定义:public interface ResultSetHandler<T>
         子类:根据取出数据的不同选择不同的容器接收.前三个较为常用.
             BeanHandler:将结果集中第一条记录封装到一个指定的javaBean中.
             BeanListHandler:将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中.
             ScalarHandler:它是用于单个数据。例如select count(*) from 表操作.
             ArrayHandler:将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值.
             ArrayListHandler:将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中.
             ColumnListHandler:将结果集中指定的列的字段值,封装到一个List集合中.
             MapHandler:将结果集中第一条记录封装到了Map<    String,Object>集合中,key就是字段名称,value就是字段值.
             MapListHandler:将结果集中每一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值,在将这些Map封装到List集合中.
             KeyedHandler:将结果集中每一条记录封装到Map<String,Object>,在将这个map集合做为另一个Map的value,另一个Map集合的key是指定的字段的值.

6.DbUtils
         定义:public final class DbUtils extends Object
         构造方法:public DbUtils()
         静态方法:
         public static void close(Connection conn/ResultSet rs/Statement stmt)throws SQLException{}:此方法有重载(共3个),可以关闭Connection/Statement/ResultSet.
         public static void closeQuietly(Connection conn,Statement stmt,ResultSet rs){}:关闭资源,避免异常,此方法有重载(共4个),可以一次关闭3个,也可以分别关闭.

public static void commitAndClose(Connection conn)throws SQLException{}:Commits a Connection then closes it, avoid closing if null.
         public static void commitAndCloseQuietly(Connection conn){}:Commits a Connection then closes it, avoid closing if null and hide any SQLExceptions that occur.

public static boolean loadDriver(ClassLoader classLoader,String driverClassName){}:Loads and registers a database driver class. If this succeeds, it returns true, else it returns false.有重载,可以直接传入driverClassName.

public static void rollback(Connection conn)throws SQLException{}:Rollback any changes made on the given connection.
         public static void rollbackAndClose(Connection conn)throws SQLException{}:Performs a rollback on the Connection then closes it, avoid closing if null.
         public static void rollbackAndCloseQuietly(Connection conn){}:Performs a rollback on the Connection then closes it, avoid closing if null and hide any SQLExceptions that occur.
     7.代码演示:导包mysql-connector-java-5.1.39-bin.jar,commons-dbutils-1.6.jar,c3p0-0.9.1.2.jar(使用了前面自定义的MyC3P0工具类)

  1 //定义一个类,要使用到BeanHandler类
  2 public class Vegetables {
  3      private int id;
  4      private String name;
  5      //空参构造--Eclipse快捷键:alt+shift+c
  6      public Vegetables() {
  7          super();
  8      }
  9      //满参构造--Eclipse快捷键:alt+shift+o
 10      public Vegetables(int id, String name) {
 11          super();
 12          this.id = id;
 13          this.name = name;
 14      }
 15      //覆写toString--Eclipse快捷键alt+shift+s
 16      @Override
 17      public String toString() {
 18          return "Vegetables [id=" + id + ", name=" + name + "]";
 19      }
 20      //getter/setter--Eclipse快捷键alt+shift+r
 21      public int getId() {
 22          return id;
 23      }
 24      public void setId(int id) {
 25          this.id = id;
 26      }
 27      public String getName() {
 28          return name;
 29      }
 30      public void setName(String name) {
 31          this.name = name;
 32      }
 33  }
 34
 35 import huguangqin.com.cnblogs_MyC3P0Utils.MyC3P0Utils;//使用了前面自定义的工具类
 36 import java.util.List;
 37  import org.apache.commons.dbutils.QueryRunner;
 38  import org.apache.commons.dbutils.handlers.BeanHandler;
 39  import org.apache.commons.dbutils.handlers.BeanListHandler;
 40  import org.apache.commons.dbutils.handlers.ScalarHandler;
 41
 42 public class Demo {
 43      @SuppressWarnings("all")//压制黄线警告
 44     public static void main(String[] args) throws Exception {
 45          // 获取QueryRunner对象
 46         QueryRunner qr = new QueryRunner(MyC3P0Utils.getDataSource());
 47          // 插入数据
 48         String inertSQL = "INSERT INTO dbutil(id,name) VALUES(?,?)";
 49          int i1 = qr.update(inertSQL, null, "白菜");
 50          int i2 = qr.update(inertSQL, null, "豆腐");
 51          int i3 = qr.update(inertSQL, null, "磨菇");
 52          System.out.println(i1 + i2 + i3);
 53
 54         // 修改
 55         String updateSQL = "UPDATE dbutil SET name = ? WHERE id = 1";
 56          int i4 = qr.update(updateSQL, "小白菜");
 57          System.out.println(i4);
 58
 59         // 查询1--ScalarHandler
 60          String querySQL = "SELECT name FROM dbutil WHERE name Like ‘___‘";
 61          // 定义容器接收 ScalarHandler
 62          ScalarHandler sh = new ScalarHandler();
 63          String s = qr.query(querySQL, sh);
 64          System.out.println(s);// 只返回一个值
 65
 66         // 查询2--BeanHandler
 67          String querySQL2 = "SELECT * FROM dbutil";
 68          BeanHandler bh = new BeanHandler(Vegetables.class);
 69          Vegetables v = qr.query(querySQL2, bh);
 70          System.out.println(v);// 只返回一个实例对象
 71
 72         // 查询3--BeanListHandler
 73          BeanListHandler blh = new BeanListHandler(Vegetables.class);
 74          List<Vegetables> list = qr.query(querySQL2, blh);// 返回List
 75          for (Vegetables v1 : list) {
 76              System.out.println(v1);
 77          }
 78          // 删除
 79         String deleteSQL = "DELETE FROM dbutil";
 80          int i5 = qr.update(deleteSQL);
 81          System.out.println(i5);
 82      }
 83  }
 84 
时间: 2024-10-13 01:47:44

DataSource--DBCP--C3P0--DBUtils的相关文章

连接池 DBCP c3p0以及分页的案例

1. 连接池 思考: 程序中连接如何管理? 连接资源宝贵:需要对连接管理 连接: a) 操作数据库,创建连接 b) 操作结束,  关闭! 分析: 涉及频繁的连接的打开.关闭,影响程序的运行效率! 连接管理: 预先创建一组连接,有的时候每次取出一个: 用完后,放回: 学习连接池: 自定义一个连接池 学习优秀的连接池组件 a) DBCP b) C3P0 自定义连接池 代理: 如果对某个接口中的某个指定的方法的功能进行扩展,而不想实现接口里所有方法,可以使用(动态)代理模式! Java中代理模式:静态

DBCP,C3P0,Tomcat_JDBC 性能及稳定性测试

1.测试环境: 硬件环境: 数据库服务器:2U*8核 8G内存 测试服务器:   2U*8核 6G内存 软件环境: jdk: 1.6.29 mysql: 5.0.77 mysql_driver: mysql-connector-java-5.0.8-bin.jar DBCP: commons-dbcp-1.4.jar 下载地址: http://commons.apache.org/dbcp/ commons-pool-1.5.6.jar 下载地址: http://commons.apache.o

spring下配置dbcp,c3p0,proxool

不管通过何种持久化技术,都必须通过数据连接访问数据库,在Spring中,数据连接是通过数据源获得的.在以往的应用中,数据源一般是Web应用服务器提供的.在Spring中,你不但可以通过JNDI获取应用服务器的数据源,也可以直接在Spring容器中配置数据源,此外,你还可以通过代码的方式创建一个数据源,以便进行无依赖的单元测试 配置一个数据源     Spring在第三方依赖包中包含了两个数据源的实现类包,其一是Apache的DBCP,其二是 C3P0.可以在Spring配置文件中利用这两者中任何

DBCP|C3P0参数详解

1.<!-- 数据源1 --> 2. <bean id="dataSource" 3. class="org.apache.commons.dbcp.BasicDataSource" 4. destroy-method="close"> 5. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>

JSP分页(MySql+c3p0+dbutils)

为什么要对数据进行分页?当数据较多时,页面就会变的很庞大,不仅会影响到用户的使用,而且还有加重服务器的负担.下面简单的实现了数据的分页. 第一步:导入相应的jar包 需要导入c3p0,dbutils,mysql驱动等jar包. 第二步:创建数据库和表, 配置c3p0, 创建工具类,User类 创建数据库,并准备测试数据(可以自行生成) create database contacts; use contacts; create table users( id varchar(32), usern

【转】JDBC学习笔记(8)——数据库连接池(dbcp&amp;C3P0)

转自:http://www.cnblogs.com/ysw-go/ JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/beans)中建立数据库连接 2)进行sql操作 3)断开数据库连接 二.这种模式开发,存在的问题: 1)普通的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将Connection加载进内存中,再验证用户名和密码(得花费0.05s~1s的时间).需要数据库连接

dbcp,c3p0连接池

<!-- 配置dbcp数据源 --> <bean id="dataSource2" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <pr

数据库连接dbcp$c3p0

<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <!-- 这是默认配置信息 --> <default-config name="hoobey"> <!-- 连接四大参数配置 --> <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1&

MySQL---数据库从入门走向大神系列(十三)-BasicDataSource创建DataSource(DBCP连接池配置)

DBCP(DataBase connection pool),数据库连接池.是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件.单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去. 首先,下载必须的jar包 dbcp包,目前版本是2.1.1 : htt

第8章WEB08-XML&amp;Tomcat篇

今日任务? 通过XML作为配置文件完成模拟Tomcat的案例? 安装Tomcat服务器发布一个WEB项目教学导航教学目标了解XML的基本语法,并能够编写正确格式的XML.了解XML的约束.掌握XML的解析.熟练掌握并使用tomcat发布一个web应用了解HTTP协议及掌握HTTP协议中的常用的头信息.教学方法案例驱动法1.1 上次课内容回顾:JDBC : JDBC的概述: JDBC:Java Database Connectivity JDBC的API: Connection:连接. 获得连接.