JDBC连接池和DBUtils

C3P0连接池

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

 1 public class C3P0Utils {
 2     //成员位置创建ComboPooledDataSource对象
 3     private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
 4     
 5     //使用静态代码块给ComboPooledDataSource设置4大数据量连接信息
 6     static{
 7         try {
 8             dataSource.setDriverClass("com.mysql.jdbc.Driver");
 9             dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mybase4");
10             dataSource.setUser("root");
11             dataSource.setPassword("root");
12         } catch (Exception e) {
13             throw new RuntimeException("设置连接信息失败!");
14         }
15     }
16     
17     //创建一个静态方法返回Connection对象
18     public static Connection getConnection(){
19         try {
20             return dataSource.getConnection();
21         } catch (SQLException e) {
22             throw new RuntimeException("获取数据库连接信息失败!");
23         }
24     }
25     
26     //定义一个释放资源的方法
27         public static void close(ResultSet rs,Statement stat,Connection conn){
28             if(rs!=null){
29                 try {
30                     rs.close();
31                 } catch (SQLException e) {
32                     e.printStackTrace();
33                 }
34             }
35             if(stat !=null){
36                 try {
37                     stat.close();
38                 } catch (SQLException e) {
39                     e.printStackTrace();
40                 }
41             }
42             if(conn != null){
43                 try {
44                     conn.close();
45                 } catch (SQLException e) {
46                     e.printStackTrace();
47                 }
48             }
49         }
50 }

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

 1 public class C3P0UtilsReadXML {
 2     //成员位置创建ComboPooledDataSource对象
 3     private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
 4     
 5     //使用静态代码块给ComboPooledDataSource设置4大数据量连接信息
 6     /*static{
 7         try {
 8             dataSource.setDriverClass("com.mysql.jdbc.Driver");
 9             dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mybase4");
10             dataSource.setUser("root");
11             dataSource.setPassword("root");
12         } catch (Exception e) {
13             throw new RuntimeException("设置连接信息失败!");
14         }
15     }*/
16     
17     //创建一个返回ComboPooledDataSource的方法
18     public static DataSource getDataSource(){
19         return dataSource;
20     }
21     
22     //创建一个静态方法返回Connection对象
23     public static Connection getConnection(){
24         try {
25             return dataSource.getConnection();
26         } catch (SQLException e) {
27             throw new RuntimeException("获取数据库连接信息失败!");
28         }
29     }
30     
31     //定义一个释放资源的方法
32         public static void close(ResultSet rs,Statement stat,Connection conn){
33             if(rs!=null){
34                 try {
35                     rs.close();
36                 } catch (SQLException e) {
37                     e.printStackTrace();
38                 }
39             }
40             if(stat !=null){
41                 try {
42                     stat.close();
43                 } catch (SQLException e) {
44                     e.printStackTrace();
45                 }
46             }
47             if(conn != null){
48                 try {
49                     conn.close();
50                 } catch (SQLException e) {
51                     e.printStackTrace();
52                 }
53             }
54         }
55 }

DBCP连接池

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

 1 public class DBCPUtils {
 2     //创建连接池的实现类对象
 3     private static BasicDataSource dataSource = new BasicDataSource();
 4     
 5     //设置连接数据库的4大变量,使用BasicDataSource中的set方法设置
 6     static{
 7         //设置注册的驱动信息
 8         dataSource.setDriverClassName("com.mysql.jdbc.Driver");
 9         //设置Url
10         dataSource.setUrl("jdbc:mysql://localhost:3306/mybase4");
11         //设置用户名
12         dataSource.setUsername("root");
13         //设置密码
14         dataSource.setPassword("root");
15         //可选信息
16         //dataSource.setInitialSize(100);
17         //dataSource.setMaxActive(1000);
18     }
19     
20     //创建获取数据库连接对象的方法
21     public static Connection getConnection(){
22         try {
23             return dataSource.getConnection();
24         } catch (SQLException e) {
25             throw new RuntimeException("获取数据库连接对象失败");
26         }
27     }
28     
29     //定义一个释放资源的方法
30     public static void  close(ResultSet rs,Statement stat,Connection conn){
31         if(rs!=null){
32             try {
33                 rs.close();
34             } catch (SQLException e) {
35                 e.printStackTrace();
36             }
37         }
38         if(stat !=null){
39             try {
40                 stat.close();
41             } catch (SQLException e) {
42                 e.printStackTrace();
43             }
44         }
45         if(conn != null){
46             try {
47                 conn.close();
48             } catch (SQLException e) {
49                 e.printStackTrace();
50             }
51         }
52     }
53 }

