DBUtils工具的使用

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-05 10:04:13

  

  简单的说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());
        }


    }



}

  

现在就可以在一个主类里面测试下效果了

 

 

未完待续。。。。。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!