乐趣区

关于jdbc:JDBC通用CRUD解决方案DBUtils

一, 先相熟 DBUtils 的 API:

  • 简介 :DbUtils 是一个为简化 JDBC 操作的小类库。
  • 以下应用的是最新版的 commons-dbutils-1.4,先给个简介,以便迅速把握 API 的应用。

整个 dbutils 总共才 3 个包:

1、包 org.apache.commons.dbutils

接口摘要

  • ResultSetHandler 将 ResultSet 转换为别的对象的工具。
  • RowProcessor       将 ResultSet 行转换为别的对象的工具。

类摘要

  • BasicRowProcessor   RowProcessor 接口的根本实现类。
  • BeanProcessor       BeanProcessor 匹配列明到 Bean 属性名,并转换后果集列到 Bean 对象的属性中。
  • DbUtils             一个 JDBC 辅助工具汇合。
  • ProxyFactory        产生 JDBC 接口的代理实现。
  • QueryLoader         属性文件加载器,次要用于加载属性文件中的 SQL 到内存中。
  • QueryRunner         应用可插拔的策略执行 SQL 查问并处理结果集。
  • ResultSetIterator   包装后果集为一个迭代器。

2、包 org.apache.commons.dbutils.handlers
ResultSetHandler 接口的实现类

类摘要

  • AbstractListHandler 将 ResultSet 转为 List 的抽象类
  • ArrayHandler 将 ResultSet 转为一个 Object[] 的 ResultSetHandler 实现类
  • ArrayListHandler 将 ResultSet 转换为 List<Object[]> 的 ResultSetHandler 实现类
  • BeanHandler 将 ResultSet 行转换为一个 JavaBean 的 ResultSetHandler 实现类
  • BeanListHandler 将 ResultSet 转换为 List<JavaBean> 的 ResultSetHandler 实现类
  • ColumnListHandler 将 ResultSet 的一个列转换为 List<Object> 的 ResultSetHandler 实现类
  • KeyedHandler 将 ResultSet 转换为 Map<Map> 的 ResultSetHandler 实现类
  • MapHandler 将 ResultSet 的首行转换为一个 Map 的 ResultSetHandler 实现类
  • MapListHandler 将 ResultSet 转换为 List<Map> 的 ResultSetHandler 实现类
  • ScalarHandler 将 ResultSet 的一个列到一个对象。

3、包 org.apache.commons.dbutils.wrappers
增加 java.sql 类中性能包装类。

类摘要

  • SqlNullCheckedResultSet  在每个 getXXX 办法上查看 SQL NULL 值的 ResultSet 包装类。
  • StringTrimmedResultSet    取出后果集中字符串左右空格的 ResultSet 包装类。

二,应用 DBUtils

其实只是应用的话,只看两个类(DbUtils 和 QueryRunner)和一个接口(ResultSethandler)就能够了。

1,DbUtils
DbUtils 是一个为做一些诸如敞开连贯、装载 JDBC 驱动程序之类的惯例工作提供有用办法的类,它外面所有的办法都是动态的。

这个类里的重要办法有:

close():

DbUtils 类提供了三个重载的敞开办法。这些办法查看所提供的参数是不是 NULL,如果不是的话,它们就敞开连贯、申明和后果集(ResultSet)。

CloseQuietly:
CloseQuietly 这一办法不仅能在连贯、申明或者后果集(ResultSet)为 NULL 状况下防止敞开,
还能暗藏一些在程序中抛出的 SQLEeception。如果你不想捕获这些异样的话,这对你是十分有用的。
在重载 CloseQuietly 办法时,特地有用的一个办法是 closeQuietly(Connection conn,Statement stmt,ResultSet rs),
这是因为在大多数状况下,连贯、申明和后果集(ResultSet)是你要用的三样货色,而且在最初的块你必须敞开它们。
应用这一办法,你最初的块就能够只须要调用这一办法即可。

CommitAndCloseQuietly(Connection conn):

这一办法用来提交连贯,而后敞开连贯,并且在敞开连贯时不向上抛出在敞开时产生的一些 SQL 异样。
LoadDriver(String driveClassName): 这一办法装载并注册 JDBC 驱动程序,如果胜利就返回 TRUE。
应用这种办法,你不须要去捕获这个异样 ClassNotFoundException。应用 loadDrive 办法,编码就变得更容易了解,
你也就失去了一个很好的 Boolean 返回值,这个返回值会通知你驱动类是不是曾经加载胜利了。

2,ResultSetHandler

这一接口执行解决一个 jaca.sql.ResultSet,将数据转变并解决为任何一种模式,这样有益于其利用而且应用起来更容易。
这一组件提供了 ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, MapHandler, MapListHandler, and ScalarHandler 等执行程序。

ResultSetHandler 接口提供了一个独自的办法:Object handle (java.sql.ResultSet .rs)。
因而任何 ResultSetHandler 的执行须要一个后果集(ResultSet)作为参数传入,而后能力解决这个后果集,再返回一个对象。
因为返回类型是 java.lang.Object,所以除了不能返回一个原始的 Java 类型之外,其它的返回类型并没有什么限度。
如果你发现这七个执行程序中没有任何一个提供了你想要的服务,你能够本人写执行程序并应用它。

