zoukankan      html  css  js  c++  java
  • 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) + "	");
     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 + "		");
    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 + "	");
    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 }
  • 相关阅读:
    Ng-model undefined in the controller
    使用nvm进行node多版本管理
    AngularJS内置指令
    angularjs ng-switch
    Interpreting NotifyCollectionChangedEventArgs zz
    XAML控件不可访问,它具有一定的保护级别
    WPF RadioButton的绑定
    WPF中的ObservableCollection数据绑定
    C#语法中一个问号(?)和两个问号(??)的运算符是什么意思?zz
    python 获取mac地址zz
  • 原文地址:https://www.cnblogs.com/guodong-wang/p/7240646.html
Copyright © 2011-2022 走看看