amw1933 |
2009-11-10 10:26 |
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包装类。 三、环境 Java5commons-dbutils-1.2-bin.zipmysql-noinstall-5.1.40-win32.zipmysql-connector-java-5.1.10.zip 下载地址:http://apache.freelamp.com/commons/dbutils/binaries/commons-dbutils-1.2-bin.ziphttp://gd.tuwien.ac.at/db/mysql/Downloads/MySQL-5.1/mysql-noinstall-5.1.40-win32.ziphttp://gd.tuwien.ac.at/db/mysql/Downloads/Connector-J/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、实体Beanpackage 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 |
|