3,QreryRunner
这个类使执行 SQL 查问简单化了,它与 ResultSetHandler 串联在一起无效地履行着一些平时的工作,它可能大大减少你所要写的编码。
QueryRunner 类提供了两个结构器:其中一个是一个空结构器,另一个则拿一个 javax.sql.DataSource 来作为参数。
因而,在你不必为一个办法提供一个数据库连贯来作为参数的状况下,提供给结构器的数据源 (DataSource) 被用来取得一个新的连贯并将持续进行上来。

这一类中的重要办法包含以下这些:

  • query(Connection conn, String sql, Object[] params, ResultSetHandler rsh):

这一办法执行一个抉择查问,在这个查问中,对象阵列的值被用来作为查问的置换参数。
这一办法外在地解决 PreparedStatement 和 ResultSet  的创立和敞开。
ResultSetHandler 对把从 ResultSet 得来的数据转变成一个更容易的或是应用程序特定的格局来应用。

  • query(String sql, Object[] params, ResultSetHandler rsh):

这简直与第一种办法一样;惟一的不同在于它不将数据库连贯提供给办法,
并且它是从提供给结构器的数据源 (DataSource) 或应用的 setDAtaSource 办法中从新取得的。

  • query(Connection conn, String sql, ResultSetHandler rsh):

这执行一个不要参数的抉择查问。

  • update(Connection conn, String sql, Object[] params):

这一办法被用来执行一个插入、更新或删除操作。对象阵列为申明保留着置换参数。

到此为止,阐明工作就差不多了,上面就实战一下,进入 DBUtils 应用详解二。

一,应用听从以下步骤:

1. 加载 JDBC 驱动程序类,并用 DriverManager 来失去一个数据库连贯 conn。
2. 实例化 QueryRunner, 失去实例化对象 qRunner。
3.qRunner.update() 办法,执行增改删的 sql 命令,
    qRunner.query() 办法,失去后果集。

二,实战

1,连贯类 ConnectDb:import java.sql.DriverManager;

import java.sql.SQLException;  
import java.sql.Connection;   
  
public class ConnectDb {  
    private static String driveClassName = "com.mysql.jdbc.Driver";  
    private static String url = "jdbc:mysql://192.168.1.161:3306/test?useUnicode=true&characterEncoding=utf8";   
      
    private static String user = "root";  
    private static String password = "e-playnow";  
      
    public static Connection Connect(){  
        Connection conn = null;  
          
        //load driver  
        try {Class.forName(driveClassName);  
        } catch (ClassNotFoundException  e) {System.out.println("load driver failed!");  
            e.printStackTrace();}  
          
        //connect db  
        try {conn = DriverManager.getConnection(url, user, password);  
        } catch (SQLException e) {System.out.println("connect failed!");  
            e.printStackTrace();}         
          
        return conn;  
    }  
}  

数据库表:

CREATE TABLE `user` (`id` int(11) NOT NULL auto_increment,  
  `name` varchar(50) NOT NULL,  
  `age` tinyint(10) NOT NULL,  
  PRIMARY KEY  (`id`)  
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8  

Bean:

package Beans;  
  
public class UserBean {  
    private int id;   
    private String name;   
    private int age;  
      
    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 int getAge() {return age;}  
    public void setAge(int age) {this.age = age;}  
}  

2,Demo:

import java.sql.Connection;  
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;  
import Beans.UserBean;  
  
public class main {public static void main(String[] args) throws SQLException {insert_test();  
        del_test();}  
      
    static void insert_test() throws SQLException{Connection conn = ConnectDb.Connect();  
          
        // 创立 SQL 执行工具   
        QueryRunner qRunner = new QueryRunner();   
          
        // 执行 SQL 插入   
        int n = qRunner.update(conn, "insert into user(name,age) values('xxx',22)");   
        System.out.println("胜利插入" + n + "条数据!");   
          
        // 敞开数据库连贯   
        DbUtils.closeQuietly(conn);       
    }   
      
    static void select_test() throws SQLException{Connection conn = ConnectDb.Connect();  
          
        // 创立 SQL 执行工具   
        QueryRunner qRunner = new QueryRunner();   
          
        @SuppressWarnings("unchecked")  
        List<UserBean> list = (List<UserBean>) qRunner.query(conn, "select id,name,age from user", new BeanListHandler(UserBean.class));   
        // 输入查问后果   
        for (UserBean user : list) {System.out.println(user.getAge());   
        }   
          
        // 敞开数据库连贯   
        DbUtils.closeQuietly(conn);   
    }   
  
    static void update_test() throws SQLException{Connection conn = ConnectDb.Connect();  
          
        // 创立 SQL 执行工具   
        QueryRunner qRunner = new QueryRunner();   
        // 执行 SQL 插入   
        int n = qRunner.update(conn, "update user set name ='xxx',age=28");   
        System.out.println("胜利更新" + n + "条数据!");   
          
        // 敞开数据库连贯   
        DbUtils.closeQuietly(conn);   
    }   
      
    static void del_test() throws SQLException{Connection conn = ConnectDb.Connect();  
          
        // 创立 SQL 执行工具   
        QueryRunner qRunner = new QueryRunner();   
        // 执行 SQL 插入   
        int n = qRunner.update(conn, "DELETE from user WHERE name='xxx';");   
        System.out.println("删除胜利" + n + "条数据!");   
          
        // 敞开数据库连贯   
        DbUtils.closeQuietly(conn);   
    }   
}  
退出移动版