06、连接池 DBUtils工具类

169 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第31天,点击查看活动详情

06、连接池 DBUtils工具类

01.连接池_概念:池:它是一个"容器",里面可以装载很多的连接对象(Connection)。当有用户需要使用时,就分配一个。当它使用完毕时,再归还到

    1).什么是连接容器中,这样可以反复使用,大大提高程序的运行效率。这个容器就是:连接池。

    2).第三方的连接池:

        1).DBCP连接池:Apache公司出品。免费、开源的。Tomcat内部使用的连接池。

        2).C3P0连接池【重点掌握】:国际上比较出名的一个连接池工具。Spring、Hibernate内部使用的连接池。

    3).注意:任何公司提供的连接池必须实现:javax.sql.DataSource(接口)

02.连接池_DBCP连接池的使用:

    1).复制所需jar包到项目目录下,并添加到构建路径:

        commons-dbcp-1.4.jar

        commons-pool-1.6.jar

    2).复制所需的配置文件(dbcpconfig.properites)到src目录下(安全)。

        【需要掌握】

        1).文件名和位置(建议src下)可以变.

        2).要掌握里面的四个必须配置:

            driverClassName=com.mysql.jdbc.Driver
            url=jdbc:mysql://localhost:3306/day19_db
            username=root
            password=123

           注意:"键"名不要更改,因为这是DBCP内部自动寻找的。

                 "值"要根据自己的情况会更改。

    3).使用细节:

        //1.读取配置文件
        Properties pro = new .....;
        pro.load(Demo.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));//自动从src目录下找这个配置文件
        //2.创建连接池对象
        DataSource ds = BasicDataSourceFactory.createDataSource(pro);//只有这里用到了DBCP库中的类,其它地方没有了

        //3.通过连接池,获取Connection对象
        Connection conn = ds.getConnection();
        ......
        //4.释放资源
        ......
        conn.close();//不是关闭,是回收

03.连接池_C3P0连接池的使用:

    1).复制所需jar包到项目目录下,并添加到构建路径:

        c3p0-0.9.2-pre5.jar

        mchange-commons-java-0.2.3.jar

    2).复制所需的配置文件(c3p0-config.xml)到src目录下:

        【需要掌握】

        1).文件名和位置不可以更改,因为是由C3P0连接池内部自动查找的。

            文件名必须叫:c3p0-config.xml

            位置必须在:src目录下

        2).能够识别出里面的"默认配置"和"命名配置"即可。

        3).能够修改里面的四个必须的配置项:

            <property name="driverClass">com.mysql.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/hei70_day21db_1</property>
            <property name="user">root</property>
            <property name="password">123</property>

    3).使用细节:

        //1.直接创建连接池对象
        DataSource ds = new ComboPooledDataSource();//读取默认配置
        DataSource ds = new ComboPooledDataSource("itcast");//读取命名配置---只有这里用到一次C3P0的类:ComboPooledDataSource,其它地方没有。
        //2.获取连接对象
        Connection conn = ds.getConnection();
        ......
        //6.关闭资源
        ......
        conn.close();//不是关闭,是回收

04.DBUtils工具类_JavaBean在企业级开发的作用:

    1).JavaBean作用:用于封装一条数据。例如:Student类就是一个JavaBean,用来封装一个学员的所有信息的。

    2).使用JavaBean封装结果集的示例:

        //1从数据库读取信息
        DataSource ds = new ComboPooledDataSource();
        Connection conn = ds.getConnection();
        String sql = "select * from product";
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        List<Product> proList = new ArrayList<>();
        while(rs.next()){--这个封装的过程比较繁琐,如果字段多,封装会很麻烦,所以可以使用DBUtils工具包
            //一条数据封装到一个JavaBean中
            Product pro = new Product();
            pro.setPid(rs.getInt("pid"));
            pro.setPname(rs.getString("pname"));
            pro.setPrice(rs.getInt("price"));
            pro.setCid(rs.getInt("cid"));

            //将JavaBean存储到集合中
            proList.add(pro);
        }
        rs.close();
        stmt.close();
        conn.close();

05.DBUtils工具类_概念:

    1).什么是DBUtils工具包:它是一个第三方的开发包,由Apache公司开发,内部封装了大量对JDBC操作的一些方法。

                            可以简化我们数据库的开发。

    2).DBUtils的核心类:

        1).QueryRunner(类)【最重要的】:作用:发送SQL语句,并封装结果集;

        2).ResultSetHandler(接口) : 作用:它有一些子类,可以告诉QueryRunner对象怎样封装结果集。

06.DBUtils工具类_使用DBUtils实现添加_修改_删除:

    1).复制所需jar包到项目目录下,并添加到构建路径:

        commons-dbutils-1.4.jar

       注意:

       1).要使用DBUtils,由于它需要连接池,所以也同时需要C3P0的jar包。

       2).以及MySQL的驱动包。

    2).实现细节:

        定义一个工具类,确保整个项目只有一个连接池对象:
        public class JDBCUtils {
            //成员属性,直接new出来,读取默认配置
            private static DataSource ds = new ComboPooledDataSource();

            //公有静态方法,获取连接池对象
            public static DataSource getDataSource(){
                return ds;
            }
        }
        -------------------------------------------------------------------------------------------------
        //添加
        public void add() throws SQLException {
            //1.构造一个QueryRunner对象
            QueryRunner qr = new QueryRunner(new ComboPooledDataSource());//使用连接池构造
            //2.执行添加
            String sql = "insert into product values(null,?,?,?)";
            int row = qr.update(sql, "奔驰汽车",480000,1);
            System.out.println("添加影响的行数:" + row);
        }
        //修改
        public void update() throws SQLException{
            //1.构造一个QueryRunner对象
            QueryRunner qr = new QueryRunner(new ComboPooledDataSource());//使用连接池构造
            //2.执行修改
            String sql = "update product set pname = ? , price = ? where pid = ?";
            int row = qr.update(sql,"奔驰E级",440000,10);
            System.out.println("修改影响的行数:" + row);
        }
        //删除
        @Test
        public void delete() throws SQLException{
            //1.构造一个QueryRunner
            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());//通过工具类获取连接池对象
            //2.执行删除
            String sql = "delete from product where pid = ?";
            int row = qr.update(sql,10);
            System.out.println("删除影响的行数:" + row);
        }

07.DBUtils工具包_使用DBUtils实现查询:

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

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

    3).某个JavaBean类型 BeanHandler:将结果集中第一条记录封装到一个指定的javaBean中。

    4).List<某个JavaBean类型> BeanListHandler:将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中

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

    6).Map<String,Object> MapHandler:将结果集中第一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值

    7).List<Map<String,Object>> MapListHandler:将结果集中每一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值,在将这些Map封装到List集合中。

    8).Object ScalarHandler:它是用于单个数据。例如select count(*) from 表操作。

08.DBUtils工具类_QueryRunner的两个常用方法:

    1).public int update(String sql,Object ... params):用于执行添加(insert)、修改(update)、删除(delete)语句的。

                               返回值:int--》影响的行数

    2).public 某种类型 query(String sql,ResultSetHandler rsh,Object ... params):用于执行查询(select)

                               返回值:根据ResultSetHandler的不同而不同。