zoukankan      html  css  js  c++  java
  • jdbc框架 commons-dbutils的使用

     commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。

      commons-dbutilsAPI介绍:

    • org.apache.commons.dbutils.QueryRunner
    • org.apache.commons.dbutils.ResultSetHandler

      工具类

    • org.apache.commons.dbutils.DbUtils

    直接上代码:

    1.先建立一个jdbc的连接相关类:

      1 package com.ming.core.db;
      2 
      3 import java.io.InputStream;
      4 import java.io.PrintWriter;
      5 import java.sql.Connection;
      6 import java.sql.DriverManager;
      7 import java.sql.PreparedStatement;
      8 import java.sql.ResultSet;
      9 import java.sql.SQLException;
     10 import java.sql.SQLFeatureNotSupportedException;
     11 import java.sql.Statement;
     12 import java.util.Properties;
     13 import java.util.logging.Logger;
     14 
     15 import javax.sql.DataSource;
     16 
     17 import org.apache.commons.dbutils.ResultSetHandler;
     18 
     19 public class JdbcUtils {
     20 
     21     private static String driver = "com.mysql.jdbc.Driver";
     22     private static String url = "jdbc:mysql://localhost:3306/test";
     23     private static String username = "root";
     24     private static String password = "root";
     25     static {
     26         try {
     27             // 加载数据库驱动
     28             Class.forName(driver);
     29         } catch (Exception e) {
     30             throw new ExceptionInInitializerError(e);
     31         }
     32     }
     33 
     34     /**
     35      * @Method: getConnection
     36      * @Description: 获取数据库连接对象
     37      * @Anthor:孤傲苍狼
     38      *
     39      * @return Connection数据库连接对象
     40      * @throws SQLException
     41      */
     42     public static Connection getConnection() throws SQLException {
     43         return DriverManager.getConnection(url, username, password);
     44     }
     45 
     46     /**
     47      * @Method: release
     48      * @Description: 释放资源, 要释放的资源包括Connection数据库连接对象,负责执行SQL命令的Statement对象,
     49      *               存储查询结果的ResultSet对象
     50      * @Anthor:孤傲苍狼
     51      *
     52      * @param conn
     53      * @param st
     54      * @param rs
     55      */
     56     public static void release(Connection conn, Statement st, ResultSet rs) {
     57         if (rs != null) {
     58             try {
     59                 // 关闭存储查询结果的ResultSet对象
     60                 rs.close();
     61             } catch (Exception e) {
     62                 e.printStackTrace();
     63             }
     64             rs = null;
     65         }
     66         if (st != null) {
     67             try {
     68                 // 关闭负责执行SQL命令的Statement对象
     69                 st.close();
     70             } catch (Exception e) {
     71                 e.printStackTrace();
     72             }
     73         }
     74 
     75         if (conn != null) {
     76             try {
     77                 // 关闭Connection数据库连接对象
     78                 conn.close();
     79             } catch (Exception e) {
     80                 e.printStackTrace();
     81             }
     82         }
     83     }
     84 
     85     /**
     86      * @Method: update
     87      * @Description: 万能更新 所有实体的CUD操作代码基本相同,仅仅发送给数据库的SQL语句不同而已,
     88      *               因此可以把CUD操作的所有相同代码抽取到工具类的一个update方法中,并定义参数接收变化的SQL语句
     89      * @Anthor:孤傲苍狼
     90      * @param sql
     91      *            要执行的SQL
     92      * @param params
     93      *            执行SQL时使用的参数
     94      * @throws SQLException
     95      */
     96     public static void update(String sql, Object params[]) throws SQLException {
     97         Connection conn = null;
     98         PreparedStatement st = null;
     99         ResultSet rs = null;
    100         try {
    101             conn = getConnection();
    102             st = conn.prepareStatement(sql);
    103             for (int i = 0; i < params.length; i++) {
    104                 st.setObject(i + 1, params[i]);
    105             }
    106             st.executeUpdate();
    107 
    108         } finally {
    109             release(conn, st, rs);
    110         }
    111     }
    112 
    113     /**
    114      * @Method: query
    115      * @Description:万能查询 实体的R操作,除SQL语句不同之外,根据操作的实体不同,对ResultSet的映射也各不相同,
    116      *                   因此可义一个query方法,除以参数形式接收变化的SQL语句外,
    117      *                   可以使用策略模式由qurey方法的调用者决定如何把ResultSet中的数据映射到实体对象中。
    118      * @Anthor:孤傲苍狼
    119      *
    120      * @param sql
    121      *            要执行的SQL
    122      * @param params
    123      *            执行SQL时使用的参数
    124      * @param rsh
    125      *            查询返回的结果集处理器
    126      * @return
    127      * @throws SQLException
    128      */
    129     public static Object query(String sql, Object params[], ResultSetHandler rsh) throws SQLException {
    130 
    131         Connection conn = null;
    132         PreparedStatement st = null;
    133         ResultSet rs = null;
    134 
    135         try {
    136             conn = getConnection();
    137             st = conn.prepareStatement(sql);
    138             for (int i = 0; i < params.length; i++) {
    139                 st.setObject(i + 1, params[i]);
    140             }
    141             rs = st.executeQuery();
    142             /**
    143              * 对于查询返回的结果集处理使用到了策略模式,
    144              * 在设计query方法时,query方法事先是无法知道用户对返回的查询结果集如何进行处理的,即不知道结果集的处理策略,
    145              * 那么这个结果集的处理策略就让用户自己提供,query方法内部就调用用户提交的结果集处理策略进行处理
    146              * 为了能够让用户提供结果集的处理策略,需要对用户暴露出一个结果集处理接口ResultSetHandler
    147              * 用户只要实现了ResultSetHandler接口,那么query方法内部就知道用户要如何处理结果集了
    148              */
    149             return rsh.handle(rs);
    150 
    151         } finally {
    152             release(conn, st, rs);
    153         }
    154     }
    155     
    156     public static DataSource getDataSource(){
    157         return new DataSource() {
    158             
    159             
    160             @Override
    161             public Connection getConnection(String username, String password) throws SQLException {
    162                 
    163                 return null;
    164             }
    165             
    166             @Override
    167             public Connection getConnection() throws SQLException {
    168                 
    169                 return JdbcUtils.getConnection();
    170             }
    171 
    172             @Override
    173             public PrintWriter getLogWriter() throws SQLException {
    174                 
    175                 return null;
    176             }
    177 
    178             @Override
    179             public int getLoginTimeout() throws SQLException {
    180                 
    181                 return 0;
    182             }
    183 
    184             @Override
    185             public Logger getParentLogger() throws SQLFeatureNotSupportedException {
    186                 
    187                 return null;
    188             }
    189 
    190             @Override
    191             public void setLogWriter(PrintWriter out) throws SQLException {
    192                 
    193                 
    194             }
    195 
    196             @Override
    197             public void setLoginTimeout(int seconds) throws SQLException {
    198                 
    199                 
    200             }
    201 
    202             @Override
    203             public boolean isWrapperFor(Class<?> iface) throws SQLException {
    204                 
    205                 return false;
    206             }
    207 
    208             @Override
    209             public <T> T unwrap(Class<T> iface) throws SQLException {
    210                 
    211                 return null;
    212             }
    213         };
    214     }
    215 }

    2.建立一个与数据相关的实体类

     1 package com.ming.user.entity;
     2 
     3 public class User {
     4 
     5     private int id;
     6     
     7     private String account;
     8     
     9     private int user_id;
    10 
    11     public int getId() {
    12         return id;
    13     }
    14 
    15     public void setId(int id) {
    16         this.id = id;
    17     }
    18 
    19     public String getAccount() {
    20         return account;
    21     }
    22 
    23     public void setAccount(String account) {
    24         this.account = account;
    25     }
    26 
    27     public int getUser_id() {
    28         return user_id;
    29     }
    30 
    31     public void setUser_id(int user_id) {
    32         this.user_id = user_id;
    33     }
    34     
    35     
    36 }

    3.数据库操作类及测试方法

     1 package com.ming.core.db;
     2 
     3 import java.sql.SQLException;
     4 import java.util.List;
     5 
     6 
     7 import org.apache.commons.dbutils.QueryRunner;
     8 import org.apache.commons.dbutils.handlers.BeanHandler;
     9 import org.apache.commons.dbutils.handlers.BeanListHandler;
    10 
    11 import com.ming.user.entity.User;
    12 
    13 public class QueryRunnerCRUDTest {
    14 
    15     /*
    16      *测试表
    17     CREATE TABLE `users` (
    18         `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    19         `account` VARCHAR(50) NULL DEFAULT NULL,
    20         `user_id` BIGINT(20) NOT NULL,
    21         PRIMARY KEY (`id`)
    22     )
    23     COMMENT='user表'
    24     COLLATE='latin1_swedish_ci'
    25     ENGINE=InnoDB
    26     ;
    27      */
    28     
    29     
    30     public void add() throws SQLException {
    31         //将数据源传递给QueryRunner,QueryRunner内部通过数据源获取数据库连接
    32         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
    33         String sql = "INSERT INTO `test`.`users` (`account`, `user_id`) VALUES (?, ?);";
    34         Object params[] = {"hello world",2323};
    35   
    36         qr.update(sql, params);
    37     }
    38     
    39    
    40     
    41     public void delete() throws SQLException {
    42         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
    43         String sql = "delete from users where id=?";
    44         qr.update(sql, 1);
    45 
    46     }
    47 
    48     
    49     public void update() throws SQLException {
    50         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
    51         String sql = "update users set account=? where id=?";
    52         Object params[] = { "ddd", 2};
    53         qr.update(sql, params);
    54     }
    55 
    56     
    57     public void find() throws SQLException {
    58         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
    59         String sql = "select * from users where id=?";
    60         Object params[] = {2};
    61         User user = (User) qr.query(sql, params, new BeanHandler(User.class));
    62        System.out.println(user.getId());
    63     }
    64 
    65     
    66     public void getAll() throws SQLException {
    67         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
    68         String sql = "select * from users";
    69         List<User> list = (List<User>) qr.query(sql, new BeanListHandler(User.class));
    70         for(User u : list){
    71              System.out.println(u.getUser_id());
    72         }
    73        
    74     }
    75     
    76     public void testBatch() throws SQLException {
    77         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
    78         String sql = "INSERT INTO `test`.`users` (`account`, `user_id`) VALUES (?, ?)";
    79         Object params[][] = new Object[10][];
    80         for (int i = 0; i < 10; i++) {
    81             params[i] = new Object[] {"123"+i, i};
    82         }
    83         qr.batch(sql, params);
    84     }
    85     
    86     public static void main(String[] args) throws Exception {
    87         QueryRunnerCRUDTest t=new QueryRunnerCRUDTest();
    88         t.add();
    89         t.find();
    90         t.delete();
    91     }
    92     
    93 
    94 }

    以上代码都测试通了。

    该博客参考:http://www.cnblogs.com/xdp-gacl/p/4007225.html

    源码下载:http://pan.baidu.com/s/1mhDtMti

  • 相关阅读:
    Elasticsearch崩溃解决办法
    阿里云服务器ubuntu14.04安装Redis
    error: command ‘x86_64-linux-gnu-gcc’ failed with exit status 1
    本机访问阿里云服务器上的Elasticsearch
    阿里云服务器配置ElasticSearch
    ElasticSearch-RTF的安装
    【已解决】neo4j-import使用过程中遇到的问题(there's a field starting with a quote and whereas it ends that quote there seems to be characters in that field /Executor has been shut down in panic)
    OutOfMemoryError和StackOverflowError
    线程的终止
    scala基础
  • 原文地址:https://www.cnblogs.com/huzi007/p/5788223.html
Copyright © 2011-2022 走看看