DButils工具类和连接池的使用

1. DButils工具类的介绍个三个核心类

   A: DButils工具类的介绍个三个核心类
   a: 概述
      DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
      DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
      DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。
   b: Dbutils三个核心功能介绍
     QueryRunner中提供对sql语句操作的API.
     update(Connection conn, String sql, Object... params) ,用来完成表数据的增加、删除、更新操作
     query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作
     ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
     DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法

2. QueryRunner类的update方法介绍

     a: 方法介绍

     update(Connection conn, String sql, Object... params) ,用来完成表数据的增加、删除、更新操作
     使用QueryRunner类,实现对数据表的insert delete update
     调用QueryRunner类的方法 update (Connection con,String sql,Object...param)
     Object...param 可变参数,Object类型,SQL语句会出现?占位符
     数据库连接对象,自定义的工具类传递

   b. 代码实现  

 1 /**
 2  * QueryRunner类
 3  * update(Connection conn, String sql, Object... params)
 4  * 实现表中数据的增、删、改
 5  * @author vanguard
 6  *
 7  */
 8 public class QueryRunnerDemo {
 9     //获取数据库连接
10     private static Connection conn = JDBCUtils.getConnection();
11     
12     public static void main(String[] args) throws SQLException {
13         //insert();
14         //delete();
15         //update();
16     }
17     /**
18      * 使用QueryRunner类中的update方法,实现更新数据
19      * @throws SQLException
20      */
21     private static void update() throws SQLException {
22         //创建QueryRunner类对象
23         QueryRunner qr = new QueryRunner();
24         //定义更新的sql语句
25         String sql = "UPDATE sort SET sname=?,sprice=?,sdesc=? WHERE sid=?";
26         ////将四个?占位符的实际参数写在数组中
27         Object[] params = {"家居产品", 9000, "涨价了", 2};
28         ////调用QueryRunner类的方法update执行SQL语句
29         int row = qr.update(conn, sql, params);
30         System.out.println(row);
31         DbUtils.closeQuietly(conn);
32     }
33     /**
34      *  使用QueryRunner类中的update方法,实现添加数据
35      * @throws SQLException
36      */
37     private static void delete() throws SQLException {
38         //创建QueryRunner类对象
39         QueryRunner qr = new QueryRunner();
40         String sql = "DELETE FROM sort WHERE sid=?";
41         //调用QueryRunner类的方法update执行SQL语句
42         int row = qr.update(conn, sql, 7);
43         System.out.println(row);
44         DbUtils.closeQuietly(conn);
45     }
46     
47     /**
48      * 使用Q    ueryRunner类中的update方法,实现添加数据
49      * @throws SQLException
50      */
51     private static void insert() throws SQLException {
52         //创建QueryRunner类对象
53         QueryRunner qr = new QueryRunner();
54         String sql = "INSERT INTO sort(sname,sprice,sdesc) VALUES(?,?,?)";
55         //将三个?占位符的实际参数写在数组中
56         Object[] params = {"体育用品", 200.98, "购买体育用品"};
57         //调用QueryRunner类的方法update执行SQL语句
58         int row = qr.update(conn, sql, params);
59         System.out.println(row);
60         DbUtils.closeQuietly(conn);
61     }
62 }

3. DBUtils工具类结果集处理的方式

   a: QueryRunner实现查询操作
     query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作
   b: ResultSetHandler结果集处理类
    ArrayHandler 将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值
    ArrayListHandler 将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
    BeanHandler 将结果集中第一条记录封装到一个指定的javaBean中。
    BeanListHandler 将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
    ColumnListHandler 将结果集中指定的列的字段值,封装到一个List集合中
    ScalarHandler 它是用于单数据。例如select count(*) from 表操作。
    MapHandler 将结果集第一行封装到Map集合中,Key 列名, Value 该列数据
    MapListHandler 将结果集第一行封装到Map集合中,Key 列名, Value 该列数据,Map集合存储到List集合

