2018-09-12DBUtils工具包+DBCP连接池

DBUtils和连接池:

如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,我们讲采用Apache Commons组件一个成员:DBUtils!

DBUtils就是JDBC的简化开发工具包,需要项目导入commons-dbutils-1.6.jar包!

Dbutils三个核心功能:

QueryRunner中提供对sql语句操作的API!

ResultSetHandler接口,用于定义Select操作后,怎样封装结果集!

DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法!

小题目:

注释和泛型不进.Calss文件!

Switch()小括号中可以使用Byte,Short,Char,int,String,Enum枚举等六种类型!

QueryRunner核心类:

Update(Connection conn, String sql, Object... params),用来完成表数据的增加,删除,更新操作!

Query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params),用来完成表数据的查询操作!

示例代码:

package com.oracle.dao;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import com.oracle.domain.Product;
import com.oracle.tools.DBUtils;
import com.oracle.tools.JDBCUtils;
public class ProductDao {
    Connection conn=JDBCUtils.getConn();
    public void addProduct() throws SQLException{
        QueryRunner qr=new QueryRunner();
        String sql="INSERT INTO PRODUCT(PID,PNAME) VALUES(?,?);";
        Object[] obj={"1234567","iphonexs"};
        qr.update(conn,sql,obj);
        //释放资源
        DbUtils.closeQuietly(conn);
    }
    
    public void editProduct() throws SQLException{
        QueryRunner qr=new QueryRunner();
        String sql="UPDATE PRODUCT SET PNAME=? WHERE PID=?";
        Object[] obj={"VIVOX10","1234567"};
        qr.update(conn,sql,obj);
        //释放资源
        DbUtils.closeQuietly(conn);
    }
    
    public void deleteProduct() throws SQLException{
        QueryRunner qr=new QueryRunner();
        String sql="DELETE FROM PRODUCT WHERE PID=?";
        qr.update(conn,sql,"1234567");
        //释放资源
        DbUtils.closeQuietly(conn);
    }
    
    //将结果中的第一行数据封装到Object数组中
    public void select1() throws SQLException{
        QueryRunner qr=new QueryRunner();
        String sql="SELECT * FROM PRODUCT";
        //new ArrayHandler(),虽然是SELECT *但是这个对象只会取第一条数据!
        Object[] obj=qr.query(conn, sql, new ArrayHandler());
        for(Object Ob:obj){
            System.out.print(Ob+" ");
        }
    }
    
    public void select2() throws SQLException{
        QueryRunner qr=new QueryRunner();
        String sql="SELECT * FROM PRODUCT";
        //new ArrayListHandler()将结果集中每一行都封装到一个Object[]中,然后放入一个List<Object[]>中
        List<Object[]> list=qr.query(conn, sql, new ArrayListHandler());
        for(Object[] Obo:list){
            for(Object Obi:Obo){
                System.out.print(Obi+"	");
            }
            System.out.println();
        }
    }
    
    //JavaBean:BeanHandler!将结果集中第一条记录封装到JavaBean中:
    public void select3() throws SQLException{
        QueryRunner qr=new QueryRunner();
        String sql="SELECT * FROM PRODUCT WHERE PID=?";
        //传给泛型,和字节码文件对象!
        //前提JavaBean必须有空参构造,和Set方法!
        Product product=qr.query(conn, sql, new BeanHandler<Product>(Product.class),2);
        System.out.println(product);
        DbUtils.closeQuietly(conn);
    }
    
    //BeanListHandler:先将结果集中的每一条记录封装到指定的JavaBean中,然后将每一个JavaBean封装到List集合中!
    public void select4() throws SQLException{
        QueryRunner qr=new QueryRunner();
        String sql="SELECT * FROM PRODUCT";
        //传给泛型,和字节码文件对象!
        //前提JavaBean必须有空参构造,和Set方法!
        List<Product> list=qr.query(conn, sql, new BeanListHandler<Product>(Product.class));
        //遍历:
        for(Product pro:list){
            System.out.println(pro);
        }
        DbUtils.closeQuietly(conn);
    }
    
    public void select5() throws SQLException{
        QueryRunner qr=new QueryRunner();
        String sql="SELECT * FROM PRODUCT";
        //将结果集中的指定类封装到List集合中!
        List<String> list=qr.query(conn,sql,new ColumnListHandler<String>("pname"));
        //遍历:
        for(String pro:list){
            System.out.println(pro);
        }
        DbUtils.closeQuietly(conn);
    }
    
    public void select6() throws SQLException{
        QueryRunner qr=new QueryRunner();
        String sql="SELECT COUNT(*) FROM PRODUCT";
        long count=qr.query(conn,sql,new ScalarHandler<Long>());
        System.out.println(count);
        DbUtils.closeQuietly(conn);
    }
    
