BeanUtils&&DbUtils
BeanUtils
程序中对javabean的操作很频繁, 所以apache提供了一套开源的api,方便对javabean的操作!即BeanUtils组件。
BeanUtils的作用是简化对javaBean的操作。
可以从www.apache.org下载BeanUtils组件,然后再在项目中引入jar文件!需要引入的jar文件有:
1、引入commons-beanutils-1.8.3.jar核心包
2、引入日志支持包: commons-logging-1.1.3.jar
基本用法
1、对属性的拷贝
BeanUtils.copyProperty(admin, "userName", "jack");
BeanUtils.setProperty(admin, "age", 18);
2、对象的拷贝
BeanUtils.copyProperties(newAdmin, admin);
3、map数据拷贝到javaBean中,map中的key必须要和javaBean的属性名一致。
BeanUtils.populate(adminMap, map);
4、BeanUtils对javabean中的基本数据类型是不需要做特殊处理的,但是对日期就必须转化处理了,其中有两种处理方式
(1)自定义转化器
1 //2. 自定义日期类型转换器 2 @Test 3 public void test2() throws Exception { 4 // 模拟表单数据 5 String name = "jack"; 6 String age = "20"; 7 String birth = " "; 8 9 // 对象 10 Admin admin = new Admin(); 11 12 // 注册日期类型转换器:1, 自定义的方式 13 ConvertUtils.register(new Converter() { 14 // 转换的内部实现方法,需要重写 15 @Override 16 public Object convert(Class type, Object value) { 17 18 // 判断 19 if (type != Date.class) { 20 return null; 21 } 22 if (value == null || "".equals(value.toString().trim())) { 23 return null; 24 } 25 26 27 try { 28 // 字符串转换为日期 29 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 30 return sdf.parse(value.toString()); 31 } catch (ParseException e) { 32 throw new RuntimeException(e); 33 } 34 } 35 },Date.class); 36 37 38 39 // 把表单提交的数据,封装到对象中 40 BeanUtils.copyProperty(admin, "userName", name); 41 BeanUtils.copyProperty(admin, "age", age); 42 BeanUtils.copyProperty(admin, "birth", birth); 43 44 //------ 测试------ 45 System.out.println(admin); 46 }
(2)使用BeanUtils自己的日期转化器
1 //2. 使用提供的日期类型转换器工具类 2 @Test 3 public void test3() throws Exception { 4 // 模拟表单数据 5 String name = "userName"; 6 String age = "20"; 7 String birth = null; 8 9 // 对象 10 Admin admin = new Admin(); 11 12 // 注册日期类型转换器:2, 使用组件提供的转换器工具类 13 ConvertUtils.register(new DateLocaleConverter(), Date.class); 14 15 // 把表单提交的数据,封装到对象中 16 BeanUtils.copyProperty(admin, "userName", name); 17 BeanUtils.copyProperty(admin, "age", age); 18 BeanUtils.copyProperty(admin, "birth", birth); 19 20 //------ 测试------ 21 System.out.println(admin); 22 } 23 }
DbUtils组件
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
Dbutils组件需要引入的jar文件:commons-dbutils-1.6.jar
常用API
|-- DbUtils 关闭资源、加载驱动
|-- QueryRunner 组件的核心工具类:定义了所有的与数据库操作的方法(查询、更新)
Int update(Connection conn, String sql, Object param); 执行更新带一个占位符的sql
Int update(Connection conn, String sql, Object… param); 执行更新带多个占位符的sql
Int[] batch(Connection conn, String sql, Object[][] params) 批处理
T query(Connection conn ,String sql, ResultSetHandler<T> rsh, Object... params) 查询方法
Int update( String sql, Object param);
Int update( String sql, Object… param);
Int[] batch( String sql, Object[][] params)
注意: 如果调用DbUtils组件的操作数据库方法,没有传入连接对象,那么在实例化QueryRunner对象的时候需要传入数据源对象: QueryRunner qr = new QueryRunner(ds);
DbUtils提供的封装结果的一些对象:
1)BeanHandler: 查询返回单个对象
2)BeanListHandler: 查询返回list集合,集合元素是指定的对象
3) ArrayHandler, 查询返回结果记录的第一行,封装对对象数组, 即返回:Object[]
4) ArrayListHandler, 把查询的每一行都封装为对象数组,再添加到list集合中
5) ScalarHandler 查询返回结果记录的第一行的第一列 (在聚合函数统计的时候用)
6) MapHandler 查询返回结果的第一条记录封装为map
使用示例:
1、查询
1 public class App_query { 2 3 private Connection conn; 4 5 // 一、查询, 自定义结果集封装数据 6 @Test 7 public void testQuery() throws Exception { 8 String sql = "select * from admin where id=?"; 9 // 获取连接 10 conn = JdbcUtil.getConnection(); 11 // 创建DbUtils核心工具类对象 12 QueryRunner qr = new QueryRunner(); 13 // 查询 14 Admin admin = qr.query(conn, sql, new ResultSetHandler<Admin>() { 15 16 // 如何封装一个Admin对象 17 public Admin handle(ResultSet rs) throws SQLException { 18 if (rs.next()) { 19 Admin admin = new Admin(); 20 admin.setId(rs.getInt("id")); 21 admin.setUserName(rs.getString("userName")); 22 admin.setPwd(rs.getString("pwd")); 23 return admin; 24 } 25 return null; 26 } 27 28 }, 29); 29 30 // 测试 31 System.out.println(admin); 32 // 关闭 33 conn.close(); 34 35 } 36 37 // 二、查询, 使用组件提供的结果集对象封装数据 38 39 // 1)BeanHandler: 查询返回单个对象 40 @Test 41 public void testQueryOne() throws Exception { 42 String sql = "select * from admin where id=?"; 43 // 获取连接 44 conn = JdbcUtil.getConnection(); 45 // 创建DbUtils核心工具类对象 46 QueryRunner qr = new QueryRunner(); 47 // 查询返回单个对象 48 Admin admin = qr.query(conn, sql, new BeanHandler<Admin>(Admin.class), 29); 49 50 System.out.println(admin); 51 conn.close(); 52 } 53 54 // 2)BeanListHandler: 查询返回list集合,集合元素是指定的对象 55 @Test 56 public void testQueryMany() throws Exception { 57 String sql = "select * from admin"; 58 conn = JdbcUtil.getConnection(); 59 QueryRunner qr = new QueryRunner(); 60 // 查询全部数据 61 List<Admin> list = qr.query(conn, sql, new BeanListHandler<Admin>(Admin.class)); 62 63 System.out.println(list); 64 conn.close(); 65 } 66 @Test 67 // 3) ArrayHandler, 查询返回结果记录的第一行,封装对对象数组, 即返回:Object[] 68 // 4) ArrayListHandler, 把查询的每一行都封装为对象数组,再添加到list集合中 69 // 5) ScalarHandler 查询返回结果记录的第一行的第一列 (在聚合函数统计的时候用) 70 // 6) MapHandler 查询返回结果的第一条记录封装为map 71 public void testArray() throws Exception { 72 String sql = "select * from admin"; 73 conn = JdbcUtil.getConnection(); 74 QueryRunner qr = new QueryRunner(); 75 // 查询 76 //Object[] obj = qr.query(conn, sql, new ArrayHandler()); 77 //List<Object[]> list = qr.query(conn, sql, new ArrayListHandler()); 78 //Long num = qr.query(conn, sql, new ScalarHandler<Long>()); 79 Map<String, Object> map = qr.query(conn,sql, new MapHandler()); 80 81 conn.close(); 82 } 83 }
2、更新
1 import java.sql.Connection; 2 3 import org.apache.commons.dbutils.DbUtils; 4 import org.apache.commons.dbutils.QueryRunner; 5 import org.junit.Test; 6 7 import cn.itcast.utils.JdbcUtil; 8 9 public class App_update { 10 11 private Connection conn; 12 13 // 1. 更新 14 @Test 15 public void testUpdate() throws Exception { 16 String sql = "delete from admin where id=?"; 17 // 连接对象 18 conn = JdbcUtil.getConnection(); 19 20 // 创建DbUtils核心工具类对象 21 QueryRunner qr = new QueryRunner(); 22 qr.update(conn, sql, 26); 23 24 // 关闭 25 DbUtils.close(conn); 26 } 27 28 // 2. 批处理 29 @Test 30 public void testBatch() throws Exception { 31 String sql = "insert into admin (userName, pwd) values(?,?)"; 32 conn = JdbcUtil.getConnection(); 33 QueryRunner qr = new QueryRunner(); 34 // 批量删除 35 qr.batch(conn, sql, new Object[][]{ {"jack1","888"},{"jack2","999"} }); 36 37 // 关闭 38 conn.close(); 39 } 40 }