美文网首页我爱编程
Java篇-DBUtils与连接池

Java篇-DBUtils与连接池

作者: TianTianBaby223 | 来源:发表于2018-08-09 15:14 被阅读113次

    一 : 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 + "]";
        }
        
    }
    
    • 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<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  
    
    • 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>(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<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]
    
    • ColumnListHandler
    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堡
    苹果笔记本
    板烧鸡腿堡
    牛油果热辣藤椒鸡超级可塔
    肯德基水果茶
    
    • 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<Long>());
            System.out.println(count);
            
        }
    

    打印

    6
    
    • MapHandler
    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
    
    • MapListHandler
    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类.

    • 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("数据查询失败");
            }
            
        }
    } 
    

    相关文章

      网友评论

        本文标题:Java篇-DBUtils与连接池

        本文链接:https://www.haomeiwen.com/subject/jxctbftx.html