阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

JDBC连接池和DBUtils

113次阅读
没有评论

共计 13334 个字符,预计需要花费 34 分钟才能阅读完成。

C3P0 连接池

创建 C3P0 连接池的工具类
* 连接的规范接口:
* javax.sql.DataSource 接口
* 接口的实现类对象
* ComboPooledDataSource
* 成员位置创建 ComboPooledDataSource 对象
* 使用静态代码块给 ComboPooledDataSource 设置 4 大数据量连接信息
* 创建一个静态方法返回 Connection 对象
* 创建一个静态方法释放资源

public class C3P0Utils {
    // 成员位置创建 ComboPooledDataSource 对象
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
   
    // 使用静态代码块给 ComboPooledDataSource 设置 4 大数据量连接信息
    static{
        try {
            dataSource.setDriverClass(“com.mysql.jdbc.Driver”);
            dataSource.setJdbcUrl(“jdbc:mysql://localhost:3306/mybase4”);
            dataSource.setUser(“root”);
            dataSource.setPassword(“root”);
        } catch (Exception e) {
            throw new RuntimeException(“ 设置连接信息失败!”);
        }
    }
   
    // 创建一个静态方法返回 Connection 对象
    public static Connection getConnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(“ 获取数据库连接信息失败!”);
        }
    }
   
    // 定义一个释放资源的方法
        public static void close(ResultSet rs,Statement stat,Connection conn){
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(stat !=null){
                try {
                    stat.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
}

创建读取 XML 配置文件的 C3P0 工具类

public class C3P0UtilsReadXML {
    // 成员位置创建 ComboPooledDataSource 对象
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
   
    // 使用静态代码块给 ComboPooledDataSource 设置 4 大数据量连接信息
    /*static{
        try {
            dataSource.setDriverClass(“com.mysql.jdbc.Driver”);
            dataSource.setJdbcUrl(“jdbc:mysql://localhost:3306/mybase4”);
            dataSource.setUser(“root”);
            dataSource.setPassword(“root”);
        } catch (Exception e) {
            throw new RuntimeException(“ 设置连接信息失败!”);
        }
    }*/
   
    // 创建一个返回 ComboPooledDataSource 的方法
    public static DataSource getDataSource(){
        return dataSource;
    }
   
    // 创建一个静态方法返回 Connection 对象
    public static Connection getConnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(“ 获取数据库连接信息失败!”);
        }
    }
   
    // 定义一个释放资源的方法
        public static void close(ResultSet rs,Statement stat,Connection conn){
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(stat !=null){
                try {
                    stat.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
}

DBCP 连接池

创建 DBCP 连接池的工具类
* 连接的规范接口:
* javax.sql.DataSource 接口
* 接口的实现类对象
* BasicDataSource
* 重写 getConnection 方法

public class DBCPUtils {
    // 创建连接池的实现类对象
    private static BasicDataSource dataSource = new BasicDataSource();
   
    // 设置连接数据库的 4 大变量, 使用 BasicDataSource 中的 set 方法设置
    static{
        // 设置注册的驱动信息
        dataSource.setDriverClassName(“com.mysql.jdbc.Driver”);
        // 设置 Url
        dataSource.setUrl(“jdbc:mysql://localhost:3306/mybase4”);
        // 设置用户名
        dataSource.setUsername(“root”);
        // 设置密码
        dataSource.setPassword(“root”);
        // 可选信息
        //dataSource.setInitialSize(100);
        //dataSource.setMaxActive(1000);
    }
   
    // 创建获取数据库连接对象的方法
    public static Connection getConnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(“ 获取数据库连接对象失败 ”);
        }
    }
   
    // 定义一个释放资源的方法
    public static void  close(ResultSet rs,Statement stat,Connection conn){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(stat !=null){
            try {
                stat.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

读取配置文件的方式

/*
 * 创建 DBCP 连接池工具类
 * 使用读取配置文件的方式
 * DBCP 中有一个工厂类 BasicDataSourceFactory
 * 工厂类中有一个静态方法
 * static DataSource createDataSource(Properties prop)
 * 此方法返回的就是 DataSource 接口的实现类对象 BasicDataSource
 *
 * 创建 Propertis 集合 +IO 技术读取配置文件
 * 把配置文件传入 BasicDataSourceFactory 静态方法 createDataSource 中
 */
public class DBCPUtilsReadConfig {
    // 创建 DataSource 变量
    private static DataSource dataSource;
   
    static{
        try {
            // 创建 Propertis 集合 +IO 技术读取配置文件
            // 使用类加载器, 扫描包下的文件
            InputStream is = DBCPUtilsReadConfig.class.getClassLoader()
                    .getResourceAsStream(“dbcpconfig.properties”);
            // 创建 Propertis 集合
            Properties prop = new Properties();
            prop.load(is);
            // 把配置文件传入 BasicDataSourceFactory 静态方法 createDataSource 中
            dataSource = BasicDataSourceFactory.createDataSource(prop);
        } catch (Exception e) {
            throw new RuntimeException(“ 读取配置文件失败 ”);
        }
    }
   
    // 创建获取数据库连接对象的方法
    public static Connection getConnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(“ 获取数据库连接对象失败 ”);
        }
    }
   
    // 定义一个释放资源的方法
    public static void  close(ResultSet rs,Statement stat,Connection conn){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(stat !=null){
            try {
                stat.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

* 使用 DBUtils 工具类对数据库表进行增删改查
* DBUtils 工具类作用: 简化 JDBC 的开发(6 步)
*
* DBUtils 有 3 个核心类
* 1.QueryRunner: 使用 QueryRunner 中的方法对数据库进行增删改查
* 2.DbUtils: 提供了大量的释放资源的方法
* 3.ResultSetHandler 接口: 提供了处理查询结果集的方法
*
* QueryRunner 类
* 构造方法:
* QueryRunner() 空参数构造方法
* 调用更新和查询方法的时候, 需要传入 Connection 对象
* QueryRunner(DataSource ds) 带 DataSource 数据库连接池的构造方法
* 调用更新和查询方法的时候 QueryRunner 会自动从 DataSource 实现类对象中获取数据库连接对象, 使用完毕会自动归还
* 成员方法:
* 执行执行增删改的成员方法
* int update(Connection conn, String sql, Object… params) 用来执行增删改的 SQL
* int update(String sql, Object… params) 用来执行增删改的 SQL
* 参数:
* Connection conn: 数据库连接对象
* String sql: 拼接的 sql 语句, 可以使用? 占位符
* Object… params:? 占位符的实际参数, 可以使用 Object[]
* 返回值:
* int: 执行的有效行数
* 执行执行查询的成员方法
* <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object… params)
* <T> T query(String sql, ResultSetHandler<T> rsh, Object… params)
* 参数:
* Connection conn: 数据库连接对象
* String sql: 拼接的 sql 语句, 可以使用? 占位符
* Object… params:? 占位符的实际参数, 可以使用 Object[]
* ResultSetHandler<T> rsh: 用来存储查询之后的结果集, 可以传入 ResultSetHandler9 种实现类对象
* 返回值:
* <T> T: 传入的 ResultSetHandler 实现类不同, 返回的结果集也不同, 使用泛型, 传入什么结果集, 就返回对应的类型

public class Demo01DBUtils {
    // 创建 QueryRunner 对象, 构造方法中传入连接池的实现类对象
    QueryRunner qr = new QueryRunner(C3P0UtilsReadXML.getDataSource());
   
    /*
    * 使用 QueryRunner, 对数据库表进行删除数据
    */
    @Test
    public void delete(){
        try {
            // 拼接增加的 sql 语句
            String sql = “DELETE FROM category WHERE cid=?”;
            // 调用 QueryRunner 中 update 方法执行 sql 语句
            // 创建对象数据, 储存? 占位符的实际参数
            //Object[] parmars = {“ 洗 ”,10};
            int row = qr.update(sql, 7);
            System.out.println(row);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
   
    /*
    * 使用 QueryRunner, 对数据库表进行修改数据
    */
    @Test
    public void update(){
        try {
            // 拼接增加的 sql 语句
            String sql = “UPDATE category SET cname=? WHERE cid=?”;
            // 调用 QueryRunner 中 update 方法执行 sql 语句
            // 创建对象数据, 储存? 占位符的实际参数
            Object[] parmars = {“ 洗 ”,10};
            int row = qr.update(sql, parmars);
            System.out.println(row);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
   
    /*
    * 使用 QueryRunner, 对数据库表进行增加(插入) 数据
    */
    @Test
    public void insert(){
        try {
            // 拼接增加的 sql 语句
            String sql = “INSERT INTO category(cname) VALUES(?)”;
            // 调用 QueryRunner 中 update 方法执行 sql 语句
            int row = qr.update(sql, “ 玩具 ”);
            System.out.println(row);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

使用 QueryRunner 对数据库表进行查询的九种查询方式

/*
 * 使用 QueryRunner 对数据库表进行查询
 * <T> T query(String sql, ResultSetHandler<T> rsh, Object… params)   
 */
public class Demo02DBUtils {
    // 创建 QueryRunner 对象, 构造方法中传入数据库连接池的实现类
    QueryRunner qr = new QueryRunner(C3P0UtilsReadXML.getDataSource());
   
    /*
    * 第九种查询方式: 使用 KeyedHandler(Map 嵌套 Map)
    * KeyedHandler 会把结果集的每一行数据封装到 Map 集合中
    *    key: 字符串类型列名
    *    value: 列名对应的值(不同的列, 数据类型不同,value 使用 Object 类型)
    * 多个 Map 集合存储到另外一个 Map 集合中
    *    key: 指定的字符串列名, 不指定则默认使用第一列
    *    value: 传入存储每行数据的 Map 集合
    *
    * 构造方法:
    *    KeyedHandler() 不指定列名
    *    KeyedHandler(int columnIndex) 指定列号 1,2,3,4
    *    KeyedHandler(String columnName) 指定字符串格式列名
    */
    @Test
    public void keyedHandler(){
        try {
            // 拼接 sql 语句
            String sql = “SELECT * FROM category”;
            // 调用 QueryRunner 中的 query 方法, 结果集使用 KeyedHandler
            //Map<Object,Map<String,Object>> mapmap = qr.query(sql, new KeyedHandler(“cid”));
            Map<Object,Map<String,Object>> mapmap = qr.query(sql, new KeyedHandler(“cname”));
            // 遍历 Map 集合取出存储每一行数据的 Map 集合
            for (Object obj: mapmap.keySet()) {
                // 根据 key 取出值存储每一行数据的 Map 集合
                Map<String,Object> map = mapmap.get(obj);
                // 遍历 Map 集合
                for(String key : map.keySet()){
                    System.out.print(obj+”:”+key+”…”+map.get(key)+”\t”);
                }
                // 打印完每一行数据之后换行
                System.out.println();
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
   
    /*
    * 第八种查询方式: 使用 ScalarHandler(重点)
    * ScalarHandler 用于执行返回单个数据的 sql 语句
    * 使用聚合函数查询的结果都是单个数据
    * 或者查询某一行的某一个字段
    */
    @Test
    public void scalarHandler(){
        try {
            // 拼接 sql 语句
            String sql = “SELECT SUM(cid) FROM category”;
            sql = “SELECT cname FROM category WHERE cid=?”;
            // 调用 QueryRunner 中的 query 方法, 结果集使用 ScalarHander
            // 返回的值的数据类型不确定, 使用 Object 类型
            Object obj = qr.query(sql, new ScalarHandler(),2);
            System.out.println(obj);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
   
    /*
    * 第七种查询方式: 使用 MapListHandler
    * 1.MapListHandler 会把多条数据, 存储到多个 Map 集合中
    *    key: 字符串类型列名
    *    value: 列名对应的值(不同的列, 数据类型不同,value 使用 Object 类型)
    * 2. 会把多个 Map 集合存储 List 集合中
    */
    @Test
    public void mapListHandler(){
        try {
            // 拼接查询 sql 语句
            String sql = “SELECT * FROM category”;
            // 调用 QueryRunner 中的 query 方法执行查询 sql 语句, 结果集传入 MapListHandler
            List<Map<String,Object>> list = qr.query(sql, new MapListHandler());
            // 遍历 List 集合, 取出 Map 集合
            for (Map<String, Object> map : list) {
                // 遍历 Map 集合
                for(String key: map.keySet()){
                    System.out.print(key+”…”+map.get(key)+”\t”);
                }
                System.out.println();// 打印完每行数据之后换行
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
   
    /*
    * 第六种查询方式: 使用 MapHandler
    * MapHandler 把结果集的第一行数据存储 Map 集合中
    *    key: 字符串类型列名
    *    value: 列名对应的值(不同的列, 数据类型不同,value 使用 Object 类型)
    */
    @Test
    public void mapHandler(){
        try {
            // 拼接查询 sql 语句
            String sql = “SELECT * FROM category”;
            // 调用 QueryRunner 中的 query 方法执行查询 sql 语句, 结果集传入 MapHandler
            Map<String,Object> map = qr.query(sql, new MapHandler());
            // 使用 keySet 遍历 Map 集合
            Set<String> set = map.keySet();
            for (String key : set) {
                // 通过 key 使用 get 方法获取 value
                Object value = map.get(key);
                System.out.print(key+”…”+value+” “);
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
   

    /*
    * 第五种查询方式: 使用 ColumnListHandler
    * ColumnListHandler 会把结果集中指定列的数据封装到一个 List 集合中
    * 如果不指定列, 则默认使用第一列数据存储到 List 集合中
    * ColumnListHandler()
    * ColumnListHandler(int columnIndex) 列号 1,2,3,4
    * ColumnListHandler(String columnName) 列名
    */
    @Test
    public void columnListHandler(){
        try {
            // 拼接查询 sql 语句
            String sql = “SELECT * FROM category”;
            // 调用 QueryRunner 中的 query 方法执行查询 sql 语句, 结果集传入 ColumnListHandler
            // 返回一个 List 集合, 因为列的数据类型不同, 所有元素使用 Object 类型
            List<Object> list = qr.query(sql, new ColumnListHandler(“cname”));
            for (Object object : list) {
                System.out.println(object);
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
   
    /*
    * 第四种查询方式: 使用 BeanListHandler(重点)
    * BeanListHandler 会把多个条数据封装到多个 JavaBean 对象中
    * 多个 JavaBean 对象存储到 List 集合中
    *
    * 注意:
    *      JavaBean 中必须有空参数构造方法
    */
    @Test
    public void beanListHandler(){
        try {
            // 拼接查询 sql 语句
            String sql = “SELECT * FROM category”;
            // 调用 QueryRunner 中的 query 方法执行查询 sql 语句, 结果集传入 BeanListHandler
            List<Category> list = qr.query(sql, new BeanListHandler<>(Category.class));
            // 遍历存储 Category 的 list 集合
            for (Category category : list) {
                System.out.println(category);
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
   
    /*
    * 第三种查询方式: 使用 BeanHandler(重点)
    * BeanHandler 会把结果集的第一条数据, 封装到指定的 JavaBean 对象中
    * 构造方法:
    *    BeanHandler(Class<T> type) 传递 JavaBean 对象的 class 文件对象
    *        BeanHandler 内部会根据传递的 class 文件对象使用反射技术创建 JavaBean 对象, 把查询的结果集中第一行数据存储到 JavaBean 中
    *    相当于
    *        Category c = new Category();
    *        c.setXXX(xxx);
    *        c.setXXX(xxx);
    *        c.setXXX(xxx);
    *  注意:
    *      JavaBean 中必须有空参数构造方法
    */
    @Test
    public void beanHandler(){
        try {
            // 拼接查询 sql 语句
            String sql = “SELECT * FROM category”;
            // 调用 QueryRunner 中的 query 方法执行查询 sql 语句, 结果集传入 BeanHandler
            Category cate = qr.query(sql, new BeanHandler<>(Category.class));
            System.out.println(cate);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
   
    /*
    * 第二种查询方式: 使用 ArrayListHandler
    * ArrayListHandler 中会把多条结果封装到多个对象数组中
    * 一个对象数组封装一行数据
    * 多个对象数组需要存储到 list 集合中
    */
    @Test
    public void arrrayListHandler(){
        try {
            // 拼接查询 sql 语句
            String sql = “SELECT * FROM category where cid = ?”;
            sql = “SELECT * FROM category where cid in(?,?)”;
            // 调用 QueryRunner 中的 query 方法执行查询 sql 语句, 传入 ArrayListHandler 结果集
            List<Object[]> list = qr.query(sql, new ArrayListHandler(), 1,3);
            // 遍历集合
            for (Object[] objects : list) {
                // 遍历对象数组
                for (Object obj : objects) {
                    System.out.print(obj+” “);
                }
                System.out.println();// 换行
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
   
    /*
    * 第一种查询方式: 使用 ArrayHandler
    * ArrayHandler 会把结果集第一条数据封装到一个对象(Object) 数组中
    * 数组中的每一个元素, 就是第一条数据数据的每一列的值
    */
    @Test
    public void arrayHandler(){
        try {
            // 拼接查询 sql 语句
            String sql = “SELECT * FROM category”;
            // 调用 QueryRunner 中的 query 方法执行查询 sql 语句, 传入 ArrayHandler 结果集
            Object[] objs = qr.query(sql, new ArrayHandler());
            // 遍历数组
            for (Object obj : objs) {
                System.out.print(obj+” “);
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-07/145514.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计13334字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中