Java篇-DBUtils与连接池

一 : DBUtils

DBUtils就是为了简化JDBC的快发而产生的开发工具包.对JDBC的一种封装.

核心功能

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

update(Connection conn, String sql, Object... params) 用来完成数据表的增删改操作.

增添

//增
    public static void insert() throws SQLException{
    
    Object[] par = {"牛油果热辣藤椒鸡超级可塔",23.5};
        
    String sql = "insert into product (pname,price) values (?,?)";
    QueryRunner qr = new QueryRunner();
    int row = qr.update(con, sql, par);
    System.out.println(row);
    DbUtils.close(con);
    
    }

删除

//删
    public static void delete() throws SQLException{
        String sql = "delete from product where id = ?";
        QueryRunner qr = new QueryRunner();
        int row = qr.update(con, sql, 4);
        System.out.println(row);
        DbUtils.close(con);
        
    }

更改

//改
    public static void update() throws SQLException{
        
        Object[] par = {"肯德基CP堡",28.5,2};
        String sql = "update product set pname = ?,price = ? where id = ?";
        QueryRunner qr = new QueryRunner();
        int row = qr.update(con, sql, par);
        System.out.println(row);
        DbUtils.close(con);
        
    }
2. ResultSetHandler接口,用于定义select操作后,怎样封装结果集.

其子类以及功能包括


Java篇-DBUtils与连接池_第1张图片
子类功能列表

JavaBean 介绍,好像是我们通常用的mvc中model模型,其实就是一个类,
提供私有字段 : private类型 字段名;
提供getter/setter方法;
提供无参构造器,注意:无参构造器一定要提供否则会报错.
也可以实现java.io.Serializable接口

package com.tiantianBaby.java;

public class Product {
    
    private int id;
    private String pname;
    private String price;
    public Product() {
        
    }
    public Product(int id, String pname, String price) {
        super();
        this.id = id;
        this.pname = pname;
        this.price = price;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getPname() {
        return pname;
    }
    public void setPname(String pname) {
        this.pname = pname;
    }
    public String getPrice() {
        return price;
    }
    public void setPrice(String price) {
        this.price = price;
    }
    @Override
    public String toString() {
        return "Product [id=" + id + ", pname=" + pname + ", price=" + price + "]";
    }
    
}
  • ArrayHandler
public static void arrayHander() throws SQLException{
        String sql = "select * from product";
        QueryRunner qr = new QueryRunner();
        Object[] arr = qr.query(con, sql, new ArrayHandler());
        for(Object obj : arr){
            System.out.println(obj);
        }
    }

打印

1
汉堡王大汉堡
23.0

