JDBC连接池和DBUtils

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);
        }
    }
}

猜你喜欢

转载自www.linuxidc.com/Linux/2017-07/145514.htm