DBMNG数据库管理与应用

科学是实事求是的学问,来不得半点虚假。
当前位置:首页 > 经验分享 > Java组件

java DBUtils 常见的使用方式及介绍

1、Commonsdbutils是什么?


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


 


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


主要讲解两个类(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 = 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 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,现在就可以在业务层(service)调用我们的dao类方法,实现业务逻辑了

在service我们要处理业务逻辑,数据库操作事务等等.

然后Struts Action调用 service类的方法,完成软件了.


使用代码大概是这样的


Employeeemp=new Employee();


emp.setName("小李");


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


EmployeeDAOdao=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" ;


  DBDataSource dbc = new DBDataSource() ;


  DataSource ds=dbc.getDataSource();


  QueryRunner qr=new QueryRunner(ds);


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


  return all ; }


本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号