简单的说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());
        }
    }
}
现在就可以在一个主类里面测试下效果了
未完待续。。。。。