• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Java数据库操作库DButils类的使用方法与实例详解

java 搞代码 4年前 (2022-01-05) 18次浏览 已收录 0个评论
文章目录[隐藏]

这篇文章主要介绍了JDBC数据库操作库DButils类的使用方法详解,需要的朋友可以参考下

DbUtils是Javar的一个为简化JDBC操作类库

commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。

整个dbutils总共才3个包:

org.apache.commons.dbutils (该包中的类主要帮助我们更便捷的操作JDBC)

org.apache.commons.dbutils.handlers(该包中的类都是实现org.apache.commons.dbutils.ResultSetHandler接口的实现类)

org.apache.commons.dbutils.wrappers(该包中的类主要是封装了对Sql结果集的操作)

1.DbUtils包的简介:

1.1 org.apache.commons.dbutils 包的使用和相关类的简介:

接口摘要:

– ResultSetHandler 将ResultSet转换为别的对象的工具。

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

类摘要:

BasicRowProcessor RowProcessor接口的基本实现类。

BeanProcessor BeanProcessor匹配列明到Bean属性名,并转换结果集列到Bean对象的属性中。

DbUtils 一个JDBC辅助工具集合。

ProxyFactory 产生JDBC接口的代理实现。

QueryLoader 属性文件加载器,主要用于加载属性文件中的 SQL 到内存中。

QueryRunner 使用可插拔的策略执行SQL查询并处理结果集。

ResultSetIterator 包装结果集为一个迭代器。

1.2 org.apache.commons.dbutils.handlers 的使用和相关类的简介:

类摘要:

相关类 作用
AbstractListHandler 将ResultSet转为List的抽象类
ArrayHandler 将ResultSet转为一个Object[]的ResultSetHandler实现类
ArrayListHandler 将ResultSet转换为List的ResultSetHandler实现类
BeanHandler ResultSet行转换为一个JavaBean的ResultSetHandler实现类
BeanListHandler 将ResultSet转换为List的ResultSetHandler实现类
ColumnListHandler 将ResultSet的一个列转换为List的ResultSetHandler实现类
KeyedHandler 将ResultSet转换为Map

的ResultSetHandler实现类
MapHandler 将ResultSet的首行转换为一个Map的ResultSetHandler实现类
MapListHandler 将ResultSet转换为List

的ResultSetHandler实现类
ScalarHandler 将ResultSet的一个列到一个对象。

1.3 org.apache.commons.dbutils.wrappers包的使用

SqlNullCheckedResultSet 在每个getXXX方法上检查SQL NULL值的ResultSet包装类。

StringTrimmedResultSet 取出结果集中字符串左右空格的ResultSet包装类。

2.使用DBUtils(两类一接口)

只是使用的话,只看两个类(DbUtils 和QueryRunner)和一个接口(ResultSethandler)就可以了。

2.1 DbUtils类:

DbUtils是一个为做一些诸如关闭连接、装载JDBC驱动程序之类的常规工作提供有用方法的类,它里面所有的方法都是静态的。

这个类里的重要方法有:

(1)close():

DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,

如果不是的话,它们就关闭连接、声明和结果集(ResultSet)。

(2)CloseQuietly:

CloseQuietly这一方法不仅能在连接、声明或者结果集(ResultSet)为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。如果你不想捕捉这些异常的话,这对你是非常有用的。在重载CloseQuietly方法时,特别有用的一个方法closeQuietly(Connection conn,Statement stmt,ResultSet rs),这是因为在大多数情况下,连接、声明和结果集(ResultSet)是你要用的三样东西,而且在最后的块你必须关闭它们。使用这一方法,你最后的块就可以只需要调用这一方法即可。

(3)CommitAndCloseQuietly(Connection conn):

这一方法用来提交连接,然后关闭连接,并且在关闭连接时不向上抛出在关闭时发生的一些SQL异常,LoadDriver(String driveClassName):这一方法装载并注册JDBC驱动程序,如果成功就返回TRUE。使用这种方法,你不需要去捕捉这个异常ClassNotFoundException。使用loadDrive方法,编码就变得更容易理解,你也就得到了一个很好的Boolean返回值,这个返回值会告诉你驱动类是不是已经加载成功了。

2.2 QureryRunner类:

该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。

QueryRunner类提供了两个构造方法:

(1)一个是一个空构造器;

(2)另一个则拿一个 javax.sql.DataSource 来作为参数。因此,在你不用为一个方法提供一个数据库连接来作为参数的情况下,提供给构造器的数据源(DataSource) 被用来获得一个新的连接并将继续进行下去。

