开源框架:DBUtils使用详解
程序员文章站
2022-07-05 23:48:13
一、先熟悉DBUtils的API: 简介:DbUtils是一个为简化JDBC操作的小类库。 (一)整个dbutils总共才3个包: 1、包org.apache.commons.dbutils 接口摘要 ResultSetHandler 将ResultSet转换为别的对象的工具。 RowProcess ......
一、先熟悉DBUtils的API:
简介:DbUtils是一个为简化JDBC操作的小类库。
(一)整个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包装类。
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是一个为做一些诸如关闭连接、装载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返回值,这个返回值会告诉你驱动类是不是已经加载成功了。
如果不是的话,它们就关闭连接、声明和结果集(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类型之外,其它的返回类型并没有什么限制。
如果你发现这七个执行程序中没有任何一个提供了你想要的服务,你可以自己写执行程序并使用它。
这一接口执行处理一个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):
这一方法被用来执行一个插入、更新或删除操作。对象阵列为声明保存着置换参数。
这个类使执行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):
这一方法被用来执行一个插入、更新或删除操作。对象阵列为声明保存着置换参数。
4、使用遵从以下步骤:
1.加载JDBC驱动程序类,并用DriverManager来得到一个数据库连接conn。
2.实例化 QueryRunner,得到实例化对象qRunner。
3. qRunner.update()方法,执行增改删的sql命令,
qRunner.query()方法,得到结果集。
5、实战
1、连接类ConnectDb:import java.sql.DriverManager;
1 import java.sql.SQLException; 2 import java.sql.Connection; 3 4 public class ConnectDb { 5 private static String driveClassName = "com.mysql.jdbc.Driver"; 6 private static String url = "jdbc:mysql://192.168.1.161:3306/test?useUnicode=true&characterEncoding=utf8"; 7 8 private static String user = "root"; 9 private static String password = "e-playnow"; 10 11 public static Connection Connect(){ 12 Connection conn = null; 13 14 //load driver 15 try { 16 Class.forName(driveClassName); 17 } catch (ClassNotFoundException e) { 18 System.out.println("load driver failed!"); 19 e.printStackTrace(); 20 } 21 22 //connect db 23 try { 24 conn = DriverManager.getConnection(url, user, password); 25 } catch (SQLException e) { 26 System.out.println("connect failed!"); 27 e.printStackTrace(); 28 } 29 30 return conn; 31 } 32 }
2、数据库表
1 CREATE TABLE `user` ( 2 `id` int(11) NOT NULL auto_increment, 3 `name` varchar(50) NOT NULL, 4 `age` tinyint(10) NOT NULL, 5 PRIMARY KEY (`id`) 6 ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
3、Bean
1 package Beans; 2 3 public class UserBean { 4 private int id; 5 private String name; 6 private int age; 7 8 public int getId() { 9 return id; 10 } 11 public void setId(int id) { 12 this.id = id; 13 } 14 public String getName() { 15 return name; 16 } 17 public void setName(String name) { 18 this.name = name; 19 } 20 public int getAge() { 21 return age; 22 } 23 public void setAge(int age) { 24 this.age = age; 25 } 26 }
4、Demo
1 import java.sql.Connection; 2 import java.sql.SQLException; 3 import java.util.List; 4 import org.apache.commons.dbutils.DbUtils; 5 import org.apache.commons.dbutils.QueryRunner; 6 import org.apache.commons.dbutils.handlers.BeanListHandler; 7 import Beans.UserBean; 8 9 public class main { 10 11 public static void main(String[] args) throws SQLException { 12 insert_test(); 13 del_test(); 14 } 15 16 static void insert_test() throws SQLException{ 17 Connection conn = ConnectDb.Connect(); 18 19 //创建SQL执行工具 20 QueryRunner qRunner = new QueryRunner(); 21 22 //执行SQL插入 23 int n = qRunner.update(conn, "insert into user(name,age) values('xxx',22)"); 24 System.out.println("成功插入" + n + "条数据!"); 25 26 //关闭数据库连接 27 DbUtils.closeQuietly(conn); 28 } 29 30 static void select_test() throws SQLException{ 31 Connection conn = ConnectDb.Connect(); 32 33 //创建SQL执行工具 34 QueryRunner qRunner = new QueryRunner(); 35 36 @SuppressWarnings("unchecked") 37 List<UserBean> list = (List<UserBean>) qRunner.query(conn, "select id,name,age from user", new BeanListHandler(UserBean.class)); 38 //输出查询结果 39 for (UserBean user : list) { 40 System.out.println(user.getAge()); 41 } 42 43 //关闭数据库连接 44 DbUtils.closeQuietly(conn); 45 } 46 47 static void update_test() throws SQLException{ 48 Connection conn = ConnectDb.Connect(); 49 50 //创建SQL执行工具 51 QueryRunner qRunner = new QueryRunner(); 52 //执行SQL插入 53 int n = qRunner.update(conn, "update user set name = 'xxx',age=28"); 54 System.out.println("成功更新" + n + "条数据!"); 55 56 //关闭数据库连接 57 DbUtils.closeQuietly(conn); 58 } 59 60 static void del_test() throws SQLException{ 61 Connection conn = ConnectDb.Connect(); 62 63 //创建SQL执行工具 64 QueryRunner qRunner = new QueryRunner(); 65 //执行SQL插入 66 int n = qRunner.update(conn, "DELETE from user WHERE name='xxx';"); 67 System.out.println("删除成功" + n + "条数据!"); 68 69 //关闭数据库连接 70 DbUtils.closeQuietly(conn); 71 } 72 }
标明出处:https://blog.csdn.net/samjustin1/article/details/52220423