一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Dbutils 的介紹與使用

 小米錢 2015-05-06

1、Commonsdbutils是什么?

commons-dbutils 是 Apache 組織提供的一個開源 JDBC 工具類庫,對傳統(tǒng)操作數(shù)據(jù)庫的類進(jìn)行二次封裝,可以把結(jié)果集轉(zhuǎn)化成List。

 

2、Commonsdbutils主要相關(guān)類及接口的簡介:

主要講解兩個類(org.apache.commons.dbutils.DbUtils和 org.apache.commons.dbutils.QueryRunner)和一個接口(org.apache.commons.dbutils.ResultSethandler)。

 

2.1:DbUtils類

為做一些諸如關(guān)閉連接、裝載JDBC驅(qū)動程序之類的常規(guī)工作提供有用方法的類,它里面所有的方法都是靜態(tài)的。

A:loadDriver(StringdriveClassName): 這一方法裝載并注冊JDBC驅(qū)動程序,如果成功就返回TRUE,不需要去捕捉ClassNotFoundException異常。通過返回值判斷驅(qū)動程序是否加載成功。

B:close方法:DbUtils類提供了三個重載的關(guān)閉方法。這些方法檢查所提供的參數(shù)是不是NULL,如果不是的話,它們就關(guān)閉連接(Connection)、聲明(Statement)或者結(jié)果集(ResultSet)對象。

C:closeQuietly方法: closeQuietly這一方法不僅能在連接、聲明或者結(jié)果集為NULL情況下避免關(guān)閉,還能隱藏一些在程序中拋出的SQLException。如果你不想捕捉這些異常的話,這對你是非常有用的。在重載closeQuietly方法時,特別有用的一個方法是 closeQuietly(Connection conn,Statement stmt,ResultSet rs),使用這一方法,你最后的塊就可以只需要調(diào)用這一方法即可。

D: commitAndCloseQuietly(Connection conn)方法和commitAndClose (Connection conn)方法:這兩個方法用來提交連接,然后關(guān)閉連接,不同的是commitAndCloseQuietly(Connection conn)方法關(guān)閉連接時不向上拋出在關(guān)閉時發(fā)生的一些SQL異常而commitAndClose (Connection conn)方法向上拋出SQL異常。

 

2.2:QueryRunner類

該類簡單化了 SQL 查詢,它與 ResultSetHandler(接口 后面將會介紹) 組合在一起使用可以完成大部分的數(shù)據(jù)庫操作,能夠大大減少編碼量

【構(gòu)造函數(shù)(1):QueryRunner() (2):QueryRunner(Datasource ds)】。

A:query(Connectionconn, String sql, Object[] params, ResultSetHandler rsh)方法:這一方法執(zhí)行一個帶參數(shù)的選擇查詢,在這個查詢中,對象陣列的值被用來作為查詢的置換參數(shù)。這一方法內(nèi)在地處理 PreparedStatement 和ResultSet 的創(chuàng)建和關(guān)閉。ResultSetHandler對象把從 ResultSet得來的數(shù)據(jù)轉(zhuǎn)變成一個更容易的或是應(yīng)用程序特定的格式來使用。

B:query(Stringsql, Object[] params, ResultSetHandler rsh)方法:這幾乎與第一種方法一樣;唯一的不同在于它不將數(shù)據(jù)庫連接提供給方法,并且它是從提供給構(gòu)造器的數(shù)據(jù)源(DataSource) 或使用的setDataSource 方法中重新獲得的。

C:query(Connectionconn, String sql, ResultSetHandler rsh)方法:這執(zhí)行一個帶參數(shù)的選擇查詢。

D:update(Connectionconn, String sql, Object[] params)方法:這一方法被用來執(zhí)行一個帶參數(shù)的插入、更新或刪除操作。對象陣列為聲明保存著置換參數(shù)。

E:update(Stringsql, Object[] params)方法: 這幾乎與上一種種方法一樣;唯一的不同在于它不將數(shù)據(jù)庫連接提供給方法,并且它是從提供給構(gòu)造器的數(shù)據(jù)源(DataSource) 或使用的setDataSource 方法中重新獲得的。

F:update(Connectionconn, String sql)方法:這執(zhí)行一個帶參數(shù)的插入、更新或刪除操作。

 

2.3:ResultSetHandler接口

正如它的名字所示,這一接口執(zhí)行處理一個java.sql.ResultSet,將數(shù)據(jù)轉(zhuǎn)變并處理為任何一種形式,這樣有益于其應(yīng)用而且使用起來更容易。這一組件提供了
    ArrayHandler :將ResultSet中第一行的數(shù)據(jù)轉(zhuǎn)化成對象數(shù)組
    ArrayListHandler將ResultSet中所有的數(shù)據(jù)轉(zhuǎn)化成List,List中存放的是Object[]
    BeanHandler :將ResultSet中第一行的數(shù)據(jù)轉(zhuǎn)化成類對象
    BeanListHandler :將ResultSet中所有的數(shù)據(jù)轉(zhuǎn)化成List,List中存放的是類對象
    ColumnListHandler :將ResultSet中某一列的數(shù)據(jù)存成List,List中存放的是Object對象
    KeyedHandler :將ResultSet中存成映射,key為某一列對應(yīng)為Map。Map中存放的是數(shù)據(jù)
    MapHandler :將ResultSet中第一行的數(shù)據(jù)存成Map映射
    MapListHandler :將ResultSet中所有的數(shù)據(jù)存成List。List中存放的是Map
    ScalarHandler :將ResultSet中一條記錄的其中某一列的數(shù)據(jù)存成Object等轉(zhuǎn)化類。 ResultSetHandler接口提供了一個單獨(dú)的方法:Object handle(java.sql.ResultSet .rs)。因此任何ResultSetHandler 的執(zhí)行需要一個結(jié)果集(ResultSet)作為參數(shù)傳入,然后才能處理這個結(jié)果集,再返回一個對象。因為返回類型是java.lang.Object,所以除了不能返回一個原始的Java類型之外,其它的返回類型并沒有什么限制。如果你發(fā)現(xiàn)這七個執(zhí)行程序中沒有任何一個提供了你想要的服務(wù),你可以自己寫執(zhí)行程序并使用它。
