• 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

  • 相关阅读:
    [原]Unity3D深入浅出
    [原]Unity3D深入浅出
    [原]Unity3D深入浅出
    [原]Unity3D深入浅出
    [原]Unity3D深入浅出
    [原]Unity3D深入浅出
    [原]Unity3D深入浅出
    SSH 远程端口转发
    SSH 本地端口转发
    SSH执行远程命令和传送数据
  • 原文地址:https://www.cnblogs.com/hzhjxx/p/10280748.html
Copyright © 2020-2023  润新知