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();
        }


    }

}

  

测试效果

原文地址:https://www.cnblogs.com/lyd447113735/p/11920821.html