DBUtils详细介绍+实例
来源:互联网 发布:最大淘宝小号交易平台 编辑:程序博客网 时间:2024/05/29 13:42
1.介绍
1)简介:
DBUtils是一个小型的类库,它使JDBC编程更加方便,简单。在JDBC编程中,资源的关闭是显式的,极易导致编程出现错误,DBUtils把这些工作抽象出来,使得程序员编程时仅需要关心正真的问题,即对数据库的增删改查。
2)优点:
杜绝资源泄露。修正JDBC代码并不困难,但是这是耗时而乏味的,这通常导致连接泄露并且难以跟踪到。
清洁干净的持久化代码。大段的持久化数据到数据库代码彻底精简,剩下的代码清晰地表达了编码的意图。
从ResultSet里自动组装JavaBean。你不再需要手工set每一行每一列的值到bean中,每一行数据都将会以一个Bean实例的形式出现
3)适用场景:
通常初学者用JDBC比较多,只是初学者为了打实基础,练习阶段少用框架和帮助类库。
小型项目,小型项目不需要太多的数据库操作,不需要考虑跨数据库兼容问题,用框架并不会让编码更简单。
需要高效率的项目,无论iBatis、Hibernate,到了底下还是JDBC,直接用JDBC访问数据库无疑是最优的效率最高的方案。
4)准备:
下载下来后(当然也可以使用maven工程),名称为commons-dbutils-1.6.jar,下面总共包含三个包,分别是:
其中的org.apache.commons.dbutils包主要有如下的接口和类:
ResultSetHandler——将ResultSet转换为别的对象的工具。
BeanProcessor——匹配列名到Bean属性名,转换结果集列到Bean对象的属性。
DbUtils——一个JDBC辅助工具集合。
ProxyFactory——产生JDBC接口的代理实现。
QueryLoader——属性文件加载器,用于加载属性文件中的SQL到内存中。
QueryRunner——使用可插拔的策略执行SQL查询并处理结果集。
ResultSetIterator——包装结果集为一个迭代器。
其中的org.apache.commons.dbutils.handlers包为第一个包中ResultSetHandler接口的实现类:
AbstractListHandler——将ResultSet转化为List类型的抽象类。
ArrayHandler——将ResultSet转化为Object[]类型的实现类。
ArrayListHandler——将ResultSet转化为List<Object[]>
类型的实现类。
BeanHandler——将ResultSet转化为JavaBean类型的实现类。
BeanListHandler——将ResultSet转化为List<JavaBean>
类型的实现类。
ColumnListHandler ——将ResultSet转化为List<Object>
类型的实现类。
MapHandler ——将ResultSet转换为Map类型的实现类。
MapListHandler ——将ResultSet转换为List<Map>
类型的实现类。
KeyedHandler——将ResultSet转换为Map<Map>
类型的实现类。
ScalarHandler ——将ResultSet的一个列转化到一个对象。
其中的org.apache.commons.dbutils.wrappers包:
SqlNullCheckedResultSet——在每个getXXX方法上检查SQLNULL值的包装类。
StringTrimmedResultSet——取出结果集中字符串左右空格的ResultSet包装类。
在使用过程中只需要熟悉DbUtils、QueryRunner和ResultSetHandler的用法就足够了。
DbUtils是一个做关闭连接,装载JDBC驱动程序等工作的类,它里面所有的方法都是静态的:
Close()
:DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭连接(Connection)、声明(Statement)和结果集(ResultSet)。
CloseQuietly()
:CloseQuietly这一方法不仅能在连接(Connection)、声明(Statement)和结果集(ResultSet)为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。如果你不想捕捉这些异常的话,这对你是非常有用的。
CommitAndCloseQuietly
:这一方法用来提交连接,然后关闭连接,并且在关闭连接时不向上抛出在关闭时发生的一些SQL异常。
LoadDriver()
:这一方法装载并注册JDBC驱动程序,如果成功就返回TRUE。使用这种方法,你不需要去捕捉这个异常ClassNotFoundException。使用loadDriver()方法,编码就变得更容易理解,你也就得到了一个很好的Boolean返回值,这个返回值会告诉你驱动类是不是已经加载成功了。
ResultSetHandler接口处理一个java.sql.ResultSet,将数据转变为其它的形式,该接口提供ArrayHandler、ArrayListHandler、BeanHandler、BeanListHandler、MapHandler、MapListHandler、ScalarHandler等执行程序。ResultSetHandler的执行需要一个结果集(ResultSet)作为参数传入,然后才能处理这个结果集,再返回一个对象。因为返回类型是java.lang.Object,所以除了不能返回一个原始的Java类型之外,其它的返回类型并没有什么限制。如果你发现这七个执行程序中没有任何一个提供了你想要的服务,你可以自己写执行程序并使用它。
QueryRunner使执行SQL查询简单化了,它与ResultSetHandler串联在一起有效地履行着一些平常的任务,它能够大大减少你所要写的编码。它包含以下重要的方法:
query(Connection conn,String sql,Object[] params,ResultSetHandler rsh)
:这一方法执行一个选择查询,对象数组(Object[] params)中的值被用来作为查询语句sql的置换参数。该方法会内在地处理Statement和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)
:该方法用来执行插入、更新或者删除操作,对象数组(Object[] params)中的值被用来作为更新语句sql的置换参数。
2.使用
新建一个Java类:DBTest.java
import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.ArrayList;import org.apache.commons.dbutils.DbUtils;import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.BeanListHandler;import bean.StudentBean;public class DBTest { public static void main(String[] args) { insertData(); updateData(); selectData(); deleteData(); insertDataWithParams(1002,"kj",23); } public static void insertData() { // 获取数据库连接 Connection conn = connectDB(); // 创建SQL执行工具 QueryRunner runner = new QueryRunner(); String sql = "insert into user(userId,userName,age) values(1001,'zx',21)"; int num; try { num = runner.update(conn, sql); System.out.println("成功插入" + num + "条数据!"); } catch (SQLException e) { e.printStackTrace(); } // 关闭数据库连接 DbUtils.closeQuietly(conn); } public static void insertDataWithParams(int userId, String userName, int age) { // 获取数据库连接 Connection conn = connectDB(); // 创建SQL执行工具 QueryRunner runner = new QueryRunner(); String sql = "insert into user(userId,userName,age) values(?,?,?)"; Object[] params = { userId, userName, age }; try { int num = runner.update(conn, sql, params); System.out.println("成功插入" + num + "条数据!"); } catch (SQLException e) { e.printStackTrace(); } DbUtils.closeQuietly(conn); } public static void updateData() { // 获取数据库连接 Connection conn = connectDB(); // 创建SQL执行工具 QueryRunner runner = new QueryRunner(); String sql = "update user set userName='xz' where userId=1001"; try { int num = runner.update(conn, sql); System.out.println("成功更新" + num + "条数据!"); } catch (SQLException e) { e.printStackTrace(); } DbUtils.closeQuietly(conn); } public static void deleteData() { // 获取数据库连接 Connection conn = connectDB(); // 创建SQL执行工具 QueryRunner runner = new QueryRunner(); String sql = "delete from user where userName='xz'"; try { int num = runner.update(conn, sql); System.out.println("成功删除" + num + "条数据!"); } catch (Exception e) { e.printStackTrace(); } DbUtils.closeQuietly(conn); } public static void selectData() { // 获取数据库连接 Connection conn = connectDB(); // 创建SQL执行工具 QueryRunner runner = new QueryRunner(); String sql = "select * from user where userId=1001"; ArrayList<StudentBean> userList; try { userList = runner.query(conn, sql,new BeanListHandler(StudentBean.class)); System.out.println("userList size is:"+userList.size()); for (StudentBean studentBean : userList) { System.out.println(studentBean); } } catch (SQLException e) { e.printStackTrace(); } DbUtils.closeQuietly(conn); } public static Connection connectDB() { String driverClassName = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://10.1.40.61:3306/test_bid_system?useUnicode=true&characterEncoding=utf8"; String userName = "root"; String password = "root"; Connection conn = null; try { Class.forName(driverClassName); conn = DriverManager.getConnection(url, userName, password); } catch (Exception e) { e.printStackTrace(); } System.out.println("获取数据库连接成功!"); return conn; }}
3.结束
DBUtils是比较轻巧地对JDBC进行了封装,在简化JDBC编程的目的下又不会失去JDBC的高效率。
阅读DBUtils的源码也是比较轻松,有帮助的。
参考资料:DBUtils使用详解
- DBUtils详细介绍+实例
- DBUtils使用详解【介绍的很详细】
- DBUtils实例
- DBUtils介绍
- DBUtils介绍
- dbutils 介绍
- 快速开发之xUtils(三)DbUtils详细介绍
- JDBC详细介绍+实例
- DBUtils使用详细示例
- DBUtils使用详细示例
- DBUtils使用详细示例
- mysql权限详细介绍实例
- 接口详细介绍与实例
- DbUtils入门实例
- Dbutils 使用实例
- Apache DbUtils应用实例
- DBUtils使用 -- > 实例比较
- Apache DbUtils应用实例
- Android微信文件分享
- image soure相机的snap采图方式
- 设计模式(9)--Proxy代理模式
- 自定义URL Scheme
- COALESCE()函数
- DBUtils详细介绍+实例
- 空包的签名方法
- Cracking the coding interview
- 两种体系结构的分析笔记
- 区分联通、移动、电信 号码的策略
- 【方便查】git分支建立删除,打tag
- 纯代码写CollectionViewCell的复用问题
- php计算两个经纬度地点之间的距离
- ORACLE常用的sql语句