一, 先相熟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);       }   }