博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Apache Commons DbUtils 快速上手
阅读量:5823 次
发布时间:2019-06-18

本文共 5059 字,大约阅读时间需要 16 分钟。

Hibernate太复杂,iBatis不好用,JDBC代码太垃圾,DBUtils在简单与优美之间取得了完美平衡。
 
一、概述
 
DbUtils小巧的Java数据库操作工具,它在JDBC的基础上做了科学的封装,旨在简化JDBC代码混乱与重复。
 
对于JDBC代码,存在很多问题,算是对Java的批判:
1、操作过程复杂,代码操作一个模式,大量的重复。
2、结果集难以处理,拿到一个ResultSet干屁啊,一个一个度,转称JavaBean,后来形成List,太麻烦了。
3、到处都强制检查SQLException,烦不烦啊,影响代码的美观和可读性。
 
当然,以上的批判不是说JDBC设计不合理,二是缺乏更高层操作API的支持。因此才产生了众多的开源数据库操作的框架和工具包。
 
二、熟悉DBUtils的API
 
针对DBUitlsAPI的包,做个简单的翻译,以便迅速掌握API的使用。
1、------------------------------------
包org.apache.commons.dbutils 
        DbUtils是一个为简化JDBC操作的小类库。
接口摘要
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包装类。
 
三、环境
 
Java5
commons-dbutils-1.2-bin.zip
mysql-noinstall-5.1.40-win32.zip
mysql-connector-java-5.1.10.zip
 
下载地址:
 
四、实例
 
1、sql脚本
create 
table 
user (                                                                         

                    id 
int(11) 
not 
null auto_increment,                                     

                    
name 
varchar(50) character 
set latin1 
not 
null,             

                    pswd 
varchar(50) character 
set latin1 
default 
null,     

                    
primary 
key (id)                                                                            

                ) engine=MYISAM auto_increment=1 
default charset=gbk
 
2、简单的数据库连接工具
package stu.lavasoft.dbutils; 


import java.sql.Connection; 

import java.sql.DriverManager; 

import java.sql.SQLException; 


/** 
* 随便写个数据库连接获取工具,凑合着把例子跑起来 
* @author leizhimin 2009-11-6 14:48:22 
*/
 

public 
class ConnTools { 

        
private 
static String dirverClassName = 
"com.mysql.jdbc.Driver"

        
private 
static String url = 
"jdbc:mysql://192.168.104.101:3306/testdb?useUnicode=true&characterEncoding=utf8"; 
        private static String user = "root"
        private static String password = "leizhimin"
        public static Connection makeConnection() { 
                Connection conn = null
                try { 
                        Class.forName(dirverClassName); 
                } catch (ClassNotFoundException e) { 
                        e.printStackTrace(); 
                } 
                try { 
                        conn = DriverManager.getConnection(url, user, password); 
                } catch (SQLException e) { 
                        e.printStackTrace(); 
                } 
                return conn; 
        } 
}
 
3、实体Bean
package stu.lavasoft.dbutils; 


/** 
* 实体Bean 
* @author leizhimin 2009-11-6 16:05:41 
*/
 

public 
class User { 

        
private 
int id; 

        
private String name; 

        
private String pswd; 


        
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 String getPswd() { 

                
return pswd; 

        } 


        
public 
void setPswd(String pswd) { 

                
this.pswd = pswd; 

        } 


        @Override 

        
public String toString() { 

                
return 
"User{" + 

                                
"id=" + id + 

                                
", name='" + name + '\'' + 

                                
", pswd='" + pswd + '\'' + 

                                '}'; 

        } 

}
 
4、测试类
package stu.lavasoft.dbutils; 


import org.apache.commons.dbutils.DbUtils; 

import org.apache.commons.dbutils.QueryRunner; 

import org.apache.commons.dbutils.handlers.BeanListHandler; 


import java.sql.Connection; 

import java.sql.SQLException; 

import java.util.List; 


/** 
* DbUtils入门 
* @author leizhimin 2009-11-6 14:47:26 
*/
 

public 
class Test1 { 

        
public 
static 
void main(String[] args) 
throws SQLException { 

                test_insert(); 

                test_find(); 

        } 


        
public 
static 
void test_insert() 
throws SQLException { 

                System.out.println(
"-------------test_insert()-------------"); 

                
//创建连接 

                Connection conn = ConnTools.makeConnection(); 

                
//创建SQL执行工具 

                QueryRunner qRunner = 
new QueryRunner(); 

                
//执行SQL插入 

                
int n = qRunner.update(conn, 
"insert into user(name,pswd) values('iii','iii')"); 

                System.out.println(
"成功插入" + n + 
"条数据!"); 

                
//关闭数据库连接 

                DbUtils.closeQuietly(conn); 

        } 


        
public 
static 
void test_find() 
throws SQLException { 

                System.out.println(
"-------------test_find()-------------"); 

                
//创建连接 

                Connection conn = ConnTools.makeConnection(); 

                
//创建SQL执行工具 

                QueryRunner qRunner = 
new QueryRunner(); 

                
//执行SQL查询,并获取结果 

                List<User> list = (List<User>) qRunner.query(conn, 
"select id,name,pswd from user"
new BeanListHandler(User.
class)); 

                
//输出查询结果 

                
for (User user : list) { 

                        System.out.println(user); 

                } 

                
//关闭数据库连接 

                DbUtils.closeQuietly(conn); 

        } 

}
 
执行结果:
-------------test_insert()------------- 

成功插入1条数据! 

-------------test_find()------------- 

User{id=4, name='bbb', pswd='bbb'} 

User{id=3, name='aaa', pswd='bbb'} 

User{id=5, name='iii', pswd='iii'} 

User{id=6, name='iii', pswd='iii'} 


Process finished with exit code 0
 
呵呵。相比JDBC,的确方便多了。
本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/222771,如需转载请自行联系原作者
你可能感兴趣的文章
linux下输入密码不回显
查看>>
《构建之法》读书笔记
查看>>
拿下阿里、头条、滴滴的offer后谈谈面试经验---动身前看一看
查看>>
android开发(49) android 使用 CollapsingToolbarLayout ,可折叠的顶部导航栏
查看>>
【ERP】如何在多行数据块中实现仅能勾选唯一的主联系人
查看>>
Oracle 数据库优化的R方法(Method R)
查看>>
CentOS最小化安装系统开启网卡
查看>>
互联网+升级到智能+ 开启万物智联新时代
查看>>
Nginx + Tomcat (java )服务器部署
查看>>
Linux文本编辑器之Nano
查看>>
VC无闪烁刷屏技术的实现【转】
查看>>
【原】IOS中KVO模式的解析与应用
查看>>
EntityFramework Core迁移时出现数据库已存在对象问题解决方案
查看>>
urb传输的代码分析【转】
查看>>
理解 QEMU/KVM 和 Ceph(3):存储卷挂接和设备名称
查看>>
一道算法题的一种O(n)解法
查看>>
ABP理论学习之NHibernate集成
查看>>
反射之动态创建对象
查看>>
隐马尔可夫模型学习小记——forward算法+viterbi算法+forward-backward算法(Baum-welch算法)...
查看>>
[MFC] CList
查看>>