前段时间使用了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实体类如下:

Visitor-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的方法:

获取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()方法)

Create操作
/*
 * 新增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(), 1new 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方法

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操作

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方法

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

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



如果你觉得这篇文章对你有用,欢迎推荐[推荐]

如果你觉得文章内有错误欢迎指出^0^~

如果您想转载本博客,请注明出处

如果您对本文有意见或者建议,欢迎留言

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