浪费别人的时间等于是谋财害命,浪费自己的时间等于是慢性自杀。 —— 列宁

Apache Common DbUtils

前段时间使用了Apache Common DbUtils这个工具,在此留个印,以备不时查看。大家都知道现在市面上的数据库访问层的框架很多,当然很多都是包含了OR-Mapping工作步骤的 例如大家常用的Hibernate与Mybatis。当然如果人们要一个纯粹的封装了JDBC的工具类,使用Apache Common DbUtils(下面简称ACD)是个不错的选择,这个工具在JDBC的基础上稍加封装是JDBC的操作更加便捷,在学习使用这个框架的途中你也不需要学 习太多的API类,因为一共也才3个部分(3个包)。   1. org.apache.commons.dbutils (该包中的类主要帮助我们更便捷的操作JDBC)   2. org.apache.commons.dbutils.handlers(该包中的类都是实现org.apache.commons.dbutils.ResultSetHandler接口的实现类)   3. org.apache.commons.dbutils.wrappers(该包中的类主要是封装了对Sql结果集的操作) 使用这个DbUtils的一些优势:   1. 防止了资源的泄露,写一段JDBC的准备代码其实并不麻烦,但是那些操作确实是十分耗时和繁琐的,也会导致有时候数据库连接忘记关闭了导致异常难以追踪。   2. 干净整洁的持久化代码,把数据持久化到数据库的代码被打打削减,剩下的代码能够清晰简洁的表达你的操作目的。   3. 自动把ResultSets中的工具映射到JavaBean中,你不需要手动的使用Setter方法将列值一个个赋予相应的时日,Resultset中的每一个行都大表一个完成的Bean实体。     要学习如何使用这个框架,最简单的方式就是用它写个Demo-CRUD操作,让我们先做个准备动作在Mysql中建立一个测试专用表Visitor。 [sql] view plaincopy在CODE上查看代码片派生到我的代码片 01./*创建Visitor*/ 02.CREATE TABLE Visitor 03.( 04. Id INT(11) NOT NULL AUTO_INCREMENT, 05. Name VARCHAR(1000) NOT NULL, 06. Email VARCHAR(1000) NOT NULL, 07. Status INT NOT NULL DEFAULT 1, 08. CreateTime DateTime, 09. PRIMARY KEY(Id) 10.) 建完表结构,我们就可以学习怎么利用框架中的Utils类帮助我们完成CRUD-DEMO,其实对于这个框架主要操作的是ResultSetHandler接口的实现类与QueryRunner类 创建对应的JavaBean实体类如下: [java] view plaincopy在CODE上查看代码片派生到我的代码片 01.package david.apache.model; 02. 03.import java.text.SimpleDateFormat; 04.import java.util.Date; 05. 06.public class Visitor { 07. 08. private int id; 09. private String name; 10. private String email; 11. private int status; 12. private Date createTime; 13. 14. public Visitor() { 15. // TODO Auto-generated constructor stub 16. setCreateTime(new Date()); 17. } 18. 19. public Visitor(String name, String email) { 20. this.setName(name); 21. this.setEmail(email); 22. this.setStatus(1); 23. this.setCreateTime(new Date()); 24. } 25. 26. public int getId() { 27. return id; 28. } 29. 30. public void setId(int id) { 31. this.id = id; 32. } 33. 34. public String getName() { 35. return name; 36. } 37. 38. public void setName(String name) { 39. this.name = name; 40. } 41. 42. public String getEmail() { 43. return email; 44. } 45. 46. public void setEmail(String email) { 47. this.email = email; 48. } 49. 50. public int getStatus() { 51. return status; 52. } 53. 54. public void setStatus(int status) { 55. this.status = status; 56. } 57. 58. public Date getCreateTime() { 59. return createTime; 60. } 61. 62. public void setCreateTime(Date createTime) { 63. this.createTime = createTime; 64. } 65. 66. @Override 67. public String toString() { 68. // TODO Auto-generated method stub 69. return String.format("{Id: %d, Name: %s, Email: %s, CreateTime: %s}", getId(), getName(), getEmail(), 70. new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(getCreateTime())); 71. } 72.} 首先我们先新建一个获取Connection的方法: [java] view plaincopy在CODE上查看代码片派生到我的代码片 01.private static Connection getConnection() { 02. Connection conn = null; 03. try { 04. Class.forName(CONNECTION_DRIVER_STR); 05. conn = DriverManager.getConnection(CONNECTION_STR, "root", "123456"); 06. } catch (Exception e) { 07. e.printStackTrace(); 08. } 09. return conn; 10.} 新建方法(对于里面的自增字段,我们可以采用变通的方法来插入,使用select last_insert_id()方法) [java] view plaincopy在CODE上查看代码片派生到我的代码片 01./* 02. * 新增Visitor, ScalarHandler的demo 03. */ 04.public static void insertVisitor(Visitor visitor) { 05. Connection conn = getConnection(); 06. QueryRunner qr = new QueryRunner(); 07. String sql = "insert into visitor (Name, Email, Status, CreateTime) values (?, ?, ?, ?)"; 08. try { 09. int count = qr.update(conn, sql, visitor.getName(), visitor.getEmail(), 1, new Date()); 10. BigInteger newId = (BigInteger) qr.query(conn, "select last_insert_id()", new ScalarHandler(1)); 11. visitor.setId(Integer.valueOf(String.valueOf(newId))); 12. System.out.println("新增" + count + "条数据=>Id:" + newId); 13. } catch (SQLException e) { 14. e.printStackTrace(); 15. } 16.} 大家可以看到操作的步骤其实很简单,也是写SQL可以了,对于自增字段我们通过select last_insert_id()的方法利用ScalarHandler实体类来返回达到变通效果。 删除方法 [java] view plaincopy在CODE上查看代码片派生到我的代码片 01.public static void deleteVisitor(int id) { 02. Connection conn = getConnection(); 03. QueryRunner qr = new QueryRunner(); 04. String sql = "delete from visitor where status>0 and id=?"; 05. try { 06. int count = qr.update(conn, sql, id); 07. System.out.println("删除" + count + "条数据。"); 08. } catch (SQLException e) { 09. // TODO: handle exception 10. e.printStackTrace(); 11. } 12.} 查询方法 [java] view plaincopy在CODE上查看代码片派生到我的代码片 01.public static Visitor retrieveVisitor(int id) { 02. Connection conn = getConnection(); 03. Visitor visitor = null; 04. QueryRunner qr = new QueryRunner(); 05. String sql = "select * from visitor where status>0 and id=?"; 06. try { 07. visitor = (Visitor) qr.query(conn, sql, new BeanHandler(Visitor.class), id); 08. System.out.println(visitor); 09. return visitor; 10. } catch (Exception e) { 11. e.printStackTrace(); 12. } 13. return visitor; 14.} 更新操作 [java] view plaincopy在CODE上查看代码片派生到我的代码片 01.public static void updateVisitor(int id) { 02. Visitor visitor = retrieveVisitor(id); 03. System.out.println("更新前:" + visitor); 04. Connection conn = getConnection(); 05. String updateFieldStr = visitor.getName(); 06. QueryRunner qr = new QueryRunner(); 07. String sql = "update visitor set Name = ?, Email = ?, Status = ?, CreateTime = ? where status>0 and Id = ?"; 08. if (updateFieldStr.contains("updated")) { 09. updateFieldStr = updateFieldStr.substring(0, updateFieldStr.indexOf("updated")); 10. } else { 11. updateFieldStr = updateFieldStr + "updated"; 12. } 13. visitor.setName(updateFieldStr); 14. try { 15. int count = qr.update(conn, sql, new Object[] { visitor.getName(), visitor.getName(), visitor.getStatus(), 16. visitor.getCreateTime(), visitor.getId() }); 17. System.out.println("更新了" + count + "条数据"); 18. System.out.println("更新后:" + visitor); 19. } catch (SQLException e) { 20. // TODO: handle exception 21. e.printStackTrace(); 22. } 23.} BeanListHandler方法 [java] view plaincopy在CODE上查看代码片派生到我的代码片 01.public static void getVisitorList() { 02. Connection conn = getConnection(); 03. QueryRunner qr = new QueryRunner(); 04. String sql = "select * from visitor where status>0"; 05. try { 06. List ls = qr.query(conn, sql, new BeanListHandler(Visitor.class)); 07. for (Visitor visitor : ls) { 08. System.out.println(visitor); 09. } 10. } catch (SQLException e) { 11. // TODO Auto-generated catch block 12. e.printStackTrace(); 13. } 14.} MapHandler操作 [java] view plaincopy在CODE上查看代码片派生到我的代码片 01.public static void getVisitWithMap(int id) { 02. Connection conn = getConnection(); 03. QueryRunner qr = new QueryRunner(); 04. String sql = "select * from visitor where status>0 and id=?"; 05. try { 06. Map map = qr.query(conn, sql, new MapHandler(), id); 07. Integer visitorId = Integer.valueOf(map.get("Id").toString()); 08. String visitorName = map.get("Name").toString(); 09. String visitorEmail = map.get("Email").toString(); 10. Integer visitorStatus = Integer.valueOf(map.get("Status").toString()); 11. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 12. Date visitorCreateTime = sdf.parse(map.get("CreateTime").toString()); 13. Visitor visitor = new Visitor(visitorName, visitorEmail); 14. visitor.setId(visitorId); 15. visitor.setStatus(visitorStatus); 16. visitor.setCreateTime(visitorCreateTime); 17. System.out.println(visitor); 18. } catch (Exception e) { 19. // TODO: handle exception 20. e.printStackTrace(); 21. } 22.} MapListHandler方法 [java] view plaincopy在CODE上查看代码片派生到我的代码片 01.public static void getVisitWithMapLs() { 02. Connection conn = getConnection(); 03. QueryRunner qr = new QueryRunner(); 04. String sql = "select * from visitor where status>0"; 05. try { 06. List> mapLs = qr.query(conn, sql, new MapListHandler()); 07. for (Map map : mapLs) { 08. Integer visitorId = Integer.valueOf(map.get("Id").toString()); 09. String visitorName = map.get("Name").toString(); 10. String visitorEmail = map.get("Email").toString(); 11. Integer visitorStatus = Integer.valueOf(map.get("Status").toString()); 12. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 13. Date visitorCreateTime = sdf.parse(map.get("CreateTime").toString()); 14. Visitor visitor = new Visitor(visitorName, visitorEmail); 15. visitor.setId(visitorId); 16. visitor.setStatus(visitorStatus); 17. visitor.setCreateTime(visitorCreateTime); 18. System.out.println(visitor); 19. } 20. } catch (Exception e) { 21. // TODO: handle exception 22. e.printStackTrace(); 23. } 24. } 经过上面的几个示例,相信大家应该知道怎么用这个框架了吧~ 框架的官网地址
posted @ 2015-09-14 14:50  一谦的视界  阅读(170)  评论(0编辑  收藏  举报