4. QueryRunner类的方法query
  a: QueryRunner类的方法query数据查询操作
    调用QueryRunner类方法query(Connection con,String sql,ResultSetHandler r, Object..params)
    ResultSetHandler r 结果集的处理方式,传递ResultSetHandler接口实现类
    Object..params SQL语句中的?占位符
    注意: query方法返回值,返回的是T 泛型, 具体返回值类型,跟随结果集处理方式变化

  b:代码实现:   

  1 /**
  2  * 使用QueryRunner类中的
  3  * query(Connection conn, String sql, ResultSetHandler<T> rsh, 
  4  *                         Object... params)
  5  * 完成对数据的查询操作
  6  * ResultSetHandler结果集处理类 8中处理结果集的方式
  7  *  ArrayHandler    将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值
  8  *  ArrayListHandler    将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
  9  *  BeanHandler    将结果集中第一条记录封装到一个指定的javaBean中。
 10  *  BeanListHandler    将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
 11  *  ColumnListHandler    将结果集中指定的列的字段值,封装到一个List集合中
 12  *  ScalarHandler    它是用于单数据。例如select count(*) from 表操作。
 13  *  MapHandler    将结果集第一行封装到Map集合中,Key 列名, Value 该列数据
 14  *  MapListHandler    将结果集第一行封装到Map集合中,Key 列名, Value 该列数据,Map集合存储到List集合
 15  * @author vanguard
 16  *
 17  */
 18 public class QueryRunnerDmoe01 {
 19     private static Connection conn = JDBCUtils.getConnection();
 20     
 21     public static void main(String[] args) throws SQLException {
 22         //arrayHandler();
 23         //arrayListHandler();
 24         //beanHandler();
 25         //beanListHandler();
 26         //columnListHandler();
 27         //scalarHandler();
 28         //mapHandler();
 29         mapListHandler();
 30     }
 31     
 32     /**
 33      * 结果集处理的第八种方式MapListHandler
 34      * 将结果集的每一行结果封装到Map集合中,Key 列名,Value 该列的数据
 35      * 将Map集合放到List集合中
 36      * @throws SQLException
 37      */
 38     private static void mapListHandler() throws SQLException {
 39         //创建QueryRunner类对象
 40         QueryRunner qr = new QueryRunner();
 41         //定义查询的sql语句
 42         String sql = "SELECT * FROM sort";
 43         //调用query()执行查询操作,传递连接对象,SQL语句,结果处理类方式的实现类
 44         List<Map<String, Object>> list = qr.query(conn, sql, new MapListHandler());
 45         //遍历List集合
 46         for(Map<String, Object> map : list) {
 47             for(String row : map.keySet()) {
 48                 System.out.print(row + ":" + map.get(row) + "\t");
 49             }
 50             System.out.println();
 51         }
 52     }
 53 
 54     /**
 55      * 结果集处理的第七种方式MapHandler
 56      * 将结果集的第一行数据封装到Map集合中 Key 列名 Value 该列数据
 57      * @throws SQLException
 58      */
 59     private static void mapHandler() throws SQLException {
 60         //创建QueryRunner类对象
 61         QueryRunner qr = new QueryRunner();
 62         //定义查询的sql语句
 63         String sql = "SELECT * FROM sort";
 64         //调用query()执行查询操作,传递连接对象,SQL语句,结果处理类方式的实现类
 65         Map<String, Object> map = qr.query(conn, sql, new MapHandler());
 66         for(String row : map.keySet()) {
 67             System.out.print(row + ":" + map.get(row) + "  ");
 68         }
 69     }
 70 
 71     /**
 72      * 结果集处理的第六种方式ScalarHandler
 73      * 它用于单数据,对于查询后只有一个结果
 74      * @throws SQLException
 75      */
 76     private static void scalarHandler() throws SQLException {
 77         //创建QueryRunner类对象
 78         QueryRunner qr = new QueryRunner();
 79         //定义查询的sql语句
 80         String sql = "SELECT COUNT(*) FROM sort";
 81         //调用query()执行查询操作,传递连接对象,SQL语句,结果处理类方式的实现类
 82         long count = qr.query(conn, sql, new ScalarHandler<Long>());
 83         System.out.println(count);
 84     }
 85     
 86     /**
 87      * 结果集处理的第五种方式ColumnListHandler
 88      * 将结果集中指定列的字段值封装到list集合中
 89      * @throws SQLException
 90      */
 91     private static void columnListHandler() throws SQLException {
 92         //创建QueryRunner类对象
 93         QueryRunner qr = new QueryRunner();
 94         //定义查询的sql语句
 95         String sql = "SELECT * FROM sort";
 96         //调用query()执行查询操作,传递连接对象,SQL语句,结果处理类方式的实现类
 97         List<String> list = qr.query(conn, sql, new ColumnListHandler<String>("sname"));
 98         for(String name : list) {
 99             System.out.println(name);
100         } 
101     }
102 
103     /**
104      * 结果集处理的第四种方式BeanListHandler
105      * 将结果集中每一条数据封装到JavaBean对象中
106      * 将这些JavaBean对象放到list集合中
107      * @throws SQLException
108      */
109     private static void beanListHandler() throws SQLException {
110         //创建QueryRunner类对象
111         QueryRunner qr = new QueryRunner();
112         //定义查询的sql语句
113         String sql = "SELECT * FROM sort";
114         //调用query()执行查询操作,传递连接对象,SQL语句,结果处理类方式的实现类
115         List<Sort> list = qr.query(conn, sql, new BeanListHandler<Sort>(Sort.class));
116         //遍历list集合
117         for(Sort s : list) {
118             System.out.println(s);
119         }
120     }
121 
122     /**
123      * 结果集处理的第三种方式BeanHandler
124      * 将结果集中的第一条数据封装到JavaBean对象中
125      * 注意:被封装成数据到JavaBean对象,Sort类中必须有空参构造
126      * @throws SQLException
127      */
128     private static void beanHandler() throws SQLException {
129         //创建QueryRunner类对象
130         QueryRunner qr = new QueryRunner();
131         //定义查询的sql语句
132         String sql = "SELECT * FROM sort";
133         //调用query()执行查询操作,传递连接对象,SQL语句,结果处理类方式的实现类
134         Sort s = qr.query(conn, sql, new BeanHandler<Sort>(Sort.class));
135         System.out.println(s);
136     }
137 
138     /**
139      * 结果集处理的第二种方式ArrayListHandler
140      * 将结果集的每一行封装到Object[]数组中
141      * 将这些数组放到list集合中
142      * @throws SQLException
143      */
144     private static void arrayListHandler() throws SQLException {
145         //创建QueryRunner类对象
146         QueryRunner qr = new QueryRunner();
147         //定义查询的sql语句
148         String sql = "SELECT * FROM sort";
149         //调用query()执行查询操作,传递连接对象,SQL语句,结果处理类方式的实现类
150         List<Object[]> list = qr.query(conn, sql, new ArrayListHandler());
151         for(Object[] objs : list) {
152             for(Object obj : objs) {
153                 System.out.print(obj + "\t\t");
154             }
155             System.out.println();
156         }
157     }
158 
159     /**
160      * 结果集处理的第一种方式ArrayHandler
161      * 将结果集的第一行封装到Object[]数组中
162      * @throws SQLException 
163      */
164     private static void arrayHandler() throws SQLException {
165         //创建QueryRunner类对象
166         QueryRunner qr = new QueryRunner();
167         //定义查询的sql语句
168         String sql = "SELECT * FROM sort";
169         //调用query()执行查询操作,传递连接对象,SQL语句,结果处理类方式的实现类
170         Object[] objects = qr.query(conn, sql, new ArrayHandler());
171         //遍历数组
172         for(Object obj : objects) {
173             System.out.print(obj + "  ");
174         }
175     }
176 }
 1 public class Sort {
 2     private int sid;
 3     private String sname;
 4     private int sprice;
 5     private String sdesc;
 6     
 7     public Sort() {}
 8     
 9     public Sort(int sid, String sname, int sprice, String sdesc) {
10         super();
11         this.sid = sid;
12         this.sname = sname;
13         this.sprice = sprice;
14         this.sdesc = sdesc;
15     }
16 
17     public int getSid() {
18         return sid;
19     }
20 
21     public void setSid(int sid) {
22         this.sid = sid;
23     }
24 
25     public String getSname() {
26         return sname;
27     }
28 
29     public void setSname(String sname) {
30         this.sname = sname;
31     }
32 
33     public int getSprice() {
34         return sprice;
35     }
36 
37     public void setSprice(int sprice) {
38         this.sprice = sprice;
39     }
40 
41     public String getSdesc() {
42         return sdesc;
43     }
44 
45     public void setSdesc(String sdesc) {
46         this.sdesc = sdesc;
47     }
48 
49     @Override
50     public String toString() {
51         return "Sort [sid=" + sid + ", sname=" + sname + ", sprice=" + sprice
52                 + ", sdesc=" + sdesc + "]";
53     }
54     
55     
56 }

