共计 6084 个字符,预计需要花费 16 分钟才能阅读完成。
一, 先相熟 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);
}
}