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


数据库和连接池的创建就直接跳过了
第一步是导入DBUtil工具的jar包“commons-dbutils-1.7.jar”,这个可以直接在apache官网下载
然后创建好一个类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());
}
}
}
现在就可以在一个主类里面测试下效果了

ResultSetHandler接口的使用没有问题的话就可以通过使用QuerryRunner类来实现增删改查了
第一步:创建一个DBUtilsDao类,实现增删改查四个方法
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.sun.org.apache.xpath.internal.operations.Bool;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.List;
/*
* 在这个类中实现增删改查四个方法
*
* */
public class DBUtilsDao {
//实现查询方法,返回List集合
public List findAll() throws SQLException {
// 创建QueryRunner对象
QueryRunner queryRunner = new QueryRunner(JdbcUtil.getDataSource());
// 定义sql语句
String sql = "select * from test";
List list = (List) queryRunner.query(sql,new BeanListHandler(User.class));
return list;
}
//实现添加方法
public boolean insert(User user) throws SQLException {
QueryRunner queryRunner = new QueryRunner(JdbcUtil.getDataSource());
String sql = "insert into test(name,password) values(?,?)";
// 用一个数组临时存放要添加进数据库中的数据
Object obj[] = {user.getName(),user.getPassword()};
int num = queryRunner.update(sql,obj);
// 如果添加成功返回true,添加失败返回false;
if(num>0){
return true;
}
return false;
}
//实现修改方法
public boolean update(User user) throws SQLException {
QueryRunner queryRunner = new QueryRunner(JdbcUtil.getDataSource());
String sql = "update test set name=?,password=? where id=?";
Object obj[] = {user.getName(),user.getPassword(),user.getId()};
int num = queryRunner.update(sql,obj);
if(num>0){
return true;
}
return false;
}
//实现删除的方法
public boolean delete(int id) throws SQLException {
QueryRunner queryRunner = new QueryRunner(JdbcUtil.getDataSource());
String sql = "delete from test where id=?";
int num = queryRunner.update(sql,id);
if(num>0){
return true;
}
return false;
}
}
第二步:测试DBUtilsDao类中的四个方法
import javax.swing.text.html.HTMLDocument;
import java.awt.*;
import java.sql.Array;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
public class Maiin {
public static void main(String[] args) {
// 插入内容----------------
System.out.println("插入内容----------------");
DBUtilsDao dbUtilsDao = new DBUtilsDao();
User user = new User();
user.setName("yyy");
user.setPassword("99999");
try {
boolean flag = dbUtilsDao.insert(user);
if(flag)
System.out.println("插入内容成功");
} catch (SQLException e) {
e.printStackTrace();
}
// 修改内容
System.out.println("修改内容----------------");
DBUtilsDao dbUtilsDao1 = new DBUtilsDao();
User user1 = new User();
user1.setName("qqq");
user1.setPassword("1111");
user1.setId(1);
try {
boolean flag = dbUtilsDao1.update(user1);
if (flag)
System.out.println("修改内容成功");
} catch (SQLException e) {
e.printStackTrace();
}
// 删除内容
System.out.println("删除内容----------------");
DBUtilsDao dbUtilsDao2 = new DBUtilsDao();
try {
boolean flag = dbUtilsDao2.delete(2);
if (flag)
System.out.println("删除内容成功");
} catch (SQLException e) {
e.printStackTrace();
}
// 查询内容
System.out.println("查询内容----------------");
DBUtilsDao dbUtilsDao3 = new DBUtilsDao();
try {
ArrayList list = (ArrayList) dbUtilsDao3.findAll();
Iterator iterator = list.iterator();
while (iterator.hasNext()){
User u = (User) iterator.next();
System.out.println("id:"+u.getId()+",姓名:"+u.getName()+"密码:"+u.getPassword());
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
测试效果


浙公网安备 33010602011771号