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

posted @ 2016-08-19 16:51  全力以赴001  阅读(5890)  评论(0编辑  收藏  举报