zoukankan      html  css  js  c++  java
  • DBUtils和连接池

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。

    官网地址  http://commons.apache.org/

    详解文章:https://blog.csdn.net/HaHa_Sir/article/details/79583627

    常用组件:

     

    1Dbutils

    只使用JDBC进行开发冗余代码过多

    DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。

    DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。

     

    1.1 Dbutils三个核心功能

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

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

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

    1.2 QueryRunner核心类

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

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

     

    1.2.1添加、更新、删除

    例:

    java项目,导入mysql的工具包和dbutils的jar包

      

    import java.sql.Connection;
    import java.sql.SQLException;
    import org.apache.commons.dbutils.DbUtils;
    import org.apache.commons.dbutils.QueryRunner;
    import com.shopping.tools.JDBCUtils;
    
    public class Demo01 {
        public static void main(String[] args) throws SQLException {
            add();
        }
        
        //对sort表添加数据
        public static void add() throws SQLException{
            //获得连接对象
            Connection conn=JDBCUtils.getConn();
            //获得语句执行对象
            QueryRunner qr=new QueryRunner();
            String sql="insert into sort values(?,?,?)";
            //封装传入的实际参数
            Object[] obj={13,"水杯","喝水"};
            int row=qr.update(conn,sql,obj);
            System.out.println(row);
            //关闭资源
            DbUtils.close(conn);
        }
        
        //修改数据
        public static void update() throws SQLException{    
            Connection conn=JDBCUtils.getConn();
            QueryRunner qr=new QueryRunner();
            String sql="update sort set sname=?,sdesc=? where sid=?";
            int row=qr.update(conn, sql, "遥控器","开电视",13);
            System.out.println(row);    
            DbUtils.close(conn);        
        }
        
        //删除数据
        public static void delete() throws SQLException{
            Connection conn=JDBCUtils.getConn();
            QueryRunner qr=new QueryRunner();
            String sql="DELETE FROM sort WHERE sid=?";
            qr.update(conn,sql,13);
            DbUtils.close(conn);
        }    
    }

     add()方法结果:

     

     

    update()方法结果:

     

     

    delete()方法结果:

     

     

    1.2.2 查询

    ResultSetHandler结果集处理类:

    ArrayHandler

    将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值

    ArrayListHandler

    将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。

    BeanHandler

    将结果集中第一条记录封装到一个指定的javaBean中。

    BeanListHandler

    将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中

    ColumnListHandler

    将结果集中指定的列的字段值,封装到一个List集合中

    ScalarHandler

    它是用于单数据。例如select count(*) from 表操作。

    MapHandler

    将结果集第一行封装到Map<String,Object>集合中,Key 列名, Value 该列数据

    MapListHandler

    将结果集每一行封装到List<Map<String,Object>>集合中,Key 列名, Value 该列数据,Map集合存储到List集合

     

    实体类:

    JavaBean是一个类,在开发中常用封装数据

    1需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序。

    2提供私有字段:private 类型 字段名;

    3提供getter/setter方法:

    4提供无参构造

     

    例:

    Sort实体类:

    public class Sort {
        private int sid;
        private String sname;
        private String sdesc;
        public int getSid() {
            return sid;
        }
        public void setSid(int sid) {
            this.sid = sid;
        }
        public String getSname() {
            return sname;
        }
        public void setSname(String sname) {
            this.sname = sname;
        }
        public String getSdesc() {
            return sdesc;
        }
        public void setSdesc(String sdesc) {
            this.sdesc = sdesc;
        }
        @Override
        public String toString() {
            return "Sort [sid=" + sid + ", sname=" + sname + ", sdesc=" + sdesc + "]";
        }    
    }

    class Demo02

    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.shopping.tools.JDBCUtils;
    
    public class Demo02 {
        private static Connection conn=JDBCUtils.getConn();
        private static QueryRunner qr=new QueryRunner();    
        
        public static void main(String[] args) throws SQLException {
            get1();
        }
        
        //查询数据ArrayHandler
        public static void get1() throws SQLException{        
            String sql="select * from sort where sid>?";
            Object[] obj=qr.query(conn, sql, new ArrayHandler(),2); //取结果集的第一条记录
            for(Object o:obj){
                System.out.print(o+" ");
            }
            DbUtils.close(conn);
        }
        
        //查询数据ArrayListHandler
        public static void get2() throws SQLException{        
            String sql="SELECT * FROM sort";
            List<Object[]> list=qr.query(conn, sql, new ArrayListHandler());
            for(Object[] objs:list){
                for(Object o:objs){
                    System.out.print(o+" ");
                }
                System.out.println();
            }
        }
        
        //BeanHandler
        public static void get3() throws SQLException{
            String sql="SELECT * FROM sort where sid=?";
            Sort sort=qr.query(conn,sql,new BeanHandler<Sort>(Sort.class),6);
            System.out.println(sort);
        }
        
        //BeanListHandler
        public static void get4() throws SQLException{
            String sql="SELECT * FROM sort";
            List<Sort> list=qr.query(conn,sql,new BeanListHandler<Sort>(Sort.class));
            for(Sort s:list){
                System.out.println(s);
            }
        }
        
        //ColumnListHandler只查询某一列
        public static void get5() throws SQLException{
            String sql="select sname from sort";
            List<String> list=qr.query(conn,sql,new ColumnListHandler<String>());
            for(String s:list){
                System.out.println(s);
            }
        }
        
        //ScalarHandler单数据
        public static void get6() throws SQLException{
            String sql="SELECT COUNT(*) FROM sort";
            long count=qr.query(conn,sql,new ScalarHandler<Long>()); //注意是long类型
            System.out.println(count);
        }
        
        //MapHandler
        public static void get7() throws SQLException{
            String sql="SELECT * FROM sort";
            Map<String,Object> map=qr.query(conn,sql,new MapHandler());
            Set<String> set=map.keySet();
            for(String s:set){
                System.out.println(s+"..."+map.get(s));
            }
        }
        
        //MapListHandler
        public static void get8() throws SQLException{
            String sql="SELECT * FROM sort";
            List<Map<String,Object>> list=qr.query(conn,sql,new MapListHandler());
            for(Map<String,Object> map:list){
                Set<String> s=map.keySet();
                for(String str:s){
                    System.out.print(str+"..."+map.get(str)+" ");
                }
                System.out.println();            
            }
        }
    }

     get1()方法结果:

      

    get2()方法结果:

      

    get3()方法结果:

      

    get4()方法结果:

      

    get5()方法结果:

      

    get6()方法结果:

     

    get7()方法结果:

      

    get8()方法结果:

     

    2连接池

    实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,

    为了解决此类性能问题,采用连接池技术,来共享连接Connection

    这样就不需要每次都创建连接、释放连接了,这些操作都交给了连接池。

    2.1原理

    用池来管理Connection,这样可以重复使用Connection

    有了池,就不用自己来创建Connection,而是通过池来获取Connection对象。

    当使用完Connection后,调用Connectionclose()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。

     

    2.2规范

    Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池。

    常见的连接池:DBCPC3P0

    2.3 DBCP连接池 

    2.3.1导入jar

     

    2.3.2 编写工具类:

    DBUtils:

    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/market0929?useUnicode=true&characterEncoding=UTF-8";
        public static final String USERNAME = "root";
        public static final String PASSWORD = "123456";
        /*
         * 创建连接池BasicDataSource
         */
        //创建连接池对象
        public static BasicDataSource dataSource = new BasicDataSource(); //导的引入的jar包
        //静态代码块(只运行一次)
        static {
            //对连接池对象 进行基本的配置
            dataSource.setDriverClassName(DRIVER); // 这是要连接的数据库的驱动
            dataSource.setUrl(URL); //指定要连接的数据库地址
            dataSource.setUsername(USERNAME); //指定要连接数据的用户名
            dataSource.setPassword(PASSWORD); //指定要连接数据的密码
        }
        /*
         * 返回连接池对象
         */
        public static DataSource getDataSource(){ //导sql包
            return dataSource;
        }    
    }

    测试类:(以后DAO层的代码都这样写

    import java.sql.SQLException;
    import java.util.List;
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanHandler;
    import org.apache.commons.dbutils.handlers.BeanListHandler;
    import com.shopping.tools.DBUtils;
    
    public class Demo03 {
        public static void main(String[] args) throws SQLException {
            get4();
        }
    
        private static QueryRunner qr = new QueryRunner(DBUtils.getDataSource());
    
        // BeanHandler
        public static void get3() throws SQLException {
            String sql = "SELECT * FROM sort where sid=?";
            Sort sort = qr.query(sql, new BeanHandler<Sort>(Sort.class), 6);
            System.out.println(sort);
        }
    
        // BeanListHandler
        public static void get4() throws SQLException {
            String sql = "SELECT * FROM sort";
            List<Sort> list = qr.query(sql, new BeanListHandler<Sort>(Sort.class));
            for (Sort s : list) {
                System.out.println(s);
            }
        }
    }

    2.3.3常见配置项

    分类

    属性

    描述

    必须项

    driverClassName

    数据库驱动名称

    url

    数据库的地址

    username

    用户名

    password

    密码

    基本项(扩展)

    maxActive

    最大连接数量

    minIdle

    最小空闲连接

    maxIdle

    最大空闲连接

    initialSize

    初始化连接

    扩展项

    maxWait

    超时等待时间以毫秒为单位 1000等于1

    (基本项和扩展项需要项目经理来配置,普通开发者只负责必须项)

    参考:http://commons.apache.org/proper/commons-dbcp/configuration.html

  • 相关阅读:
    「UVA12293」 Box Game
    「CF803C」 Maximal GCD
    「CF525D」Arthur and Walls
    「CF442C」 Artem and Array
    LeetCode lcci 16.03 交点
    LeetCode 1305 两棵二叉搜索树中的所有元素
    LeetCode 1040 移动石子直到连续 II
    LeetCode 664 奇怪的打印机
    iOS UIPageViewController系统方法崩溃修复
    LeetCode 334 递增的三元子序列
  • 原文地址:https://www.cnblogs.com/hzhjxx/p/10280748.html
Copyright © 2011-2022 走看看