读取配置文件的方式

 1 /*
 2  * 创建DBCP连接池工具类
 3  * 使用读取配置文件的方式
 4  * DBCP中有一个工厂类BasicDataSourceFactory
 5  * 工厂类中有一个静态方法
 6  * static DataSource createDataSource(Properties prop)
 7  * 此方法返回的就是DataSource接口的实现类对象BasicDataSource
 8  * 
 9  * 创建Propertis集合+IO技术读取配置文件
10  * 把配置文件传入BasicDataSourceFactory静态方法createDataSource中
11  */
12 public class DBCPUtilsReadConfig {
13     //创建DataSource变量
14     private static DataSource dataSource;
15     
16     static{
17         try {
18             //创建Propertis集合+IO技术读取配置文件
19             //使用类加载器,扫描包下的文件
20             InputStream is = DBCPUtilsReadConfig.class.getClassLoader()
21                     .getResourceAsStream("dbcpconfig.properties");
22             //创建Propertis集合
23             Properties prop = new Properties();
24             prop.load(is);
25             //把配置文件传入BasicDataSourceFactory静态方法createDataSource中
26             dataSource = BasicDataSourceFactory.createDataSource(prop);
27         } catch (Exception e) {
28             throw new RuntimeException("读取配置文件失败");
29         }
30     }
31     
32     //创建获取数据库连接对象的方法
33     public static Connection getConnection(){
34         try {
35             return dataSource.getConnection();
36         } catch (SQLException e) {
37             throw new RuntimeException("获取数据库连接对象失败");
38         }
39     }
40     
41     //定义一个释放资源的方法
42     public static void  close(ResultSet rs,Statement stat,Connection conn){
43         if(rs!=null){
44             try {
45                 rs.close();
46             } catch (SQLException e) {
47                 e.printStackTrace();
48             }
49         }
50         if(stat !=null){
51             try {
52                 stat.close();
53             } catch (SQLException e) {
54                 e.printStackTrace();
55             }
56         }
57         if(conn != null){
58             try {
59                 conn.close();
60             } catch (SQLException e) {
61                 e.printStackTrace();
62             }
63         }
64     }
65 }


