up:: C3P0连接池入门

Apache Commons DBUtils目的就一个:简化JDBC的操作。

具体就是:连接池负责创建数据库连接;Commons DBUtils负责简化增删改查;


JDBC的开发需要五个步骤:加载并注册JDBC驱动,创建数据库连接,创建Statement对象,遍历查询结果,关闭连接、释放资源;这个过程还是比较麻烦的。Apache Commons DBUtils就是提供了JDBC代码的封装。


1.下载Commons DBUtils


2.Commons DBUtils引用到工程中

(1)先把jar包复制进lib目录下;(2)将jar包引入到工程中去。

前面有一样的操作。这儿就重复不详细说明了。


3.Commons DBUtils使用:数据查询操作(与Druid连接池结合)

Commons DBUtils默认是支持Druid和C3P0这样的数据库连接池的;

DBUtilsSample类:query()方法

    package com.imooc.jdbc.sample;
 
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    import com.imooc.jdbc.hrapp.entity.Employee;
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanListHandler;
 
    import javax.sql.DataSource;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.net.URLDecoder;
    import java.util.List;
    import java.util.Properties;
 
    /**
     * Apache Commons DBUtils + Druid联合使用演示
     */
    public class DBUtilsSample {
        private static void query(){
            Properties properties = new Properties();
            String propertiesFile = DBUtilsSample.class.getResource("/druid-config.properties").getPath();
            try {
                propertiesFile = new URLDecoder().decode(propertiesFile, "UTF-8");
                properties.load(new FileInputStream(propertiesFile));
                DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
                // 下面就演示如何使用Commons DBUtils快速完成数据的参数化查询了
                //QueryRunner翻译过来就是“查询执行者”
                QueryRunner qr = new QueryRunner(dataSource);//QueryRunner就知道向哪一个数据库来进行读取或者写入了;
                //BeanListHandler<>():帮助我们自动的将结果转换为对应的实体类;
                //下面这句话的意思是:执行第一个参数的SQL语句,将执行结果包装成一个List对象,这个List中每一个记录都是一个Employee实体类对象;
                // 这个实体类属性必须要和数据表中的字段名称完全相同!!!(这个条件有点严格。)
                // 第三个参数new Object[]{10}是给第一个参数中的?赋值的;
                List<Employee> list = qr.query("select * from employee limit ?,10", new BeanListHandler<>(Employee.class), new Object[]{10});
                for (Employee emp : list) {
                    System.out.println(emp.getEname());
                }
                //在上面的过程中,并没有任何涉及到任何连接(Connection)的操作。在执行qr.query()时,Commons DBUtils会创建一个连接,当把这
                // 个查询方法qr.query()执行完毕后,连接就会自动的被关闭,并不需要我们手动的介入。。。
                // 所以,我们不需要手动关闭连接的那些东西。
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
 
        public static void main(String[] args) {
            query();
        }
    }
 

DBUtilsSample类需要注意的点:

(1) qr.query()方法:第一参数是查询语句;第二个参数告诉我们查询到的每一个记录要转换成什么类的实体对象;第三个参数是一个Object数组,对应了第一个参数所需的?;

(2) 实体类属性必须要和数据表中的字段名称完全相同!!!(这个条件有点严格。)

(3) Commons DBUtils的使用需要:DataSource对象;;;DataSource这个对象,Druid和C3P0这些数据库连接池都可以提供。 _ 那么,Commons DBUtils必须要和数据库连接池配合才能使用????_

解答:大概是的,连接池负责数据库连接,Commons DBUtils负责简化查询。

(4) 看图,QueryRunner就是Commons DBUtils的一个类;

(5) 在上面的过程中,并没有任何涉及到任何连接(Connection)的操作。在执行qr.query()时,Commons DBUtils会创建一个连接(当然在上面的例子中,这个连接是直接从连接池中取的),当把这个查询方法qr.query()执行完毕后,连接就会自动的被关闭,并不需要我们手动的介入。。。所以,我们不需要手动关闭连接的那些东西。

运行结果:


4.Commons DBUtils使用:数据更新(新增、修改、删除)操作(与Druid连接池结合)

DBUtilsSample类:update方法

    package com.imooc.jdbc.sample;
 
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    import com.imooc.jdbc.hrapp.entity.Employee;
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanListHandler;
 
    import javax.sql.DataSource;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.net.URLDecoder;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.List;
    import java.util.Properties;
 
    /**
     * Apache Commons DBUtils + Druid联合使用演示
     */
    public class DBUtilsSample {
 
 
        /**
         * 更新操作
         */
        public  static void update(){
            Properties properties = new Properties();
            String propertiesFile = DBUtilsSample.class.getResource("/druid-config.properties").getPath();
            Connection conn = null;
            try {
                propertiesFile = new URLDecoder().decode(propertiesFile, "UTF-8");
                properties.load(new FileInputStream(propertiesFile));
                DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
                // 写操作离不开事务,而事务又是基于连接的,所以这儿不许先获取连接
                conn = dataSource.getConnection();
                conn.setAutoCommit(false);//将自动提交关闭。这样以后,才能手动管理事务
                String sql1 = "update employee set salary=salary+1000 where eno=?";
                String sql2 = "update employee set salary=salary-500 where eno=?";
                QueryRunner qr = new QueryRunner();// 在数据写入的时候,是不需要DataSource数据源对象的;
                //update()方法可以用于,新增、更新、删除;
                qr.update(conn, sql1,new Object[]{1000});
                qr.update(conn, sql2, new Object[]{1001});
                conn.commit();
            }catch (Exception e) {
                e.printStackTrace();
                try {
                    if (conn != null && !conn.isClosed() ){
                        conn.rollback();
                    }
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
 
            }finally {
                try {
                    if (conn != null && !conn.isClosed()) {
                        conn.close();//对数据库连接进行回收
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
 
 
        public static void main(String[] args) {
            update();
        }
    }
 

几点说明:

(1)更新操作需要手动控制事务,所系需要获取连接Connection对象;

(2) 更新操作和查询操作有些许不同;

目前,有很多公司,对【Apache Commons DBUtils】进行了二次封装,直接用在项目中,完成对数据的交互操作。即【Apache Commons DBUtils】这个东西还是不错的,有很多地方在用啦。


注:这些东西原理不复杂,但是需要在实际使用中熟练,然后才能得心应手。。。