前段时间使用了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

/*创建Visitor*/
CREATE TABLE Visitor
(
Id INT(11) NOT NULL AUTO_INCREMENT,
Name VARCHAR(1000) NOT NULL,
Email VARCHAR(1000) NOT NULL,
Status INT NOT NULL DEFAULT 1,
CreateTime DateTime,
PRIMARY KEY(Id)
)

建完表结构,我们就可以学习怎么利用框架中的Utils类帮助我们完成CRUD-DEMO,其实对于这个框架主要操作的是ResultSetHandler接口的实现类与QueryRunner类

创建对应的JavaBean实体类如下:

package david.apache.model;

import java.text.SimpleDateFormat;
import java.util.Date; public class Visitor { private int id;
private String name;
private String email;
private int status;
private Date createTime; public Visitor() {
// TODO Auto-generated constructor stub
setCreateTime(new Date());
} public Visitor(String name, String email) {
this.setName(name);
this.setEmail(email);
this.setStatus(1);
this.setCreateTime(new Date());
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public int getStatus() {
return status;
} public void setStatus(int status) {
this.status = status;
} public Date getCreateTime() {
return createTime;
} public void setCreateTime(Date createTime) {
this.createTime = createTime;
} @Override
public String toString() {
// TODO Auto-generated method stub
return String.format("{Id: %d, Name: %s, Email: %s, CreateTime: %s}", getId(), getName(), getEmail(),
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(getCreateTime()));
}
}

Visitor-JavaBean

首先我们先新建一个获取Connection的方法:

private static Connection getConnection() {
Connection conn = null;
try {
Class.forName(CONNECTION_DRIVER_STR);
conn = DriverManager.getConnection(CONNECTION_STR, "root", "123456");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}

获取Connection

新建方法(对于里面的自增字段,我们可以采用变通的方法来插入,使用select last_insert_id()方法)

/*
* 新增Visitor, ScalarHandler的demo
*/
public static void insertVisitor(Visitor visitor) {
Connection conn = getConnection();
QueryRunner qr = new QueryRunner();
String sql = "insert into visitor (Name, Email, Status, CreateTime) values (?, ?, ?, ?)";
try {
int count = qr.update(conn, sql, visitor.getName(), visitor.getEmail(), 1, new Date());
BigInteger newId = (BigInteger) qr.query(conn, "select last_insert_id()", new ScalarHandler<BigInteger>(1));
visitor.setId(Integer.valueOf(String.valueOf(newId)));
System.out.println("新增" + count + "条数据=>Id:" + newId);
} catch (SQLException e) {
e.printStackTrace();
}
}

Create操作

大家可以看到操作的步骤其实很简单,也是写SQL可以了,对于自增字段我们通过select last_insert_id()的方法利用ScalarHandler<BigInteger>实体类来返回达到变通效果。

删除方法

public static void deleteVisitor(int id) {
Connection conn = getConnection();
QueryRunner qr = new QueryRunner();
String sql = "delete from visitor where status>0 and id=?";
try {
int count = qr.update(conn, sql, id);
System.out.println("删除" + count + "条数据。");
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}
}

删除操作

查询方法

public static Visitor retrieveVisitor(int id) {
Connection conn = getConnection();
Visitor visitor = null;
QueryRunner qr = new QueryRunner();
String sql = "select * from visitor where status>0 and id=?";
try {
visitor = (Visitor) qr.query(conn, sql, new BeanHandler<Visitor>(Visitor.class), id);
System.out.println(visitor);
return visitor;
} catch (Exception e) {
e.printStackTrace();
}
return visitor;
}

查询操作

更新操作

public static void updateVisitor(int id) {
Visitor visitor = retrieveVisitor(id);
System.out.println("更新前:" + visitor);
Connection conn = getConnection();
String updateFieldStr = visitor.getName();
QueryRunner qr = new QueryRunner();
String sql = "update visitor set Name = ?, Email = ?, Status = ?, CreateTime = ? where status>0 and Id = ?";
if (updateFieldStr.contains("updated")) {
updateFieldStr = updateFieldStr.substring(0, updateFieldStr.indexOf("updated"));
} else {
updateFieldStr = updateFieldStr + "updated";
}
visitor.setName(updateFieldStr);
try {
int count = qr.update(conn, sql, new Object[] { visitor.getName(), visitor.getName(), visitor.getStatus(),
visitor.getCreateTime(), visitor.getId() });
System.out.println("更新了" + count + "条数据");
System.out.println("更新后:" + visitor);
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}
}

更新操作

BeanListHandler方法

public static void getVisitorList() {
Connection conn = getConnection();
QueryRunner qr = new QueryRunner();
String sql = "select * from visitor where status>0";
try {
List<Visitor> ls = qr.query(conn, sql, new BeanListHandler<Visitor>(Visitor.class));
for (Visitor visitor : ls) {
System.out.println(visitor);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

BeanListHandler

MapHandler操作

public static void getVisitWithMap(int id) {
Connection conn = getConnection();
QueryRunner qr = new QueryRunner();
String sql = "select * from visitor where status>0 and id=?";
try {
Map<String, Object> map = qr.query(conn, sql, new MapHandler(), id);
Integer visitorId = Integer.valueOf(map.get("Id").toString());
String visitorName = map.get("Name").toString();
String visitorEmail = map.get("Email").toString();
Integer visitorStatus = Integer.valueOf(map.get("Status").toString());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date visitorCreateTime = sdf.parse(map.get("CreateTime").toString());
Visitor visitor = new Visitor(visitorName, visitorEmail);
visitor.setId(visitorId);
visitor.setStatus(visitorStatus);
visitor.setCreateTime(visitorCreateTime);
System.out.println(visitor);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}

MapHandler操作

MapListHandler方法

public static void getVisitWithMapLs() {
Connection conn = getConnection();
QueryRunner qr = new QueryRunner();
String sql = "select * from visitor where status>0";
try {
List<Map<String, Object>> mapLs = qr.query(conn, sql, new MapListHandler());
for (Map<String, Object> map : mapLs) {
Integer visitorId = Integer.valueOf(map.get("Id").toString());
String visitorName = map.get("Name").toString();
String visitorEmail = map.get("Email").toString();
Integer visitorStatus = Integer.valueOf(map.get("Status").toString());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date visitorCreateTime = sdf.parse(map.get("CreateTime").toString());
Visitor visitor = new Visitor(visitorName, visitorEmail);
visitor.setId(visitorId);
visitor.setStatus(visitorStatus);
visitor.setCreateTime(visitorCreateTime);
System.out.println(visitor);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}

MapListHandler操作

经过上面的几个示例,相信大家应该知道怎么用这个框架了吧~ 框架的官网地址

Apache DbUtils - JDBC轻量级封装的工具包的更多相关文章

  1. Apache DBUtils使用总结 【转】

    Apache DBUtils使用总结   DBUtils是个小巧的JDBC轻量级封装的工具包,其最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,这就为我们做了最枯燥乏味. ...

  2. 轻量级封装DbUtils&Mybatis之三MyBatis分页

    MyBatis假分页 参考DefaultResultSetHandler的skipRows方法. 温馨提示:部分代码请参考轻量级封装DbUtils&Mybatis之一概要 解决方案 1)之前公 ...

  3. 轻量级封装DbUtils&Mybatis之一概要

    Why 一时兴起,自以为是的对Jdbc访问框架做了一个简单的摸底,近期主要采用Mybatis,之前也有不少采用Dbutils,因此希望能让这两个框架折腾的更好用. DbUtils:非常简单的Jdbc访 ...

  4. JDBC 学习笔记(四)—— 自定义JDBC框架+Apache—DBUtils框架+事务管理+操作多表

    本文目录:       1.自定义JDBC框架 ——数据库元数据:DataBaseMetaData        2.自定义JDBC框架 ——数据库元数据:DataBaseMetaData       ...

  5. Apache—dbutils开源JDBC工具类库简介

    Apache—dbutils开源JDBC工具类库简介 一.前言 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用 ...

  6. 利用jdbc简单封装一个小框架(类似DBUtils)

    利用jdbc写的一个类似DBUtils的框架 package com.jdbc.orm.dbutils; import java.io.IOException; import java.io.Inpu ...

  7. Apache—DBUtils框架简介

    转载自:http://blog.csdn.net/fengdongkun/article/details/8236216 Apache—DBUtils框架简介.DbUtils类.QueryRunner ...

  8. apache DBUtils 使用例子demo

    转自:http://blog.csdn.net/earbao/article/details/44901061 apache DBUtils是java编程中的数据库操作实用工具,小巧简单实用, 1.对 ...

  9. JDBC操作封装

    这两天学习了一下jdbc的封装,依据的是下面这篇 http://wenku.baidu.com/link?url=FaFDmQouYkKO24ApATHYmA5QzUcj-UE-7RSSZaBWPqk ...

随机推荐

  1. [转]linux之partprobe命令

    转自:http://www.7edown.com/edu/article/soft_48647_1.html linux上,在安装系统之后,可否创建分区并且在不重新启动机器的情况下系统能够识别这些分区 ...

  2. 开发环境配置(netbeans+ant迁移到eclipse+maven)

    新公司入职,接手一个离职人员的项目,拿到的源码是以一个压缩包,用netbeans开发,ant管理:前端:jsp+extjs,后端:springmvc+hibernate+activiti+spring ...

  3. 数往知来C#面向对象〈三〉

    C# 基础方法篇 一.复习 1)方法的重载 方法的重载并不是一个方法,实际上方法的重载就是一些不同的 方法,目的是为了方便程序员编码,所以将功能相近的方法命名相同 根据参数,编译器自动的去匹配方法体, ...

  4. Tcl之Intro

    Tool command language, a widely used scripting tool that was deveoped for controlling and extending ...

  5. PHPCMS数据筛选功能实现

    第一步:添加模型字段,这个模型可以是官方的,也可以是你自定义的模型,以单选字段形式添加就好了; 第二步:就是添加栏目和内容: 第三步:模板如下,照着改就好了. {template "cont ...

  6. Linux下U盘的挂载和文件的拷贝

    把文件通过U盘拷贝到linux系统下插好U盘后,查看磁盘情况fdisk -l正常情况下有 Disk /dev/sda:2045 MB,2045247488 bytes47 heads,46 secto ...

  7. DOS 命令大全

    MS DOS 命令大全 一.基础命令 1 dir 无参数:查看当前所在目录的文件和文件夹. /s:查看当前目录已经其所有子目录的文件和文件夹. /a:查看包括隐含文件的所有文件. /ah:只显示出隐含 ...

  8. httpd.conf 禁止运行PHP和html页面

    <VirtualHost *:80>    ServerName www.test.com    DocumentRoot /var/www/www.test.com    ErrorDo ...

  9. 成为IBM精英讲师-一分耕耘 一份收获 同时也多了一份责任!

    成为IBM精英讲师 一分耕耘 一份收获 同时也多了一份责任! http://www.webspherechina.net/?action-iste-type-lecturerlist 650) thi ...

  10. 第二百二十四天 how can I 坚持

    实物商品兑换,有点小难搞,其实也没什么难的,也就那些东西,不过好像这就是我设计实现的,干起来挺来劲的. 供暖了,挺暖和的,哈哈. 小米耳机(炫彩版)到了.感觉挺好的. 还在纠结到底要买哪种颜色的羽绒服 ...