Apache DbUtils应用实例

本文详细介绍了ApacheCommonDbUtils框架的使用方法,包括连接数据库、执行CRUD操作、使用不同类型的Handler进行数据处理等,提供了丰富的示例代码。

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                      前段时间使用了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()));    }}

首先我们先新建一个获取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;}

新建方法(对于里面的自增字段,我们可以采用变通的方法来插入,使用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();    }}

大家可以看到操作的步骤其实很简单,也是写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();    }}

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();    }}

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();        }    }

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


本文转自【http://www.blogjava.net/davidjefiny/archive/2014/01/05/apache_common_dbutils.html】

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则作者保留追究法律责任的权利

           

给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow
这里写图片描述
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值