简单的说DBUtils就是一个工具,一个操控数据库的组件,学过JDBC的应该都知道在对数据操控的时候代码量好大,还得注意各种双引号,一不小心就错了。DBUtils就是对JDBC的一个简单封装,目的就是简化代码量。
一般DBUtils的使用只涉及了一个QueryRunner类和它的两个方法和】,ResultSetHandler接口和它的两个实现类。
- QueryRunner
- query():提供执行查询的操作
- update():提供执行插入、更新、删除的操作
- ResultSetHandler
- BeanHandler
- BeanListHandler
先介绍下项目结构:
数据库名称:_11_20_test_java
表名:test
使用连接池:阿里巴巴的druid连接池
下面是表创建好后的内容:


数据库和连接池的创建就直接跳过了
先创建好一个类JdbcUtil用于获取数据库的连接
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JdbcUtil {
// 创建数据源对象
private static DataSource dataSource;
static {
// 新建一个配置文件对象
Properties properties = new Properties();
// 通过类加载器找到文件路径,读配置文件
InputStream inputStream = JdbcUtil.class.getResourceAsStream("druid/druid.properties");
// 加载属性文件
try {
properties.load(inputStream);
// 创建连接池对象
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* 从连接池中获取连接
* */
public static Connection getConnect(){
Connection con = null;
try {
con = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
public static DataSource getDataSource() {
return dataSource;
}
public static void setDataSource(DataSource dataSource) {
JdbcUtil.dataSource = dataSource;
}
/*
* 关闭资源
* */
public static void close(Connection connection, Statement statement, ResultSet resultSet){
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
因为ResultSetHandler接口是用于处理结果集的,等下通过QueryRunner查询数据时要用到,所以先记录ResultSetHandler的用法。
ResultSetHandler接口的使用
第一步:先创建一个类BaseDao,在这个类里面实现一个普通的通用的查询方法(等下也可以和RueryRunner类的查询方法对比下,看看哪个更简便)
import org.apache.commons.dbutils.ResultSetHandler;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/*
*
* 在该类中编写普通通用的增删改查方法
* */
public class BaseDao {
// 编写一个通用的查询方法
public static Object query(String sql, ResultSetHandler<?> rsh, Object... params) throws SQLException {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
// 获得连接
connection = JdbcUtil.getConnect();
// 预编译
preparedStatement = connection.prepareStatement(sql);
// 设置参数
for (int i = 0; params != null && i < params.length; i++) {
preparedStatement.setObject(i + 1, params[i]);
}
// 执行查询
resultSet = preparedStatement.executeQuery();
// 让调用者去实现对结果集的处理
Object obj = rsh.handle(resultSet);
return obj;
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
JdbcUtil.close(connection, preparedStatement, resultSet);
}
return resultSet;
}
}
第二步:创建一个实体类User,里面的对象对应的是数据表中的属性
public class User {
int id;
String name;
String password;
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 getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
第三步:ok现在就能创建两个自定义类用于演示BeanHandler和BeanListHandler两个类对结果集的处理
ResultSetTest类
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import javax.jws.soap.SOAPBinding;
import java.sql.SQLException;
/*
*
* 用于演示BeanHandle类对结果集的处理
* */
public class ResultSetTest {
public static void testBeanHandler() throws SQLException{
BaseDao baseDao = new BaseDao();
String sql = "select * from test where id=?";
User user = (User) baseDao.query(sql,new BeanHandler<Object>(User.class),3);
System.out.println("id为1的User对象的名字是"+user.getName());
}
}
ResultsetTest类
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.SQLException;
import java.util.ArrayList;
/*
*
* 演示BeanListHandler类对结果集的处理
* */
public class ResultSetListTest {
public static void testBeanListHandler() throws SQLException{
BaseDao baseDao = new BaseDao();
String sql = "select * from test";
ArrayList<User> arrayList = (ArrayList<User>) baseDao.query(sql,new BeanListHandler<Object>(User.class));
for(int i=0;i<arrayList.size();i++){
System.out.println("第"+(i+1)+"条的数据的名字为:"+arrayList.get(i).getName());
}
}
}
现在就可以在一个主类里面测试下效果了
未完待续。。。。。