我爱编程

Java篇-DBUtils与连接池

2018-08-09  本文已影响113人  TianTianBaby223

一 : 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操作后,怎样封装结果集.

其子类以及功能包括


子类功能列表

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 + "]";
    }
    
}
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
    public static void ArrayListHandler()throws SQLException {
        String sql = "select * from product";
        QueryRunner qr = new QueryRunner();
        List<Object[]> 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  
public static void BeanHandler() throws SQLException{
        
        String sql = "select * from product";
        QueryRunner qr = new QueryRunner();
        Product pro = qr.query(con, sql,new BeanHandler<Product>(Product.class));
        System.out.println(pro);
    }

打印

Product [id=1, pname=汉堡王大汉堡, price=23]
public static void BeanListHandler() throws SQLException{
        String sql = "select * from product";
        QueryRunner qr = new QueryRunner();
        List<Product> list = qr.query(con, sql,new BeanListHandler<Product>(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]
public static void columnListHandler() throws SQLException{
        String sql = "select * from product";
        
        QueryRunner qr = new QueryRunner();
        List<String> list = qr.query(con, sql,new ColumnListHandler<String>("pname"));
        for(Object obj : list) {
            System.out.println(obj);
        }
    }

打印

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

打印

6
public static void mapHandler() throws SQLException{
        String sql = "select * from product";
        QueryRunner qr = new QueryRunner();
        Map<String,Object> 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
public static void mapListHandler() throws SQLException{
        String sql = "select * from product";
        QueryRunner qr = new QueryRunner();
        List<Map<String,Object>> list = qr.query(con, sql, new MapListHandler());
        for(Map<String,Object> 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包
导入jar包
DataSource接口

DataSource是java中提供的连接池,作为DriverManager工具的代替项.
在DBCP提供接口的实现类, 我们要用的具体的连接池
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<Object[]> 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("数据查询失败");
        }
        
    }
} 
上一篇下一篇

猜你喜欢

热点阅读