例: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"));
        }
    }
}

除上述介紹的外還可以了解一下以下內(nèi)容
    org.apache.commons.dbutils.QueryLoader:QueryLoader類是一個從一個文件加載查詢到一個Map的簡單的類。然后,當(dāng)需要的時候,你從 Map 中選擇一些查詢。在沒有專門去接觸代碼的情況下,一個文件中的Having查詢也可以改變得盡可能的簡單。
    org.apache.commons.dbutils.wrappers.SqlNullCheckedResultSet:這個類對使用一個系統(tǒng)方法來解決NULL值問題是很有用的。用一個 SqINullCheckedResultSet 的實例來限制一個常規(guī)的結(jié)果集(ResultSet),然后詳細(xì)地說明在遇NULL值的情況下應(yīng)該做些什么。
    org.apache.commons.dbutils.wrappers.StringTrimmedResultSet:用類 StringTrimmedResultSet 來約束一個結(jié)果集,這樣一來,你就可以修整所有g(shù)etString()和getObject()方法返回的字符串。
    注:dbutils組件對數(shù)據(jù)源的處理使用:QueryRunner qr = new QueryRunner(DataSource ds).

 

 

下面是組件中DbUtils類和BeanListHandler類的詳細(xì)用法的例子:

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類的詳細(xì)用法的例子:

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基類(數(shù)據(jù)庫操作基類)
 
這里使用了層超類模式,復(fù)用代碼,統(tǒng)一處理異常,日志等等..
 
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 {
    /**
     * 獲取數(shù)據(jù)庫連接
     * @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;
    }
 
    /**
     * 執(zhí)行更新的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 雇員數(shù)據(jù)庫操作DAO類
 
 
大家可以看到,下面的DAO類,繼承BaseDAO,方法體都是組裝sql語句,不必關(guān)心異常的處理,資源的管理(Connection,Statement等),這樣代碼簡潔,質(zhì)量高.
 
EmployeeDAO:
 
package com.d1zhan;
 
import java.util.List;
 
public class EmployeeDAO extends BaseDAO {
 
    /**
     * searchModel的屬性,name,address等為查詢參數(shù)
     * @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,修改它的值到數(shù)據(jù)庫
        if (emp.getName() != null) {
            sql +="employee.name=’" + emp.getName() + "’ ,";
        }
 
        //如果address不為null,修改它的值到數(shù)據(jù)庫
        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);
    }
 
    /**
     * 根據(jù)雇員ID刪除雇員
     * @param id
     * @return
     */
    public boolean delete(int id) {
        String sql = "delete fromemployee where id =" + id;
        return this.update(sql);
    }
 
    /**
     * 根據(jù)雇員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 classEmployee {
    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,現(xiàn)在就可以在業(yè)務(wù)層(service)調(diào)用我們的dao類方法,實現(xiàn)業(yè)務(wù)邏輯了
在service我們要處理業(yè)務(wù)邏輯,數(shù)據(jù)庫操作事務(wù)等等.
然后Struts Action調(diào)用 service類的方法,完成軟件了.

使用代碼大概是這樣的

Employeeemp=new Employee();

emp.setName("小李");

emp.setAddress("南寧市陽光新城");

EmployeeDAOdao=new EmployeeDAO();

dao.save(emp);

 

采用Commons-DbUtils組件(應(yīng)用數(shù)據(jù)源)

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

 

 // 取得數(shù)據(jù)源

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

 

}

2.查詢?nèi)康拇a

publicList queryAll() throws Exception {
  // TODO Auto-generated method stub
  List all = new ArrayList() ;
  String sql = "SELECTid,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 ; }

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    99久久国产精品免费| 国产又猛又黄又粗又爽无遮挡 | 日韩一级毛一欧美一级乱| 久草视频这里只是精品| 国产中文字幕一区二区| 中文字幕乱码一区二区三区四区| 欧美日本亚欧在线观看| 粉嫩内射av一区二区| 精品少妇人妻av免费看| 欧美激情一区二区亚洲专区| 亚洲一区二区精品免费视频| 日韩精品一级片免费看| 国产精品久久精品毛片| 日韩精品免费一区二区三区| 丰满少妇被猛烈插入在线观看| 欧美成人黄色一区二区三区| 色老汉在线视频免费亚欧| 国产欧美一区二区久久| 欧美日韩亚洲国产av| 91人妻久久精品一区二区三区| 国产福利一区二区三区四区| 97人妻精品免费一区二区| 久久精品国产第一区二区三区| 精品偷拍一区二区三区| 日本丁香婷婷欧美激情| 日韩精品在线观看完整版| 亚洲欧美日韩国产自拍| 日本加勒比在线播放一区| 中文字幕高清免费日韩视频| 人妻内射在线二区一区| 国产美女精品午夜福利视频| 欧美亚洲91在线视频| 国产欧美日韩精品自拍| 日本欧美一区二区三区就| 欧美性猛交内射老熟妇| 中文字幕一二区在线观看| 国产午夜在线精品视频| 欧美午夜视频免费观看| 麻豆果冻传媒一二三区| 国产精品欧美激情在线观看| 懂色一区二区三区四区|