5. 连接池介绍
  1): 连接池介绍
    a: 连接池介绍
      实际上就是存放连接的池子(容器)
     在开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程
     为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。
     这样我们就不需要每次都创建连接、释放连接了,这些操作都交给了连接池

 2): 连接池概念规范和DataSource接口
   a: 连接池概念规范
     用池来管理Connection,这样可以重复使用Connection。
     不用自己来创建Connection,而是通过池来获取Connection对象
     使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池
     连接池技术可以完成Connection对象的再次利用
   b: DataSource接口
     Java为数据库连接池提供了公共的接口:javax.sql.DataSource
     各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池
     常见的连接池:DBCP、C3P0

 3): DBCP连接池介绍
   a: DBCP连接池介绍
     DBCP也是一个开源的连接池,是Apache Common成员之一,在企业开发中也比较常见,tomcat内置的连接池

 4): 导入jar包
   a: jar包介绍
    mysql-connector-java-5.1.37-bin.jar:数据库驱动
    commons-dbutils-1.6.jar:提供QueryRunner类方便进行增删改查操作
    commons-dbcp-1.4.jar:
    commons-pool-1.5.6.jar:提供高效的数据库连接池技术
  b: 导入jar包
    在项目根路径下建立文件夹lib
    拷贝以上jar包,选定拷贝的jar包/右键/Build Path/Add to Build Path

 5): BasicDataSource类的使用
   a: 案例代码

      

 1 /**
 2  * 连接池
 3  * 连接池jar包中定义好了一个类DataSource
 4  * 实现该类数据源的规范接口 javax.sql.DataSource
 5  * @author vanguard
 6  *
 7  */
 8 public class DataSourceDemo {
 9     public static void main(String[] args) {
10         //创建DataSource类接口的实现类对象
11         BasicDataSource datasource = new BasicDataSource();
12         //连接数据库的四个基本信息可以通过setXXX方法设置
13         datasource.setDriverClassName("com.mysql.jdbc.Driver");
14         datasource.setUrl("jdbc:mysql://localhost:3306/mybase");
15         datasource.setUsername("root");
16         datasource.setPassword("root");
17         
18         //调用对象的方法获取数据库连接
19         try {
20             Connection conn = datasource.getConnection();
21             System.out.println(conn);
22         } catch (SQLException e) {
23             e.printStackTrace();
24             throw new RuntimeException("数据库连接失败");
25         }
26     }
27 }

 

 6): BasicDataSource类的常见配置
   a: 常见配置
     分类 属性 描述
     必须项
      driverClassName 数据库驱动名称
      url 数据库的地址
      username 用户名
      password 密码
   基本项(扩展)
      maxActive 最大连接数量
      minIdle 最小空闲连接
      maxIdle 最大空闲连接
      initialSize 初始化连接

 7): 实现数据库连接池工具类
    a: 案例代码
      

 1 /**
 2  *  使用DBCP实现数据库的连接池
 3  *  连接池配置,自定义类,
 4  *  最基本四项完整
 5  *  对于数据库连接池其他配置,自定义
 6  * @author vanguard
 7  *
 8  */
 9 public class JDBCPoolUtils {
10     //创建出BasicDataSource类对象
11     private static BasicDataSource datasource = new BasicDataSource();
12     
13     //静态代码块,对BasicDataSource类进行配置
14     static {
15         //数据库连接信息,必须的
16         datasource.setDriverClassName("com.mysql.jdbc.Driver");
17         datasource.setUrl("jdbc:mysql://localhost:3306/stdb");
18         datasource.setUsername("root");
19         datasource.setPassword("root");
20         //对象连接池中的连接数量配置,可选
21         datasource.setInitialSize(10);//初始化的连接数
22         datasource.setMaxActive(8);//最大的连接数
23         datasource.setMaxIdle(5);//最大空闲数
24         datasource.setMinIdle(2);//最小空闲数
25     }
26     /**
27      * 返回BasicDataSource类对象
28      * @return
29      */
30     public static DataSource getDataSource() {
31         return datasource;
32     }
33 }


 8): 工具类的测试
   a: 案例代码

 1 /**
 2  * 测试写好的工具类
 3  * 提供的是一个DataSource接口的数据源
 4  *  QueryRunner类构造方法,接收DataSource接口的实现类
 5  *  后面,调用方法update,query,无需传递他们Connection连接对象
 6  * @author vanguard
 7  *
 8  */
 9 public class QueryRunnerDemo {
10     private static QueryRunner qr = new QueryRunner(JDBCPoolUtils.getDataSource());
11     
12     public static void main(String[] args) {
13         //insert();
14         select();
15     }
16     /**
17      * 定义查询数据的方法
18      */
19     private static void select() {
20         String sql = "SELECT * FROM sort";
21         try {
22             List<Object[]> list = qr.query(sql, new ArrayListHandler());
23             for(Object[] objs : list) {
24                 for(Object obj : objs) {
25                     System.out.print(obj + "\t");
26                 }
27                 System.out.println();
28             }
29         } catch (SQLException e) {
30             
31             e.printStackTrace();
32             throw new RuntimeException("数据库查询失败");
33         }
34     }
35 
36     /**
37      * 定义添加数据的方法
38      */
39     private static void insert() {
40         String sql = "INSERT INTO sort(sname,sprice,sdesc) VALUES(?,?,?)";
41         Object[] params = {"水果", 20.5, "桃子便宜了"};
42         try {
43             int row = qr.update(sql, params);
44             System.out.println(row);
45         } catch (SQLException e) {
46             
47             e.printStackTrace();
48             throw new RuntimeException("数据添加失败");
49         }
50     }
51 }

 

posted @ 2017-07-26 16:59  Vanguard  阅读(6019)  评论(1编辑  收藏  举报