DBUtils的简单使用

DBUtils的简单使用

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

简介

Commons DbUtils 是 Apache 组织提供的一个对 JDBC 进行简单封装的开源工具类库,使用它能够简化 JDBC 应用程序的开发,同时也不会影响程序的性能。

特征

DBUtils 是 Java 编程中的数据库操作实用工具,小巧简单实用。

1、对于数据表的读操作,他可以把结果转换成 List,Array,Set 等 Java 集合,便于程序员操作。

2、对于数据表的写操作,也变得很简单(只需写 sql 语句)。

3、可以使用数据源,使用 JNDI,数据库连接池等技术来优化性能--重用已经构建好的数据库连接对象,而不像 php,asp 那样,费时费力的不断重复的构建和析构这样的对象。

使用

包功能介绍

DBUtils 包括3个包:

org.apache.commons.dbutils
org.apache.commons.dbutils.handlers
org.apache.commons.dbutils.wrappers

对应功能介绍如下:

  • org.apache.commons.dbutils
DbUtils:关闭链接等操作。
QueryRunner:进行查询的操作。
  • org.apache.commons.dbutils.handlers
ArrayHandler:将 ResultSet 中第一行的数据转化成对象数组。
ArrayListHandler:将 ResultSet 中所有的数据转化成 List,List 中存放的是 Object[]。
BeanHandler:将 ResultSet 中第一行的数据转化成类对象。
BeanListHandler:将 ResultSet 中所有的数据转化成 List,List 中存放的是类对象。
ColumnListHandler:将 ResultSet 中某一列的数据存成 List,List 中存放的是 Object 对象。
KeyedHandler:将 ResultSet 中存成映射,key 为某一列对应为 Map。Map 中存放的是数据。
MapHandler:将 ResultSet 中第一行的数据存成 Map 映射。
MapListHandler:将 ResultSet 中所有的数据存成 List,List 中存放的是 Map。
ScalarHandler:将 ResultSet 中一条记录的其中某一列的数据存成 Object 。
  • org.apache.commons.dbutils.wrappers
SqlNullCheckedResultSet :对 ResultSet 进行操作,改版里面的值。
StringTrimmedResultSet :去除 ResultSet 中中字段的左右空格。

主要方法

DbUtils 类:启动类。
ResultSetHandler 接口:转换类型接口。
MapListHandler 类:实现类,把记录转化成 List。
BeanListHandler 类:实现类,把记录转化成 List,使记录为 JavaBean 类型的对象。
QueryRunner 类:执行 SQL 语句的类。

以上内容参考自百度百科。

示例

创建如下 POJO 用于测试:

public class User {
    public User() {
    }
    public User(Integer id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    private Integer id;
    private String password;
    private String username;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return String.format("id=%d,username=%s", this.id, this.username);
    }
}

查询所有

try {
    DataSource ds = new ComboPooledDataSource("mysql");
    QueryRunner qr = new QueryRunner(ds);
    List<User> userList = qr.query("select * from user", new ResultSetHandler<List<User>>() {
        @Override
        public List<User> handle(ResultSet resultSet) throws SQLException {
            List<User> users = new ArrayList<>();
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String username = resultSet.getString("username");
                String password = resultSet.getString("password");
                users.add(new User(id, username, password));
            }
            return users;
        }
    });
    System.out.println(userList);
    // [id=1,username=张三, id=2,username=李四]
} catch (Exception e) {
    e.printStackTrace();
}

根据 Id 查询

try {
    Integer id = 1;
    DataSource ds = new ComboPooledDataSource("mysql");
    QueryRunner qr = new QueryRunner(ds);
    User user = qr.query("select * from user where id=?", new ResultSetHandler<User>() {
        @Override
        public User handle(ResultSet resultSet) throws SQLException {
            if (resultSet.next()) {
                int id = resultSet.getInt("id");
                String username = resultSet.getString("username");
                String password = resultSet.getString("password");
                return new User(id, username, password);
            }
            return null;
        }
    }, id);
    System.out.println(user);
    // id=1,username=张三
} catch (Exception e) {
    e.printStackTrace();
}

新增

Integer id = 1;
DataSource ds = new ComboPooledDataSource("mysql");
QueryRunner qr = new QueryRunner(ds);
try {
    int count = qr.update("insert into user (username,password) values(?,?)", "王五", "1226");
    System.out.println(count > 0 ? "success" : "failed");
} catch (SQLException e) {
    e.printStackTrace();
}

更新

DataSource ds = new ComboPooledDataSource("mysql");
QueryRunner qr = new QueryRunner(ds);
try {
    int count = qr.update("update user set username=? where id=?", "赵六", 3);
    System.out.println(count > 0 ? "success" : "failed");
} catch (SQLException e) {
    e.printStackTrace();
}

删除

DataSource ds = new ComboPooledDataSource("mysql");
QueryRunner qr = new QueryRunner(ds);
try {
    int count = qr.update("delete from user where id=?", 3);
    System.out.println(count > 0 ? "success" : "failed");
} catch (SQLException e) {
    e.printStackTrace();
}

结果集处理器

为简易我们的使用,DBUtils 提供了一些内置的结果集处理器,使用如下:

BeanHandler

