jdbccommons.dbutils1.2介绍及使用
代长亚一、结构介绍
高层结构图:

wrappers包:

handlers包(部分):

二、功能介绍
commons.dbutils是一个对JDBC操作进行封装的类集,其有如下几个优点:
(1)没有可能的资源泄漏,避免了繁锁的JDBC代码
(2)代码更整洁
(3)从ResultSet自动生成JavaBeans属性
(4)无其他依赖包
三、基本使用
基本用到的类有:QueryRunner、ResultSetHandler及其子类等
QueryRunner – 执行查询的类,可以执行SELECT、INSERT、UPDATE、DELETE等语句,QueryRunner用ResultSetHandler的子类来处理ResultSet并返回结果;而包提供的ResultSetHandler子类使用RowProcessor的子类来处理ResultSet中的每一行;RowProcessor的默认实现为BasicRowProcessor;BeanProcessor不是RowProcessor,可以看作一个工具类
ResultHandler及其子类 – 实现了Object handle(ResultSet rs) throws SQLException方法
AbstractListHandler – 返回多行List的抽象类
ArrayHandler – 返回一行的Object[]
ArrayListHandler – 返回List,每行是Object[]
BeanHandler – 返回第一个Bean对象
BeanListHandler – 返回List,每行是Bean
ColumnListHandler – 返回一列的List
KeyedHandler – 返回Map,具体见代码
MapHandler – 返回单个Map
MapListHandler – 返回List,每行是Map
ScalarHandler – 返回列的头一个值
代码:
[java] view plaincopy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| //建表语句 DROP TABLE IF EXISTS `test`.`user`; CREATE TABLE `test`.`user` ( `name` varchar(10) DEFAULT NULL, `password` varchar(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; 表中数据 'user1', 'pwd1' 'user2', 'pwd2' //User类 public class User { private String name; private String pwd; public User(){ } public void setName(String val) { this.name = val; } public void setPassword(String val) { this.pwd = val; } public String getName() { return name; } public String getPassword() { return pwd; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
| package dbutiltest; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.List; import java.util.Map; import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; import org.apache.commons.dbutils.handlers.ArrayHandler; import org.apache.commons.dbutils.handlers.ArrayListHandler; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.commons.dbutils.handlers.KeyedHandler; import org.apache.commons.dbutils.handlers.MapListHandler; public class TestDbUtils { static { try { Class.forName("org.gjt.mm.mysql.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); System.exit(1); } } public Connection getConnection() { Connection conn = null; try { conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test", "root", "pwd"); } catch (SQLException e) { e.printStackTrace(); } return conn; } public static void main(String[] args) { TestDbUtils u = new TestDbUtils(); u.testArrayHandler(); u.testArrayListHandler(); u.testBeanListHandler(); u.testMapListHandler(); u.testColumnListHandler(); u.testNonQuery(); } public void testArrayHandler() { System.out.println("----testArrayHandler----"); String sql = "select * from user"; ResultSetHandler handler = new ArrayHandler(); QueryRunner query = new QueryRunner(); Connection conn = null; try { conn = getConnection(); Object[] arr = (Object[])query.query(conn, sql, handler); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i].toString()); } } catch (SQLException e) { e.printStackTrace(); } finally { try { DbUtils.close(conn); } catch (SQLException e) { // ignore } } } public void testArrayListHandler() { System.out.println("----testArrayListHandler----"); String sql = "select * from user"; ResultSetHandler handler = new ArrayListHandler(); QueryRunner query = new QueryRunner(); Connection conn = null; try { conn = getConnection(); List list = (List)query.query(conn, sql, handler); for (int i = 0; i < list.size(); i++) { Object[] arr = (Object[])list.get(i); for (int j = 0; j < arr.length; j++) { System.out.print(arr[j] + " "); } System.out.println(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { DbUtils.close(conn); } catch (SQLException e) { // ignore } } } public void testBeanListHandler() { System.out.println("----testBeanListHandler----"); String sql = "select * from user where name=?"; Object[] params = new Object[]{"user1"}; ResultSetHandler handler = new BeanListHandler(User.class); QueryRunner query = new QueryRunner(); Connection conn = null; try { conn = getConnection(); List list = (List)query.query(conn, sql, params, handler); for (int i = 0; i < list.size(); i++) { User user = (User)list.get(i); System.out.println(user.getName() + " " + user.getPassword()); } } catch (SQLException e) { e.printStackTrace(); } finally { try { DbUtils.close(conn); } catch (SQLException e) { // ignore } } } public void testMapListHandler() { System.out.println("----testMapListHandler----"); String sql = "select * from user where name=?"; Object[] params = new Object[]{"user1"}; ResultSetHandler handler = new MapListHandler(); QueryRunner query = new QueryRunner(); Connection conn = null; try { conn = getConnection(); List list = (List)query.query(conn, sql, params, handler); for (int i = 0; i < list.size(); i++) { Map user = (Map)list.get(i); System.out.println(user.get("name") + " " + user.get("password")); } } catch (SQLException e) { e.printStackTrace(); } finally { try { DbUtils.close(conn); } catch (SQLException e) { // ignore } } } public void testColumnListHandler() { System.out.println("----testColumnListHandler----"); String sql = "select * from user"; ResultSetHandler handler = new ColumnListHandler("name"); QueryRunner query = new QueryRunner(); Connection conn = null; try { conn = getConnection(); List list = (List)query.query(conn, sql, handler); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } catch (SQLException e) { e.printStackTrace(); } finally { try { DbUtils.close(conn); } catch (SQLException e) { // ignore } } } public void testKeyedHandler() { System.out.println("----testKeyedHandler----"); String sql = "select * from user"; ResultSetHandler handler = new KeyedHandler("name"); QueryRunner query = new QueryRunner(); Connection conn = null; try { conn = getConnection(); Map map = (Map)query.query(conn, sql, handler); Map user = (Map)map.get("user2"); System.out.println(user.get("password")); } catch (SQLException e) { e.printStackTrace(); } finally { try { DbUtils.close(conn); } catch (SQLException e) { // ignore } } } public void testNonQuery() { System.out.println("----testNonQuery----"); String sql = "insert into `user` values('user_test','pwd_test')"; QueryRunner query = new QueryRunner(); Connection conn = null; try { conn = getConnection(); query.update(conn, sql); } catch (SQLException e) { e.printStackTrace(); } finally { try { DbUtils.close(conn); } catch (SQLException e) { // ignore } } } }
|
关于wrappers包:
在新建 QueryRunner时,覆盖父类的方法wrap
1 2 3 4 5
| QueryRunner query = new QueryRunner() { protected ResultSet wrap(ResultSet rs) { return StringTrimmedResultSet.wrap(rs); } };
|
四、扩展
1.RowProcessor接口
2.ResultSetHandler接口