commons 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(StringdriveClassName): 這一方法裝載并注冊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(Connectionconn, String sql, Object[] params, ResultSetHandler rsh)方法:這一方法執行一個帶參數的選擇查詢,在這個查詢中,對象陣列的值被用來作為查詢的置換參數。這一方法內在地處理PreparedStatement 和ResultSet 的創建和關閉。ResultSetHandler對象把從 ResultSet得來的數據轉變成一個更容易的或是應用程序特定的格式來使用。
B:query(Stringsql, Object[] params, ResultSetHandler rsh)方法:這幾乎與第一種方法一樣;唯一的不同在于它不將數據庫連接提供給方法,并且它是從提供給構造器的數據源(DataSource) 或使用的setDataSource 方法中重新獲得的。
C:query(Connectionconn, String sql, ResultSetHandler rsh)方法:這執行一個帶參數的選擇查詢。
D:update(Connectionconn, String sql, Object[] params)方法:這一方法被用來執行一個帶參數的插入、更新或刪除操作。對象陣列為聲明保存著置換參數。
E:update(Stringsql, Object[] params)方法: 這幾乎與上一種種方法一樣;唯一的不同在于它不將數據庫連接提供給方法,并且它是從提供給構造器的數據源(DataSource) 或使用的setDataSource 方法中重新獲得的。
F:update(Connectionconn, 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;
importjava.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源文件
package com.gdufs.xxy;
public class GuestBook {
private Integer id;
private String name;
public IntegergetId() {
return id;
}
public StringgetName() {
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 {
public staticvoid 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 classBaseDAO {
??? /**
???? * 獲取數據庫連接
???? * @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 = new QueryRunner();
??????????? 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 = new QueryRunner();
??????????? 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 = new QueryRunner();
??????????? 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 * from employee where 1=1";
?
??????? //如果雇員名字不為null,則將雇員名字加入where查詢條件
??????? if (searchModel.getName() !=null) {
??????????? sql += "and employee.name like ‘" + searchModel.getName() + "’ ";
??????? }
??????? return this.query(sql,Employee.class);
??? }
?
??? /**
???? * 修改雇員信息
???? * @param emp
???? * @return
???? */
??? public boolean edit(Employee emp) {
??????? String sql = "update employee 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 += "where employee.id=" + emp.getId();
??????? return this.update(sql);
??? }
?
??? /**
???? * 根據雇員ID刪除雇員
???? * @param id
???? * @return
???? */
??? public boolean delete(int id) {
??????? String sql = "delete from employee where id =" + id;
??????? return this.update(sql);
??? }
?
??? /**
???? * 根據雇員ID查找雇員
???? * @param id
???? * @return
???? */
??? public Employee get(int id) {
??????? String sql = "select * from employee 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我們要處理業務邏輯,數據庫操作事務等等.
然后Struts Action調用 service類的方法,完成軟件了.
使用代碼大概是這樣的
Employeeemp=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=new InitialContext();
????? 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 = "SELECT id,title,author,content FROM note" ;
? DBDataSource dbc = new DBDataSource() ;
? DataSource ds=dbc.getDataSource();
??QueryRunner qr=new QueryRunner(ds);
? all=(List)qr.query(sql,newBeanListHandler(Note.class));
? return all ; }
總結
以上是生活随笔為你收集整理的commons dbutils 的介绍与使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tomcat7查看后台管理怎么设置用户名
- 下一篇: java7 AIO初体验