【JDBC学习总结】8.Apache-Commons-DBUtils介绍

一、DBUtils简介

DBUtils是个小巧的JDBC轻量级封装的工具包,其最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,这就为我们做了最枯燥乏味、最容易出错的一大部分工作。

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包装类。

二、快速开始

新建一个User Bean类,对应数据库的列名
package com.jazz.test.dbcp2_test;

public class User {
	private String name;
	private String password;
	private String phone;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	//..其他getXXX和setXXX已省略
	
}



查询:
package com.jazz.test.dbcp2_test;

import java.sql.*;

import org.apache.commons.dbutils.*;
import org.apache.commons.dbutils.handlers.BeanHandler;

public class TestDBU {
	public static void main(String[] args) throws Exception{
		Class.forName("com.mysql.jdbc.Driver");
		Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf-8", "root", "123456");
		QueryRunner qr=new QueryRunner();
		User u=qr.query(conn, "select * from user", new BeanHandler<User>(User.class));
		System.out.print(u.getName());
		
		conn.close();
		
	}

}


三、增删改查

待更新

四、注意点

1、DBUtils是JDBC的简单封装,可以和JDBC混合使用。
 
2、DBUtils对结果集自动封装为JavaBean是有着苛刻要求的:必须满足JavaBean的规范,其次Bean的getter与setter方法的名字与结果集的列名一一对应,而不要求JavaBean的私有成员与表结果集列名一一对应。
比如:
person表中有个字段叫:address,那么对应的JavaBean的Person类中必须有getAddress和setAddress两个方法,而Person类中可以将address属性命名为add,这是没问题的。
 
3、DBUtils可以将结果集封装为各种类型,主要有:Bean/List<Bean>,Map/List<Map>/Map<Map>,数组/List<数组>,列/List<列>,这些类型。
对于Map<Map>的类型使用KeyedHandler作为结果集处理器,内层的Map是“列名-值"对,外层的Map是“主键-内层Map的引用”,但此处的主键不一定就是数据库的主键,可以随意指定,比如:
ResultSetHandler h = new KeyedHandler("id"); 
Map found = (Map) queryRunner.query("select id, name, age from person", h); 
Map jane = (Map) found.get(new Long(1)); // jane's id is 1 
String janesName = (String) jane.get("name"); 
Integer janesAge = (Integer) jane.get("age");
 
4、DBUtils执行插入操作的时候,无法返回自增主键,这是一个很严重的问题,当然不能怪DBUtils,可以通过变通的方法来实现,比如在MySQL中,执行完了一个插入SQL后,接着执行SELECT LAST_INSERT_ID()语句,就可以获取到自增主键。
 
5、DBUtils的性能和JDBC性能是一样,测试过程中没发现性能损失,拥有了很高性能的同时,而不失JDBC的灵活性。
 
6、对于JavaBean的成员类型定义,有一条原则那就是:尽可能使用包装类型,而不要使用基本类型。很多人不理解为什么,包括我见到一些傻B(,我提出让改为包装类型,他还信誓旦旦的说他的代码多牛多叼),都干好多年了,这个简单的道理还不知道:
        //错误
        int a1 = (Integer) null;
        boolean x1 = (Boolean)null;
        //正确
        Integer a2 = (Integer) null;
        Boolean x2 = (Boolean)null;
 
实际上就是为了保证在查询结果为null的时候,也不会因为给基本类型赋null值而发生错误。

你可能感兴趣的:(【JDBC学习总结】8.Apache-Commons-DBUtils介绍)