目录
前言:JavaBean组件
JavaBean 就是一个类,在开发中常用于封装数据。具有如下特性
- 1. 需要实现接口:java.io.Serializable,通常偷懒省略了
- 2. 提供私有字段:private 类型 字段名;
- 3. 提供getter/setter方法
- 4. 提供无参构造
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 |
package cn.benz.domain; //类名一般对应表名,类名user对应user表 public class User { //提供私有字段 //一般对应表的字段,user表有id、username、pw三个字段 private int id; private String username; private String pw; //提供无参构造 public User() { } //提供getter/setter方法 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPw() { return pw; } public void setPw(String pw) { this.pw = pw; } } |
一、DBUtils完成CRUD
DBUtils 是java编程中的数据库操作实用工具,小巧简单实用。
DBUtils 封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
DBUtils 三个核心功能介绍
- QueryRunner 中提供对SQL语句操作API
- ResultSetHandler 接口,用于定义select操作后,怎么封装结果集
- DbUtils类,它就是一个工具类,定义的关闭资源与事务处理的方法
QueryRunner核心类
- QueryRunner(DataSource ds),提供数据源(连接池),DBUtils底层自动维护连接Connection
- update(String sql,Object… params),执行更新数据(update/delecte/alert)
- query((String sql,ResultSetHandler rsh,Object… params),执行查询(select)
ResultSetHandler 结果集处理类
ArrayHandler | 将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值。 |
ArrayListHandler | 将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组再封装到List集合中。 |
BeanHandler | 将结果集中的第一条记录封装到一个指定的JavaBean中 |
BeanListHandler | 将结果集中的每一条记录都封装到一个指定的JavaBean中,将这些JavaBean再封装到List集合中。 |
ColumnListHandler | 将结果集中指定的列的字段值,封装到一个List集合中。 |
KeyedHandler | 将结果集中的每一条记录都封装到Map<String,Object>中,再将这个Map集合做为另一个Map的value,另一个Map集合的key是指定的字段的值。 |
MapHandler | 将结果集中的第一条记录封装到Map<String,Object>集合中,key就是字段名称,value就是字段值。 |
MapListHandler | 将结果集中的每一条记录封装到Map<String,Object>集合中,key就是字段名称,value就是字段值,再将这些Map封装到List集合中。 |
ScalarHandler | 它用于单数据,例如:select count(*) from 表名 操作 |
DBUtils 工具类
- closeQuitely(Connection conn) 关闭连接,如果有异常,try后不抛
- commitAndCloseQuitely(Connection conn) 提交并关闭连接
- rollbackAndCloseQuitely(Connection conn) 回滚并关闭连接
DBUtils使用,简单示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public void testupdate(){ //1. 获取DBUtils核心类,QueryRunner(DataSource dataSource) QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());//C3p0Utils.getDataSource() 这里使用的是c3p0提供的连接池 //2. 写SQL语句,对应update(sql,Object param)中的 sql String sql="update user set username=? where id=?"; //3. 设置参数,对应update(sql,Object param)中的 Object param Object[] param = {"耿耿",1}; //4. 查询 try { //调用QueryRunner()的update(sql, param)方法,对数据库操作 int row = qr.update(sql, param); if (row>0) { System.out.println("更新成功"); }else { System.out.println("更新失败"); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } |
ResultSetHandler处理类的各个实现示例
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 |
package cn.benz.test; import java.sql.SQLException; import java.util.List; import java.util.Map; import org.apache.commons.dbutils.QueryRunner; 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.MapListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.junit.Test; import cn.benz.Utils.C3p0Utils; import cn.benz.domain.User; public class TestDBUtils { @Test public void testupdate(){ //1. 获取DBUtils核心类,QueryRunner(DataSource dataSource) QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource()); //2. 写SQL语句,对应update(sql,Object param)中的 sql String sql="update user set username=? where id=?"; //3. 设置参数,对应update(sql,Object param)中的 Object param Object[] param = {"耿耿",1}; //4. 查询 try { int row = qr.update(sql, param); if (row>0) { System.out.println("更新成功"); }else { System.out.println("更新失败"); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 按条件查询,得到单条数据,使用BeanHandler类型 */ @Test public void testQuerybyParam() { //1. 获取DBUtils核心类,QueryRunner(DataSource dataSource) QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource()); // 2. 写SQL语句,对应query(sql,ResultSetHandler<T> rsh,Object param)中的 sql String sql = "select * from user where id = ?"; //3. 设置参数,对应update(sql,Object param)中的 Object param Object[] param = {1}; //4. 查询 try { //这里要设置结果集类型(ResultSetHandler<T> rsh)为 BeanHandler //BeanHandler<User>(User.class) 其中User为自己写的javabean类 //BeanHandler只获得一条数据 User user = qr.query(sql,new BeanHandler<User>(User.class),param); System.out.println(user.getId()+":"+user.getUsername()+":"+user.getPw()); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * Beanlisthandler数据集 * public void User(){ * private int id= 1; * private String username ="test"; * private String pw ="123456"; * } */ @Test public void testQueryAllbyBeanlisthandler() { //1. 获取DBUtils核心类,QueryRunner(DataSource dataSource) QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource()); // 2. 写SQL语句,对应query(sql,ResultSetHandler<T> rsh,Object param)中的 sql String sql = "select * from user"; //4. 查询 try { //这里要设置结果集类型(ResultSetHandler<T> rsh)为 BeanListHandler //BeanListHandler<User>(User.class) 其中User为自己写的javabean类 //因为BeanListHandler是把bean放入list容器里,所以最后的类型为list List<User> users = qr.query(sql,new BeanListHandler<User>(User.class)); for (User user : users) { System.out.println(user.getId()+":"+user.getUsername()+":"+user.getPw()); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * MapListHandler数据集 * {id=1, username=耿耿, pw=3721uc} {id=2, username=tester, pw=00001} {id=3, username=tester02, pw=00002} {id=4, username=c3p0aa, pw=00002} {id=5, username=c3p0aa, pw=00002} */ @Test public void testQueryAllbyMaplisthandler() { //1. 获取DBUtils核心类,QueryRunner(DataSource dataSource) QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource()); // 2. 写SQL语句,对应query(sql,ResultSetHandler<T> rsh,Object param)中的 sql String sql = "select * from user"; //4. 查询 try { //这里要设置结果集类型(ResultSetHandler<T> rsh)为 MapListHandler //MapListHandler 以键值对为类型 List<Map<String, Object>> list = qr.query(sql,new MapListHandler()); for (Map<String, Object> map : list) { System.out.println(map); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * ColumnListHandler(字段) 返回指定字段的结果集 * ColumnListHandler("username") 返回字段username的结果集 * 耿耿 tester tester02 c3p0aa c3p0aa */ @Test public void testQueryAllbyColumnlisthandler() { //1. 获取DBUtils核心类,QueryRunner(DataSource dataSource) QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource()); // 2. 写SQL语句,对应query(sql,ResultSetHandler<T> rsh,Object param)中的 sql String sql = "select * from user"; //4. 查询 try { //这里要设置结果集类型(ResultSetHandler<T> rsh)为 ColumnListHandler //ColumnListHandler(字段) 返回指定字段结果集 List<Object> col = qr.query(sql,new ColumnListHandler("username")); for (Object object : col) { System.out.println(object); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * ScalarHandler数据集 * 是单条数据 */ @Test public void testQueryAllbyScalarhandler() { //1. 获取DBUtils核心类,QueryRunner(DataSource dataSource) QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource()); // 2. 写SQL语句,对应query(sql,ResultSetHandler<T> rsh,Object param)中的 sql String sql = "select count(*) from user"; //4. 查询 try { //这里要设置结果集类型(ResultSetHandler<T> rsh)为 ScalarHandler //ScalarHandler 用于单数据,比如统计条数 //如果知道结果类型就用那个类型,不知道类型就用Object long count = (long) qr.query(sql,new ScalarHandler()); System.out.println(count); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
二、ResultSetHandler
我们知道在执行select语句之后得到的是ResultSet,然后我们还需要对ResultSet进行转换,得到最终我们想要的数据。你可以希望把ResultSet的数据放到一个List中,也可能想把数据放到一个Map中,或是一个Bean中。
DBUtils提供了一个接口ResultSetHandler,它就是用来ResultSet转换成目标类型的工具。你可以自己去实现这个接口,把ResultSet转换成你想要的类型。
DBUtils提供了很多个ResultSetHandler接口的实现,这些实现已经基本够用了,我们通常不用自己去实现ResultSet接口了。
- MapHandler:单行处理器!把结果集转换成Map<String,Object>,其中列名为键!
- MapListHandler:多行处理器!把结果集转换成List<Map<String,Object>>;
- BeanHandler:单行处理器!把结果集转换成Bean,该处理器需要Class参数,即Bean的类型;
- BeanListHandler:多行处理器!把结果集转换成List<Bean>;
- ColumnListHandler:多行单列处理器!把结果集转换成List<Object>,使用ColumnListHandler时需要指定某一列的名称或编号,例如:new ColumListHandler(“name”)表示把name列的数据放到List中。
- ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询,例如select count(*) from tab_student。