    public void select7() throws SQLException{
        QueryRunner qr=new QueryRunner();
        String sql="SELECT * FROM PRODUCT";
        Map<String,Object> map=qr.query(conn,sql,new MapHandler());
        //遍历
        Set<Map.Entry<String,Object>> set=map.entrySet();
        for(Map.Entry<String,Object> entry:set){
            System.out.println(entry.getKey()+"…"+entry.getValue());
        }
        DbUtils.closeQuietly(conn);
    }
    
    public void select8() throws SQLException{
        QueryRunner qr=new QueryRunner(DBUtils.getDataSource());
        String sql="SELECT * FROM PRODUCT";
        List<Map<String,Object>> list=qr.query(sql,new MapListHandler());
        //遍历
        for(Map<String,Object> map:list){
            Set<Map.Entry<String,Object>> set=map.entrySet();
            for(Map.Entry<String,Object> entry:set){
                System.out.println(entry.getKey()+"…"+entry.getValue());
            }
        }
        DbUtils.closeQuietly(conn);
    }
}

package com.oracle.web;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.oracle.dao.ProductDao;
public class TestServlet extends HttpServlet {
    ProductDao productDao=new ProductDao();
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*try {
            productDao.addProduct();
        } catch (SQLException e){
            e.printStackTrace();
        }*/
        /*try {
            productDao.editProduct();
        } catch (SQLException e) {
            e.printStackTrace();
        }*/
        /*try {
            productDao.deleteProduct();
        } catch (SQLException e) {
            e.printStackTrace();
        }*/
        
        /*try {
            productDao.select1();
        } catch (SQLException e) {
            e.printStackTrace();
        }*/
        
        /*try {
            productDao.select2();
        } catch (SQLException e){
            e.printStackTrace();
        }*/
        
        /*try {
            productDao.select3();
        } catch (SQLException e){
            e.printStackTrace();
        }*/
        
        /*try {
            productDao.select4();
        } catch (SQLException e){
            e.printStackTrace();
        }*/
        
        /*try {
            productDao.select5();
        } catch (SQLException e) {
            e.printStackTrace();
        }*/
        
        /*try {
            productDao.select6();
        } catch (SQLException e) {
            e.printStackTrace();
        }*/
        
        /*try {
            productDao.select7();
        } catch (SQLException e) {
            e.printStackTrace();
        }*/
        
        try {
            productDao.select8();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

//JavaBean即Domain中的实体类!

//自学C3P0连接池!

连接池:

用池来管理Connection,这样可以重复使用Connection!有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象!当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池!池就可以再利用这个Connection对象了!

//相当于线程池的概念,打开Connection和关闭Connection都会消耗系统资源!

导入Jar包:

模板DBUtils的Tools类:

public class JDBCUtils {
    public static final String DRIVER = "com.mysql.jdbc.Driver";
    public static final String URL = "jdbc:mysql://localhost:3306/daydb";
    public static final String USERNAME = "root";
    public static final String PASSWORD = "root";
    /*
     * 创建连接池BasicDataSource
     */
    public static BasicDataSource dataSource = new BasicDataSource();
    //静态代码块
    static {
        //对连接池对象 进行基本的配置
        dataSource.setDriverClassName(DRIVER); // 这是要连接的数据库的驱动
        dataSource.setUrl(URL); //指定要连接的数据库地址
        dataSource.setUsername(USERNAME); //指定要连接数据的用户名
        dataSource.setPassword(PASSWORD); //指定要连接数据的密码
    }
    /*
     * 返回连接池对象
     */
    public static DataSource getDataSource(){
        return dataSource;
    }
}

补充内容后的DBUtils类:

package com.oracle.tools;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
public class DBUtils {
        public static final String DRIVER = "com.mysql.jdbc.Driver";
        public static final String URL = "jdbc:mysql://localhost:3306/store_v1.0";
        public static final String USERNAME = "root";
        public static final String PASSWORD = "0129";
        /*
         * 创建连接池BasicDataSource
         */
        public static BasicDataSource dataSource = new BasicDataSource();
        //静态代码块
        static{
            //对连接池对象 进行基本的配置
            dataSource.setDriverClassName(DRIVER); // 这是要连接的数据库的驱动
            dataSource.setUrl(URL); //指定要连接的数据库地址
            dataSource.setUsername(USERNAME); //指定要连接数据的用户名
            dataSource.setPassword(PASSWORD); //指定要连接数据的密码
        }
        /*
         * 返回连接池对象
         */
        public static DataSource getDataSource(){
            return dataSource;
        }
        
        public static Connection getConn(){
            Connection conn=null;
             try {
                conn=dataSource.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return conn;
        }
}

常见配置项:

分类

属性

描述

必须项

driverClassName

数据库驱动名称

url

数据库的地址

username

用户名

password

密码

基本项(扩展)

maxActive

最大连接数量

minIdle

最小空闲连接

maxIdle

最大空闲连接

initialSize

初始化连接

原文地址:https://www.cnblogs.com/postgredingdangniu/p/9635136.html