  • ArrayListHandler:
//ArrayListHandler
    public static void ArrayListHandler()throws SQLException {
        String sql = "select * from product";
        QueryRunner qr = new QueryRunner();
        List list = qr.query(con, sql,new ArrayListHandler());
        for(Object[] itemarr : list) {
            for(Object obj:itemarr) {
                System.out.print(obj+"  ");
            }
            System.out.println();
        }
        
    }

打印

1  汉堡王大汉堡  23.0  
2  肯德基CP堡  28.5  
3  苹果笔记本  14000.0  
6  板烧鸡腿堡  18.0  
7  牛油果热辣藤椒鸡超级可塔  23.5  
8  肯德基水果茶  11.8  
  • BeanHandler
public static void BeanHandler() throws SQLException{
        
        String sql = "select * from product";
        QueryRunner qr = new QueryRunner();
        Product pro = qr.query(con, sql,new BeanHandler(Product.class));
        System.out.println(pro);
    }

打印

Product [id=1, pname=汉堡王大汉堡, price=23]
  • BeanListHandler
public static void BeanListHandler() throws SQLException{
        String sql = "select * from product";
        QueryRunner qr = new QueryRunner();
        List list = qr.query(con, sql,new BeanListHandler(Product.class));
        for(Product p : list) {
            System.out.println(p);
        }
    }

打印

Product [id=1, pname=汉堡王大汉堡, price=23]
Product [id=2, pname=肯德基CP堡, price=28.5]
Product [id=3, pname=苹果笔记本, price=14000]
Product [id=6, pname=板烧鸡腿堡, price=18]
Product [id=7, pname=牛油果热辣藤椒鸡超级可塔, price=23.5]
Product [id=8, pname=肯德基水果茶, price=11.8]
  • ColumnListHandler
public static void columnListHandler() throws SQLException{
        String sql = "select * from product";
        
        QueryRunner qr = new QueryRunner();
        List list = qr.query(con, sql,new ColumnListHandler("pname"));
        for(Object obj : list) {
            System.out.println(obj);
        }
    }

打印

汉堡王大汉堡
肯德基CP堡
苹果笔记本
板烧鸡腿堡
牛油果热辣藤椒鸡超级可塔
肯德基水果茶
  • ScalarHandler
    public static void ScalarHandler() throws SQLException {
        String sql = "select count(*) from product";
        QueryRunner qr = new QueryRunner();
        long count = qr.query(con, sql,new ScalarHandler());
        System.out.println(count);
        
    }

打印

6
  • MapHandler
public static void mapHandler() throws SQLException{
        String sql = "select * from product";
        QueryRunner qr = new QueryRunner();
        Map map = qr.query(con, sql,new MapHandler());

        for(String str : map.keySet()) {
            System.out.println(str+"---"+map.get(str));
        }
    }

打印

id---1
pname---汉堡王大汉堡
price---23.0
  • MapListHandler
public static void mapListHandler() throws SQLException{
        String sql = "select * from product";
        QueryRunner qr = new QueryRunner();
        List> list = qr.query(con, sql, new MapListHandler());
        for(Map map : list) {
            
            for(String key : map.keySet()) {
                System.out.print(key+"---"+map.get(key)+"  ");
            }
            System.out.println();
        }
    }

打印

id---1  pname---汉堡王大汉堡  price---23.0  
id---2  pname---肯德基CP堡  price---28.5  
id---3  pname---苹果笔记本  price---14000.0  
id---6  pname---板烧鸡腿堡  price---18.0  
id---7  pname---牛油果热辣藤椒鸡超级可塔  price---23.5  
id---8  pname---肯德基水果茶  price---11.8  
3. DbUtils类,提供了关闭资源与实务的处理方法
    DbUtils.close(con);

二 : 连接池

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

在开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,所以通常用连接池结束,来共享连接Connection.这样就不用每次都创建连接,释放链接了,这些操作都交给连接池.

DBCP连接池

DBCP是一个开源的连接池,是Apache Common成员之一,在企业开发中也比较常见,tomcat内置的连接池.

导入jar包
Java篇-DBUtils与连接池_第2张图片
导入jar包
DataSource接口

DataSource是java中提供的连接池,作为DriverManager工具的代替项.
在DBCP提供接口的实现类, 我们要用的具体的连接池
BasicDataSource类.

  • BasicDataSource类的常见配置
分类 属性 描述
driverClassName 数据库驱动名称
url 数据库的地址
username 用户名
password 密码
maxActive 最大连接数量
minActive 最小连接数量
maxIdle 最大空闲连接
minIdle 最小空闲连接
initialSize 初始化连接

连接

public class DataSourceDemo {
  public static void main(String[] args) {
    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/javadatabase");
    dataSource.setUsername("root");
    dataSource.setPassword("newpass");
    
    try {
        Connection con = dataSource.getConnection();
        System.out.println(con);
    } catch (SQLException e) {
        //      e.printStackTrace();
        throw new RuntimeException("数据库连接失败");
    }
  }
}


封装工具类

其中地址url,用户名和密码,都可以用文件进行动态配置.

public class JDBCUtils {

    
    private static BasicDataSource datasource = new BasicDataSource();
    
    static{
        //数据库连接信息,必须的
        datasource.setDriverClassName("com.mysql.jdbc.Driver");
        datasource.setUrl("jdbc:mysql://localhost:3306/javadatabase");
        datasource.setUsername("root");
        datasource.setPassword("newpass");
        //对象连接池中的连接数量配置,可选的
        datasource.setInitialSize(10);//初始化的连接数
        datasource.setMaxActive(8);//最大连接数量
        datasource.setMaxIdle(5);//最大空闲数
        datasource.setMinIdle(1);//最小空闲
    }
    public static DataSource getDataSource() {
        
        return datasource;
            
    }
}
测试工具类
public class QueryRunnerTest {

    public static void main(String[] args) {
//      select();
        insert();
    }
    
    private static QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
    
    
    
    public static void insert() {
        String sql = "insert into product (pname,price) values(?,?)";
        Object[] parms = {"肯德基水果茶","11.8"};
        
        try {
            int row = qr.update(sql,parms);
            System.out.println(row);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            throw new RuntimeException("数据添加失败");
        }
        
        
    }
    
    
    public static void select() {
        String sql = "select * from product";
        try {
            List list = qr.query(sql, new ArrayListHandler());
            for(Object[] obs : list) {
                for(Object item : obs) {
                    System.out.print(item + "\t");
                }
                System.out.println();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            throw new RuntimeException("数据查询失败");
        }
        
    }
} 

你可能感兴趣的:(Java篇-DBUtils与连接池)