简介
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();
}
}
}
评论区