try {
    Integer id = 1;
    DataSource ds = new ComboPooledDataSource("mysql");
    QueryRunner qr = new QueryRunner(ds);
    User user = qr.query("select * from user where id=?", new BeanHandler<>(User.class), id);
    System.out.println(user);
} catch (Exception e) {
    e.printStackTrace();
}

BeanListHandler

try {
    DataSource ds = new ComboPooledDataSource("mysql");
    QueryRunner qr = new QueryRunner(ds);
    List<User> userList = qr.query("select * from user", new BeanListHandler<>(User.class));
    System.out.println(userList);
} catch (Exception e) {
    e.printStackTrace();
}

MapHandler

try {
    DataSource ds = new ComboPooledDataSource("mysql");
    QueryRunner qr = new QueryRunner(ds);
    Map<String, Object> user = qr.query("select * from user where id=?", new MapHandler(), 2);
    System.out.println(user); // {password=1226, id=2, username=李四}
} catch (Exception e) {
    e.printStackTrace();
}

MapListHandler

try {
        DataSource ds = new ComboPooledDataSource("mysql");
        QueryRunner qr = new QueryRunner(ds);
        List<Map<String, Object>> users = qr.query("select * from user", new MapListHandler());
        System.out.println(users); // [{password=1226, id=1, username=张三}, {password=1226, id=2, username=李四}]
    } catch (Exception e) {
        e.printStackTrace();
    }


扩展

自己实现一个 QueryRunner

1、新建结果处理接口:

// com.zze.util.ResultHandler
import java.sql.ResultSet;

public interface ResultHandler<T> {
    T handle(ResultSet resultSet);
}

2、新建 MyQueryRunner 类:

// com.zze.util.MyQueryRunner
import javax.sql.DataSource;
import javax.xml.crypto.Data;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class MyQueryRunner {
    public MyQueryRunner(DataSource dataSource){
        this.dataSource = dataSource;
    }
    private DataSource dataSource;

    public int update(String sql, Object... args) {
        try {
            Connection conn = dataSource.getConnection();
            PreparedStatement preparedStatement = conn.prepareStatement(sql);
            int parameterCount = preparedStatement.getParameterMetaData().getParameterCount();
            for (int i = 0; i < parameterCount; i++) {
                preparedStatement.setObject(i + 1, args[i]);
            }
            return preparedStatement.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    public <T> T query(String sql, ResultHandler<T> handler, Object... args) {
        try {
            Connection conn = dataSource.getConnection();
            PreparedStatement preparedStatement = conn.prepareStatement(sql);
            int parameterCount = preparedStatement.getParameterMetaData().getParameterCount();
            for (int i = 0; i < parameterCount; i++) {
                preparedStatement.setObject(i + 1, args[i]);
            }
            ResultSet resultSet = preparedStatement.executeQuery();
            T result = handler.handle(resultSet);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

3、测试:

import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.zze.bean.User;
import com.zze.util.MyQueryRunner;
import com.zze.util.ResultHandler;
import org.junit.Test;

import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 自定义的 DBUtils 测试
 */
public class MyDBUtilsTest {
    /**
     * 查询所有
     */
    @Test
    public void listAllTest() {
        DataSource ds = new ComboPooledDataSource("mysql");
        MyQueryRunner myQueryRunner = new MyQueryRunner(ds);
        List<User> userList = myQueryRunner.query("select * from user", new ResultHandler<List<User>>() {
            @Override
            public List<User> handle(ResultSet resultSet) {
                try {
                    List<User> users = new ArrayList<>();
                    while (resultSet.next()) {
                        int id = resultSet.getInt("id");
                        String username = resultSet.getString("username");
                        String password = resultSet.getString("password");
                        users.add(new User(id, username, password));
                    }
                    return users;
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }
        });
        System.out.println(userList);
    }

    @Test
    public void getByIdTest() {
        DataSource ds = new ComboPooledDataSource("mysql");
        MyQueryRunner myQueryRunner = new MyQueryRunner(ds);
        int id = 1;
        User user = myQueryRunner.query("select * from user where id=?", new ResultHandler<User>() {
            @Override
            public User handle(ResultSet resultSet) {
                try {
                    if (resultSet.next()) {
                        int id = resultSet.getInt("id");
                        String username = resultSet.getString("username");
                        String password = resultSet.getString("password");
                        return new User(id, username, password);
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                return null;
            }
        }, id);
        System.out.println(user);
    }

    /**
     * 新增
     */
    @Test
    public void testAdd() {
        Integer id = 1;
        DataSource ds = new ComboPooledDataSource("mysql");
        MyQueryRunner qr = new MyQueryRunner(ds);
        try {
            int count = qr.update("insert into user (username,password) values(?,?)", "王五", "1226");
            System.out.println(count > 0 ? "success" : "failed");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 更新
     */
    @Test
    public void testUpdate() {
        DataSource ds = new ComboPooledDataSource("mysql");
        MyQueryRunner qr = new MyQueryRunner(ds);
        try {
            int count = qr.update("update user set username=? where id=?", "赵六", 7);
            System.out.println(count > 0 ? "success" : "failed");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除
     */
    @Test
    public void testDelete() {
        DataSource ds = new ComboPooledDataSource("mysql");
        MyQueryRunner qr = new MyQueryRunner(ds);
        try {
            int count = qr.update("delete from user where id=?", 6);
            System.out.println(count > 0 ? "success" : "failed");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/java-dbutils.html

Buy me a cup of coffee ☕.