* 使用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实现类不同,返回的结果集也不同,使用泛型,传入什么结果集,就返回对应的类型

 1 public class Demo01DBUtils {
 2     //创建QueryRunner对象,构造方法中传入连接池的实现类对象
 3     QueryRunner qr = new QueryRunner(C3P0UtilsReadXML.getDataSource());
 4     
 5     /*
 6      * 使用QueryRunner,对数据库表进行删除数据
 7      */
 8     @Test
 9     public void delete(){
10         try {
11             //拼接增加的sql语句
12             String sql = "DELETE FROM category WHERE cid=?";
13             //调用QueryRunner中update方法执行sql语句
14             //创建对象数据,储存?占位符的实际参数
15             //Object[] parmars = {"洗",10};
16             int row = qr.update(sql, 7);
17             System.out.println(row);
18         } catch (Exception e) {
19             System.out.println(e);
20         }
21     }
22     
23     /*
24      * 使用QueryRunner,对数据库表进行修改数据
25      */
26     @Test
27     public void update(){
28         try {
29             //拼接增加的sql语句
30             String sql = "UPDATE category SET cname=? WHERE cid=?";
31             //调用QueryRunner中update方法执行sql语句
32             //创建对象数据,储存?占位符的实际参数
33             Object[] parmars = {"洗",10};
34             int row = qr.update(sql, parmars);
35             System.out.println(row);
36         } catch (Exception e) {
37             System.out.println(e);
38         }
39     }
40     
41     /*
42      * 使用QueryRunner,对数据库表进行增加(插入)数据
43      */
44     @Test
45     public void insert(){
46         try {
47             //拼接增加的sql语句
48             String sql = "INSERT INTO category(cname) VALUES(?)";
49             //调用QueryRunner中update方法执行sql语句
50             int row = qr.update(sql, "玩具");
51             System.out.println(row);
52         } catch (Exception e) {
53             System.out.println(e);
54         }
55     }
56 }

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

  1 /*
  2  * 使用QueryRunner对数据库表进行查询
  3  * <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)    
  4  */
  5 public class Demo02DBUtils {
  6     //创建QueryRunner对象,构造方法中传入数据库连接池的实现类
  7     QueryRunner qr = new QueryRunner(C3P0UtilsReadXML.getDataSource());
  8     
  9     /*
 10      * 第九种查询方式:使用KeyedHandler(Map嵌套Map)
 11      * KeyedHandler会把结果集的每一行数据封装到Map集合中
 12      *     key:字符串类型列名
 13      *     value:列名对应的值(不同的列,数据类型不同,value使用Object类型)
 14      * 多个Map集合存储到另外一个Map集合中
 15      *     key:指定的字符串列名,不指定则默认使用第一列
 16      *     value:传入存储每行数据的Map集合
 17      * 
 18      * 构造方法:
 19      *     KeyedHandler() 不指定列名
 20      *     KeyedHandler(int columnIndex) 指定列号1,2,3,4
 21      *     KeyedHandler(String columnName) 指定字符串格式列名
 22      */
 23     @Test
 24     public void keyedHandler(){
 25         try {
 26             //拼接sql语句
 27             String sql = "SELECT * FROM category";
 28             //调用QueryRunner中的query方法,结果集使用KeyedHandler
 29             //Map<Object,Map<String,Object>> mapmap = qr.query(sql, new KeyedHandler("cid"));
 30             Map<Object,Map<String,Object>> mapmap = qr.query(sql, new KeyedHandler("cname"));
 31             //遍历Map集合取出存储每一行数据的Map集合
 32             for (Object obj: mapmap.keySet()) {
 33                 //根据key取出值存储每一行数据的Map集合
 34                 Map<String,Object> map = mapmap.get(obj);
 35                 //遍历Map集合
 36                 for(String key : map.keySet()){
 37                     System.out.print(obj+":"+key+"..."+map.get(key)+"\t");
 38                 }
 39                 //打印完每一行数据之后换行
 40                 System.out.println();
 41             }
 42         } catch (Exception e) {
 43             System.out.println(e);
 44         }
 45     }
 46     
 47     /*
 48      * 第八种查询方式:使用ScalarHandler(重点)
 49      * ScalarHandler用于执行返回单个数据的sql语句
 50      * 使用聚合函数查询的结果都是单个数据
 51      * 或者查询某一行的某一个字段
 52      */
 53     @Test
 54     public void scalarHandler(){
 55         try {
 56             //拼接sql语句
 57             String sql = "SELECT SUM(cid) FROM category";
 58             sql = "SELECT cname FROM category WHERE cid=?";
 59             //调用QueryRunner中的query方法,结果集使用ScalarHander
 60             //返回的值的数据类型不确定,使用Object类型
 61             Object obj = qr.query(sql, new ScalarHandler(),2);
 62             System.out.println(obj);
 63         } catch (Exception e) {
 64             System.out.println(e);
 65         }
 66     }
 67     
 68     /*
 69      * 第七种查询方式:使用MapListHandler
 70      * 1.MapListHandler会把多条数据,存储到多个Map集合中
 71      *     key:字符串类型列名
 72      *     value:列名对应的值(不同的列,数据类型不同,value使用Object类型)
 73      * 2.会把多个Map集合存储List集合中
 74      */
 75     @Test
 76     public void mapListHandler(){
 77         try {
 78             //拼接查询sql语句
 79             String sql = "SELECT * FROM category";
 80             //调用QueryRunner中的query方法执行查询sql语句,结果集传入MapListHandler
 81             List<Map<String,Object>> list = qr.query(sql, new MapListHandler());
 82             //遍历List集合,取出Map集合
 83             for (Map<String, Object> map : list) {
 84                 //遍历Map集合
 85                 for(String key: map.keySet()){
 86                     System.out.print(key+"..."+map.get(key)+"\t");
 87                 }
 88                 System.out.println();//打印完每行数据之后换行
 89             }
 90         } catch (Exception e) {
 91             System.out.println(e);
 92         }
 93     }
 94     
 95     /*
 96      * 第六种查询方式:使用MapHandler
 97      * MapHandler把结果集的第一行数据存储Map集合中
 98      *     key:字符串类型列名
 99      *     value:列名对应的值(不同的列,数据类型不同,value使用Object类型)
100      */
101     @Test
102     public void mapHandler(){
103         try {
104             //拼接查询sql语句
105             String sql = "SELECT * FROM category";
106             //调用QueryRunner中的query方法执行查询sql语句,结果集传入MapHandler
107             Map<String,Object> map = qr.query(sql, new MapHandler());
108             //使用keySet遍历Map集合
109             Set<String> set = map.keySet();
110             for (String key : set) {
111                 //通过key使用get方法获取value
112                 Object value = map.get(key);
113                 System.out.print(key+"..."+value+" ");
114             }
115         } catch (Exception e) {
116             System.out.println(e);
117         }
118     }
119     
120 
121     /*
122      * 第五种查询方式:使用ColumnListHandler
123      * ColumnListHandler会把结果集中指定列的数据封装到一个List集合中
124      * 如果不指定列,则默认使用第一列数据存储到List集合中
125      * ColumnListHandler() 
126      * ColumnListHandler(int columnIndex) 列号1,2,3,4
127      * ColumnListHandler(String columnName) 列名
128      */
129     @Test
130     public void columnListHandler(){
131         try {
132             //拼接查询sql语句
133             String sql = "SELECT * FROM category";
134             //调用QueryRunner中的query方法执行查询sql语句,结果集传入ColumnListHandler
135             //返回一个List集合,因为列的数据类型不同,所有元素使用Object类型
136             List<Object> list = qr.query(sql, new ColumnListHandler("cname"));
137             for (Object object : list) {
138                 System.out.println(object);
139             }
140         } catch (Exception e) {
141             System.out.println(e);
142         }
143     }
144     
145     /*
146      * 第四种查询方式:使用BeanListHandler(重点)
147      * BeanListHandler会把多个条数据封装到多个JavaBean对象中
148      * 多个JavaBean对象存储到List集合中
149      * 
150      * 注意:
151      *      JavaBean中必须有空参数构造方法
152      */
153     @Test
154     public void beanListHandler(){
155         try {
156             //拼接查询sql语句
157             String sql = "SELECT * FROM category";
158             //调用QueryRunner中的query方法执行查询sql语句,结果集传入BeanListHandler
159             List<Category> list = qr.query(sql, new BeanListHandler<>(Category.class));
160             //遍历存储Category的list集合
161             for (Category category : list) {
162                 System.out.println(category);
163             }
164         } catch (Exception e) {
165             System.out.println(e);
166         }
167     }
168     
169     /*
170      * 第三种查询方式:使用BeanHandler(重点)
171      * BeanHandler会把结果集的第一条数据,封装到指定的JavaBean对象中
172      * 构造方法:
173      *     BeanHandler(Class<T> type) 传递JavaBean对象的class文件对象
174      *         BeanHandler内部会根据传递的class文件对象使用反射技术创建JavaBean对象,把查询的结果集中第一行数据存储到JavaBean中
175      *     相当于
176      *         Category c = new Category();
177      *         c.setXXX(xxx);
178      *         c.setXXX(xxx);
179      *         c.setXXX(xxx);
180      *  注意:
181      *      JavaBean中必须有空参数构造方法
182      */
183     @Test
184     public void beanHandler(){
185         try {
186             //拼接查询sql语句
187             String sql = "SELECT * FROM category";
188             //调用QueryRunner中的query方法执行查询sql语句,结果集传入BeanHandler
189             Category cate = qr.query(sql, new BeanHandler<>(Category.class));
190             System.out.println(cate);
191         } catch (Exception e) {
192             System.out.println(e);
193         }
194     }
195     
196     /*
197      * 第二种查询方式:使用ArrayListHandler
198      * ArrayListHandler中会把多条结果封装到多个对象数组中
199      * 一个对象数组封装一行数据
200      * 多个对象数组需要存储到list集合中
201      */
202     @Test
203     public void arrrayListHandler(){
204         try {
205             //拼接查询sql语句
206             String sql = "SELECT * FROM category where cid = ?";
207             sql = "SELECT * FROM category where cid in(?,?)";
208             //调用QueryRunner中的query方法执行查询sql语句,传入ArrayListHandler结果集
209             List<Object[]> list = qr.query(sql, new ArrayListHandler(), 1,3);
210             //遍历集合
211             for (Object[] objects : list) {
212                 //遍历对象数组
213                 for (Object obj : objects) {
214                     System.out.print(obj+" ");
215                 }
216                 System.out.println();//换行
217             }
218         } catch (Exception e) {
219             System.out.println(e);
220         }
221     }
222     
223     /*
224      * 第一种查询方式:使用ArrayHandler
225      * ArrayHandler会把结果集第一条数据封装到一个对象(Object)数组中
226      * 数组中的每一个元素,就是第一条数据数据的每一列的值
227      */
228     @Test
229     public void arrayHandler(){
230         try {
231             //拼接查询sql语句
232             String sql = "SELECT * FROM category";
233             //调用QueryRunner中的query方法执行查询sql语句,传入ArrayHandler结果集
234             Object[] objs = qr.query(sql, new ArrayHandler());
235             //遍历数组
236             for (Object obj : objs) {
237                 System.out.print(obj+" ");
238             }
239         } catch (Exception e) {
240             System.out.println(e);
241         }
242     }
243 }

 

posted @ 2017-07-08 18:30  加速的小火车  阅读(2013)  评论(0编辑  收藏  举报