`
廖世勇
  • 浏览: 100914 次
  • 性别: Icon_minigender_1
  • 来自: 湖南郴州
社区版块
存档分类
最新评论

dbutils

 
阅读更多

1、Commons dbutils是什么?

commons-dbutils 是 Apache 组织提供的一个开源 JDBC 工具类库,对传统操作数据库的类进行二次封装,可以把结果集转化成List。

恶的人公司的好地方

2、Commons dbutils主要相关类及接口的简介:

主要讲解两个类(org.apache.commons.dbutils.DbUtils 和org.apache.commons.dbutils.QueryRunner)和一个接口(org.apache.commons.dbutils.ResultSethandler)。

2.1:DbUtils类

为做一些诸如关闭连接、装载JDBC驱动程序之类的常规工作提供有用方法的类,它里面所有的方法都是静态的。

A:loadDriver(String driveClassName): 这一方法装载并注册JDBC驱动程序,如果成功就返回TRUE,不需要去捕捉ClassNotFoundException异常。通过返回值判断驱动程序是否加载成功。

B:close方法:DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭连接(Connection)、声明(Statement)或者结果集(ResultSet)对象。

C:closeQuietly方法: closeQuietly这一方法不仅能在连接、声明或者结果集为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLException。如果你不想捕捉这些异常的话,这对你是非常有用的。在重载closeQuietly方法时,特别有用的一个方法是closeQuietly(Connection conn,Statement stmt,ResultSet rs),使用这一方法,你最后的块就可以只需要调用这一方法即可。

D: commitAndCloseQuietly(Connection conn)方法和commitAndClose (Connection conn)方法:这两个方法用来提交连接,然后关闭连接,不同的是commitAndCloseQuietly(Connection conn)方法关闭连接时不向上抛出在关闭时发生的一些SQL异常而commitAndClose(Connection conn)方法向上抛出SQL异常。

2.2:QueryRunner类

该类简单化了 SQL 查询,它与ResultSetHandler(接口 后面将会介绍) 组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量【构造函数(1):QueryRunner()(2):QueryRunner(Datasource ds)】。

A:query(Connection conn, String sql, Object[] params, ResultSetHandlerrsh)方法:这一方法执行一个带参数的选择查询,在这个查询中,对象阵列的值被用来作为查询的置换参数。这一方法内在地处理PreparedStatement 和ResultSet 的创建和关闭。ResultSetHandler对象把从 ResultSet得来的数据转变成一个更容易的或是应用程序特定的格式来使用。

B:query(String sql, Object[] params, ResultSetHandler rsh)方法:这几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造器的数据源(DataSource) 或使用的setDataSource 方法中重新获得的。

C:query(Connection conn, String sql, ResultSetHandler rsh)方法:这执行一个带参数的选择查询。

D:update(Connection conn, String sql, Object[] params)方法:这一方法被用来执行一个带参数的插入、更新或删除操作。对象阵列为声明保存着置换参数。

E:update(String sql, Object[] params)方法: 这几乎与上一种种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造器的数据源(DataSource) 或使用的setDataSource 方法中重新获得的。

F:update(Connection conn, String sql)方法:这执行一个带参数的插入、更新或删除操作。

2.3:ResultSetHandler接口

正如它的名字所示,这一接口执行处理一个java.sql.ResultSet,将数据转变并处理为任何一种形式,这样有益于其应用而且使用起来更容易。这一组件提供了
ArrayHandler :将ResultSet中第一行的数据转化成对象数组
ArrayListHandler将ResultSet中所有的数据转化成List,List中存放的是Object[]
BeanHandler :将ResultSet中第一行的数据转化成类对象
BeanListHandler :将ResultSet中所有的数据转化成List,List中存放的是类对象
ColumnListHandler :将ResultSet中某一列的数据存成List,List中存放的是Object对象
KeyedHandler :将ResultSet中存成映射,key为某一列对应为Map。Map中存放的是数据
MapHandler :将ResultSet中第一行的数据存成Map映射
MapListHandler :将ResultSet中所有的数据存成List。List中存放的是Map
ScalarHandler :将ResultSet中一条记录的其中某一列的数据存成Object等转化类。 ResultSetHandler接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)。因此任何ResultSetHandler 的执行需要一个结果集(ResultSet)作为参数传入,然后才能处理这个结果集,再返回一个对象。因为返回类型是java.lang.Object,所以除了不能返回一个原始的Java类型之外,其它的返回类型并没有什么限制。如果你发现这七个执行程序中没有任何一个提供了你想要的服务,你可以自己写执行程序并使用它。
例:package com.mrkay.commons;
import java.sql.Connection;

import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapListHandler;


public class DbUtiles {
private static Connection conn;
public static ConnectiongetConnection(){
Stringurl="jdbc:mysql://localhost:3306/info_db";
StringdriverClassName="org.gjt.mm.mysql.Driver";
String username="root";
String password="root";
Connection conn = null;
DbUtils.loadDriver(driverClassName);
try {
conn =DriverManager.getConnection(url,username,password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}

public static void main(String[]args) {
conn = getConnection();
QueryRunner qr = newQueryRunner();
List al = null;
try {
al = (List)qr.query(conn,"select * from guestbook", new MapListHandler());
} catch (SQLException e) {
e.printStackTrace();
}
Iterator ite = al.iterator();
while(ite.hasNext()){
Map map = (Map)ite.next();
System.out.println(map.get("name"));
}
}
}

除上述介绍的外还可以了解一下以下内容
org.apache.commons.dbutils.QueryLoader:QueryLoader类是一个从一个文件加载查询到一个Map的简单的类。然后,当需要的时候,你从 Map 中选择一些查询。在没有专门去接触代码的情况下,一个文件中的Having查询也可以改变得尽可能的简单。
org.apache.commons.dbutils.wrappers.SqlNullCheckedResultSet:这个类对使用一个系统方法来解决NULL值问题是很有用的。用一个 SqINullCheckedResultSet 的实例来限制一个常规的结果集(ResultSet),然后详细地说明在遇NULL值的情况下应该做些什么。
org.apache.commons.dbutils.wrappers.StringTrimmedResultSet:用类StringTrimmedResultSet 来约束一个结果集,这样一来,你就可以修整所有getString()和getObject()方法返回的字符串。
注:dbutils组件对数据源的处理 使用:QueryRunner qr = new QueryRunner(DataSource ds).

下面是组件中DbUtils类和BeanListHandler类的详细用法的例子:

GuestBook.java源文件

packagecom.gdufs.xxy;

public classGuestBook {
private Integer id;
private String name;

publicInteger getId() {
return id;
}

publicString getName() {
return name;
}

public voidsetId(Integer id) {
this.id = id;
}

public voidsetName(String name) {
this.name = name;
}
}

BeanListExample.java类文件

packagecom.gdufs.xxy;

importorg.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;


public class BeanListExample {

publicstatic void main(String[] args) {
Connection conn = null;
String url = "jdbc:mysql://localhost:3306/test";
String driver = "com.mysql.jdbc.Driver";
String user = "root";
String password = "520134";

DbUtils.load(driver);

try {
conn = DriverManager.getConnection(url,user,password);
QueryRunner qr = new QueryRunner();
List results = (List)qr.query(conn,"select id,name fromguestbook",new BeanListHandler(GuestBook.class));
for(int i=0;i<results.size(); i++) {
GuestBook gb = (GuestBook)results.get(i);
System.out.println("id:"+gb.getId()+";name:"+gb.getName());
}
}
catch(SQLException e) {
e.printStackTrace();
} finally {
DbUtils.closeQuietly(conn);
}
}
}

下面是组件中DbUtils类和BeanListHandler类的详细用法的例子:

importorg.apache.commons.dbutils.DbUtils;
importorg.apache.commons.dbutils.QueryRunner;
importorg.apache.commons.dbutils.handlers.MapListHandler;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import java.util.Map;
import java.util.List;

public class DbUtilsUseMapMySQL {
public static void main(String[] args){
Connection conn = null;
String jdbcURL = "jdbc:mysql://localhost/octopus";
String jdbcDriver ="com.mysql.jdbc.Driver";
String user = "root";
String password ="root";

try {
DbUtils.loadDriver(jdbcDriver);
conn =DriverManager.getConnection(jdbcURL, user, password);

QueryRunner qRunner = newQueryRunner();

List mapList = (List)qRunner.query(conn, "select id, name from animals_table",
new MapListHandler());

for (int i = 0; i <mapList.size(); i++) {
Map map = (Map)mapList.get(i);
System.out.println("id=" + map.get("id"));
System.out.println("name=" + map.get("name"));
System.out.println("
—————–");
}

System.out.println("DbUtils_UseMap_MySQL:end.");

} catch (SQLException e) {
// handle the exception
e.printStackTrace();
} finally {
DbUtils.closeQuietly(conn);
}
}
}

class Employee {
private int id;
private String name;
public Employee() {
}
public void setName(String name){
this.name = name;
}
public String getName() {
return this.name;
}

public void setId(int id) {
this.id = id;
}

public int getId() {
return this.id;
}

public void print() {
System.out.println("id=" +id + " name=" + name);
}
}

1.DAO基类(数据库操作基类)

这里使用了层超类模式,复用代码,统一处理异常,日志等等..

BaseDAO:

package com.d1zhan;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

public class BaseDAO {
/**
*
获取数据库连接
* @return
*/
public Connection getConnection() {
Connection conn = null;
String jdbcURL ="jdbc:mysql://localhost/dbname";
String jdbcDriver ="com.mysql.jdbc.Driver";
String user = "root";
String password = "root";
try {
DbUtils.loadDriver(jdbcDriver);
conn =DriverManager.getConnection(jdbcURL, user, password);
} catch (SQLException e) {
// handle the exception
e.printStackTrace();
} finally {
DbUtils.closeQuietly(conn);
}
return conn;
}

/**
*
查找多个对象
* @param sqlString
* @param clazz
* @return
*/
public List query(String sqlString,Class clazz) {
List beans = null;
Connection conn = null;
try {
conn = getConnection();
QueryRunner qRunner = newQueryRunner();
beans =
(List) qRunner.query(
conn,
sqlString,
newBeanListHandler(clazz));
} catch (SQLException e) {
e.printStackTrace();
} finally {
DbUtils.closeQuietly(conn);
}
return beans;
}

/**
*
查找对象
* @param sqlString
* @param clazz
* @return
*/
public Object get(String sqlString,Class clazz) {
List beans = null;
Object obj = null;
Connection conn = null;
try {
conn = getConnection();
QueryRunner qRunner = newQueryRunner();
beans =
(List) qRunner.query(
conn,
sqlString,
newBeanListHandler(clazz));
} catch (SQLException e) {
e.printStackTrace();
} finally {
DbUtils.closeQuietly(conn);
}
if(beans!=null &&!beans.isEmpty()){ //
注意这里
obj=beans.get(0);

}

return obj;
}

/**
*
执行更新的sql语句,插入,修改,删除
* @param sqlString
* @return
*/
public boolean update(StringsqlString) {
Connection conn = null;
boolean flag = false;
try {
conn = getConnection();
QueryRunner qRunner = newQueryRunner();
int i =qRunner.update(conn,sqlString);
if (i > 0) {
flag = true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DbUtils.closeQuietly(conn);
}
return flag;
}
}

commons-DBUtils实践


1,Employee
雇员数据库操作DAO


大家可以看到,下面的DAO类,继承BaseDAO,方法体都是组装sql语句,不必关心异常的处理,资源的管理(Connection,Statement),这样代码简洁,质量高.

EmployeeDAO:

package com.d1zhan;

import java.util.List;

public class EmployeeDAO extends BaseDAO {

/**
* searchModel
的属性,name,address等为查询参数
* @param searchModel
* @return
*/
public List query(EmployeesearchModel) {
String sql = "select * fromemployee where 1=1";

//
如果雇员名字不为null,则将雇员名字加入where查询条件
if (searchModel.getName() !=null) {
sql += "andemployee.name like
" +searchModel.getName() + " ";
}
return this.query(sql,Employee.class);
}

/**
*
修改雇员信息
* @param emp
* @return
*/
public boolean edit(Employee emp) {
String sql = "updateemployee set "; //
注意: set加在外面

//
如果name不为null,修改它的值到数据库
if (emp.getName() != null) {
sql += "employee.name=
" + emp.getName() + ",";
}

//
如果address不为null,修改它的值到数据库
if (emp.getAddress() != null) {
sql +="employee.address=
" +emp.getAddress() + ", ";
}

sql=sql.substring(0,sql.length()-1);//去掉最后一个","
sql += "whereemployee.id=" + emp.getId();
return this.update(sql);
}

/**
*
根据雇员ID删除雇员
* @param id
* @return
*/
public boolean delete(int id) {
String sql = "delete fromemployee where id =" + id;
return this.update(sql);
}

/**
*
根据雇员ID查找雇员
* @param id
* @return
*/
public Employee get(int id) {
String sql = "select * fromemployee where id=" + id;
return (Employee) this.get(sql,Employee.class);
}
}

3.
雇员信息类

Employee:
package com.pcm.netrender.model;

public class Employee {
private int id;
private String name;
private String address;
/**
* @return
*/
public String getAddress() {
return address;
}

/**
* @return
*/
public int getId() {
return id;
}

/**
* @return
*/
public String getName() {
return name;
}

/**
* @param string
*/
public void setAddress(String string){
address = string;
}

/**
* @param i
*/
public void setId(int i) {
id = i;
}

/**
* @param string
*/
public void setName(String string) {
name = string;
}

}

4,现在就可以在业务层(service)调用我们的dao类方法,实现业务逻辑了
service我们要处理业务逻辑,数据库操作事务等等.
然后StrutsAction调用service类的方法,完成软件了.

使用代码大概是这样的

Employee emp=new Employee();

emp.setName("小李");

emp.setAddress("南宁市阳光新城");

EmployeeDAO dao=new EmployeeDAO();

dao.save(emp);

采用Commons-DbUtils组件(应用数据源)

1.DBDataSource,用于得到DataSource对象

publicclass DBDataSource {

private DataSourceds = null ;

public DBDataSource()
{

Context initContext=newInitialContext();

Contextcontext=(Context)initContext.lookup("java:/comp/env");

ds=(Context)context.lookup("jdbc/sqlds");
}

// 取得数据源

public DataSource getDataSource()
{
return this.ds ;
}

}

2.查询全部的代码

publicList queryAll() throws Exception {
// TODO Auto-generated method stub
List all = new ArrayList() ;
String sql = "SELECTid,title,author,content FROM note" ;

DBDataSourcedbc = new DBDataSource() ;

DataSource ds=dbc.getDataSource();

QueryRunner qr=new QueryRunner(ds);

all=(List)qr.query(sql,newBeanListHandler(Note.class));

return all ;

}

分享到:
评论

相关推荐

    dbutils dbutils dbutils dbutils

    DBUtils 是一个非常重要的 Python 模块,专为数据库连接设计,它在 Python 的数据库应用开发中扮演着不可或缺的角色。这个模块主要目的是提供一个稳定、健壮的接口,用于管理和操作数据库连接,使得开发者能够更方便...

    python的DBUtils包

    Python的DBUtils是一个非常实用的库,主要用于增强Python标准库中的`DB-API 2.0`接口,提供了线程安全性和连接池管理等功能。DBUtils是基于PEP 249设计的,它使得数据库连接的管理和维护变得更加简单,尤其在多线程...

    commons-dbutils-1.4.jar

    《Apache Commons DBUtils详解及其在Java数据库操作中的应用》 Apache Commons DBUtils是Apache软件基金会开发的一个开源项目,它提供了一套简洁、高效且实用的工具类,用于简化Java应用程序中的数据库操作。这个...

    Dbutils 的jar包

    Dbutils 是 Apache Commons DbUtils 的简称,它是一个用于简化 Java 数据库编程的开源库。Dbutils 基于 JDBC(Java Database Connectivity),提供了一套简洁、高效且易于使用的API,帮助开发者更方便地处理数据库...

    commons-dbutils.jar.rar

    `commons-dbutils.jar.rar` 是一个包含Apache Commons DBUtils库的不同版本的压缩文件,主要用于Java应用程序中的数据库操作。DBUtils是一个实用程序库,它简化了JDBC(Java Database Connectivity)的使用,提供了...

    C3P0和DButils

    C3P0和DBUtils是两个非常重要的库,用于简化Java应用程序中的数据库操作。以下是这两个库的详细介绍: C3P0是一个开源的JDBC连接池,它的全称是Commerical-grade Connection Pooling for JDBC。C3P0-0.9.1.2.jar是...

    commons-dbutils-1.7-API文档-中文版.zip

    赠送jar包:commons-dbutils-1.7.jar; 赠送原API文档:commons-dbutils-1.7-javadoc.jar; 赠送源代码:commons-dbutils-1.7-sources.jar; 赠送Maven依赖信息文件:commons-dbutils-1.7.pom; 包含翻译后的API文档...

    commons-dbutils-1.7

    Apache Commons DbUtils是Java开发中的一个实用工具库,专门针对JDBC(Java Database Connectivity)进行优化,以提供更简洁、高效的数据库操作API。这个库在Java社区中广泛使用,因为它大大减轻了开发者处理数据库...

    commons-dbutils-1.7.jar

    《Apache Commons DBUtils详解》 Apache Commons DBUtils是一款在Java编程中广泛使用的数据库操作工具库,它的全称为“Apache Commons Database Utilities”。这个小巧且高效的库为开发者提供了方便、安全的数据库...

    commons-dbutils-1.3.zip

    Apache Commons DBUtils是一个Java库,它简化了与数据库交互的任务,是Java开发中常用的数据访问工具。这个压缩包“commons-dbutils-1.3.zip”包含的是DBUtils库的1.3版本。DBUtils库是Apache Commons项目的一部分,...

    DbUtils数据库查询工具包 v1.8.1.zip

    DbUtils是Apache组织提供的一款Java数据库操作工具包,它的全称是Apache Commons DbUtils。DbUtils的主要目的是简化数据库操作,让开发人员能够更专注于业务逻辑而不是底层的JDBC细节。这个工具包基于Java,适用于...

    dbutils + oracle 增删改查批量插入示例

    在IT行业中,数据库操作是日常开发中的重要环节,而`dbutils`是一个非常实用的Java数据库操作工具包,它简化了对数据库进行增删改查(CRUD)操作的过程。本示例着重介绍如何结合`dbutils`与Oracle数据库进行高效的...

    DBUtils操作数据库以及事物的管理

    ### DBUtils操作数据库及事务管理详解 #### 一、DBUtils简介 DBUtils是一个轻量级的Java数据库访问工具类库,它简化了JDBC的使用步骤,使得开发者能够更方便地进行数据库操作。相比于传统的JDBC编程方式,DBUtils...

    commons-dbutils-1.6

    Apache Commons DBUtils是Java开发中的一个实用工具库,主要用于简化JDBC(Java Database Connectivity)的使用。这个项目在1.6版本中包含了两个主要的jar文件:`commons-dbutils-1.6.jar`和`commons-dbutils-1.6-...

    commons-dbutils-1.6.jar包

    包org.apache.commons.dbutils DbUtils是一个为简化JDBC操作的小类库. 接口摘要 ResultSetHandler 将ResultSet转换为别的对象的工具. RowProcessor 将ResultSet行转换为别的对象的工具. 类摘要 BasicRowProcessor ...

    commons-dbutils-1.6.rar所有jar包

    Apache Commons DBUtils是一个Java库,它为处理数据库连接提供了简单且健壮的工具。这个压缩包文件"commons-dbutils-1.6.rar"包含了DBUtils的1.6版本,这是一个非常受欢迎的开源项目,用于简化Java数据库编程。...

    python-dbutils 简单封装

    Python的dbutils模块是Apache的一个开源项目,它提供了一套用于数据库操作的工具类,能够帮助简化数据库连接和管理,提高开发效率。本教程将详细讲解如何对dbutils进行简单的封装,以更好地适应实际的Python数据库...

    DbUtils技术文档.pdf

    ### DbUtils技术文档知识点概述 #### 一、DbUtils简介 DbUtils是一个小型的Java类库,主要目的是简化Java中的JDBC操作。JDBC(Java Database Connectivity)是Java平台的标准数据库访问API,允许应用程序与各种...

Global site tag (gtag.js) - Google Analytics