主要的方法:

  • public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。
  • public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection。
  • public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException :执行一个不需要置换参数的查询操作。
  • public int update(Connection conn, String sql, Object[] params) throws SQLException:用来执行一个更新(插入、更新或删除)操作,返回的是受语句影响的行数
  • public int update(Connection conn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作, 返回的是受语句影响的行数

2.3:ResultSetHandler接口:

该接口用于处理Java.sql.ResultSet,将数据按要求转换为另一种形式。ResultSetHandler接口提供了一个单独的方法:Object handle (java.sql.ResultSet rs)。因此任何ResultSetHandler 的执行需要一个结果集(ResultSet)作为参数传入,然后才能处理这个结果集,再返回一个对象。

因为返回类型是java.lang.Object,所以除了不能返回一个原始的Java类型之外,其它的返回类型并没有什么限制。如果你发现这七个执行程序中没有任何一个提供了你想要的服务,你可以自己写执行程序并使用它。这一组件提供了ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, MapHandler, MapListHandler, and ScalarHandler等执行程序。其方法如下:

相关类 作用
AbstractListHandler 将ResultSet转为List的抽象类
ArrayHandler 将ResultSet转为一个Object[]的ResultSetHandler实现类
ArrayListHandler 将ResultSet转换为List的ResultSetHandler实现类
BeanHandler ResultSet行转换为一个JavaBean的ResultSetHandler实现类
BeanListHandler 将ResultSet转换为List的ResultSetHandler实现类
ColumnListHandler 将ResultSet的一个列转换为List的ResultSetHandler实现类
KeyedHandler 将ResultSet转换为Map

的ResultSetHandler实现类
MapHandler 将ResultSet的首行转换为一个Map的ResultSetHandler实现类
MapListHandler 将ResultSet转换为List

的ResultSetHandler实现类
ScalarHandler 将ResultSet的一个列到一个对象。

3.代码实战:

使用遵从以下步骤:

1.加载JDBC驱动程序类,并用DriverManager来得到一个数据库连接conn。

2.实例化 QueryRunner,得到实例化对象qRunner。

3. qRunner.update()方法,执行增改删的sql命令, qRunner.query()方法,得到结果集。

首先生成以下数据库表:

 create table stuInfo ( stuNo int primary key identity (1,1),--学号 stuName nvarchar(10) not null,--学生姓名 stuSex nvarchar(2) not null,--学生性别 stuAge int not null,--学生年龄 stuSeat int not null,--学生座位 stuAddress nvarchar(20) --学生住址 )

(1)完成CRUD的操作:

 public class QueryRunnerTest { public static void main(String[] args) { QueryRunnerTest test = new QueryRunnerTest(); test.add(); test.delete(); test.update(); test.find(); test.getAll(); } //静态方法获取数据库链接对象: private static Connection getConnection() { Connection conn = null; try {   Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;Database=student", "sa", "sasa"); } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println(conn); return conn; } //添加方法 public void add () { Connection conn = getConnection(); QueryRunner qr = new QueryRunner(); String sql = "insert into stuInfo (stuName,stuSex,stuAge,stuSeat,stuAddress) values (?,?,?,?,?)"; Object param[] = {"张良","男",20,11,"韩国"}; int i; try { i = qr.update(conn, sql, param); //i是受操作影响的行数; System.out.println("添加成功:"+i); DbUtils.closeQuietly(conn); //关闭链接; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //删除方法 public void delete() { Connection conn = getConnection(); QueryRunner qr = new QueryRunner(); String sql ="delete from stuInfo where stuNo=?"; try { int i = qr.update(conn, sql, 7); i是受操作影响的行数; System.out.println("删除成功:"+i); DbUtils.closeQuietly(conn); //关闭链接; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //修改方法 public void update() { Connection conn = getConnection(); QueryRunner qr = new QueryRunner(); String sql = "update stuInfo set stuName=? where stuNo=?"; Object params[] = {"胡歌",3}; try { int i = qr.update(conn, sql, params); System.out.println("修改成功:"+i); // i是受操作影响的行数; DbUtils.closeQuietly(conn); //关闭链接; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //查询方法 public void find() { Connection conn = getConnection(); QueryRunner qr = new QueryRunner(); String sql = "select * from stuInfo where stuNo=?"; Object params[] = {5}; try { StuInfo stuInfo = (StuInfo)qr.query(conn, sql, new BeanHandler(StuInfo.class), params); System.out.println("查询成功:"+stuInfo); DbUtils.closeQuietly(conn); //关闭链接; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //查询所有 public void getAll() { Connection conn = g<strong style="color:transparent">来源gao@daima#com搞(%代@#码网</strong>etConnection(); QueryRunner qr = new QueryRunner(); String sql ="select * from stuInfo"; ArrayList list; try { list = (ArrayList) qr.query(conn, sql, new BeanListHandler(StuInfo.class)); for (StuInfo stuInfo : list) { System.out.println(stuInfo); } DbUtils.closeQuietly(conn); //关闭链接; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 

(2)测试dbutils各种类型的处理器:

(1)ArrayHandler:把结果集中的第一行数据转成对象数组。测试代码如下:

 public class Demo2 { @Test public void test1() throws SQLException { QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource()); String sql = "select * from users"; Object[] result = runner.query(sql, new ArrayHandler()); System.out.println(result[0]); System.out.println(result[1]); } }

(2)ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。测试代码如下:

 public class Demo2 { @Test public void test2() throws SQLException { QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource()); String sql = "select * from users"; List list = runner.query(sql, new ArrayListHandler()); System.out.println(list); } }

(3)ColumnListHandler:将结果集中某一列的数据存放到List中。测试代码如下:

 public class Demo2 { @Test public void test3() throws SQLException { QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource()); String sql = "select * from users"; List list = (List) runner.query(sql, new ColumnListHandler("name")); System.out.println(list); } }

(4)KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key:

这话听起来有些绕口,但我用一张图来解释就很明白了。

 public class Demo2 { @Test public void test4() throws SQLException { QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource()); String sql = "select * from users"; Map<Integer, Map> map = (Map<Integer, Map>) runner.query(sql, new KeyedHandler("id")); for (Map.Entry<Integer, Map> me : map.entrySet()) { int id = me.getKey(); for (Map.Entry entry : me.getValue().entrySet()) { String name = entry.getKey(); Object value = entry.getValue(); System.out.println(name+"="+value); } } } }

至此本文介绍了Java数据库操作库DButils类的使用方法与实例更多相关链接请查看下面的相关链接

以上就是Java数据库操作库DButils类的使用方法与实例详解的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Java数据库操作库DButils类的使用方法与实例详解

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址