简单的sql数据查询与执行,比JdbcTemplate轻量级。
官网:https://commons.apache.org/proper/commons-dbutils/
<!-- https://mvnrepository.com/artifact/commons-dbutils/commons-dbutils -->
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.8.1</version>
</dependency>简单使用(基于quarkus)
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.List;
import javax.sql.DataSource;
import cn.vt.exception.CommonException;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
@ApplicationScoped
@Slf4j
public class SqlServiceImpl {
@Inject
DataSource dataSource;
private final QueryRunner runner = new QueryRunner();
public <T> T queryForObject(String sql, Class<T> clazz, final Object... params) {
try (Connection conn = dataSource.getConnection()) {
return runner.query(conn, sql, new BeanHandler<T>(clazz), params);
} catch (Exception e) {
log.error("error when queryForObject", e);
}
return null;
}
/**
* queryForList.
*
* @param sql sql字段需要as成和对象(T)属性一样。
* @param clazz clazz
* @param params params
* @param <T> T
* @return List(T)
*/
public <T> List<T> queryForList(String sql, Class<T> clazz, final Object... params) {
try (Connection conn = dataSource.getConnection()) {
return runner.query(conn, sql, new BeanListHandler<T>(clazz), params);
} catch (Exception e) {
log.error("error when queryForList", e);
throw new CommonException(e);
}
}
public int[] batchUpdate(String sql, List<Object[]> batchArgs) {
try (Connection conn = dataSource.getConnection()) {
return runner.batch(conn, sql, batchArgs.toArray(new Object[0][]));
} catch (Exception e) {
log.error("error when batchUpdate", e);
}
return new int[0];
}
public void execute(String sql) {
try (Connection conn = dataSource.getConnection()) {
runner.execute(conn, sql);
} catch (Exception e) {
log.error("error when execute", e);
}
}
}测试代码
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.h2.jdbcx.JdbcDataSource;
import org.hamcrest.CoreMatchers;
import org.hamcrest.MatcherAssert;
import org.junit.jupiter.api.Test;
/**
* Tests for {@link SqlServiceImpl}.
*
* @since 2025-10-22
*/
@Slf4j
public class SqlServiceImplTest {
@Test
public void queryForList() {
String jdbcUrl = "jdbc:h2:mem:db-test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=PostgreSQL";
SqlServiceImpl sqlService = new SqlServiceImpl();
JdbcDataSource dataSource = new JdbcDataSource();
dataSource.setUrl(jdbcUrl);
dataSource.setUser("sa");
sqlService.dataSource = dataSource;
String sqlForCreateTable = """
CREATE TABLE tbl_abc (
id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
code varchar(16) NOT NULL,
status varchar(32) NOT NULL,
create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
""";
sqlService.execute(sqlForCreateTable);
sqlService.execute("insert into tbl_abc (code, status) values('123456', 'NORMAL')");
AbcPO abcPO = sqlService.queryForObject("select * from tbl_abc limit 1", AbcPO.class);
log.info("abcPO={}", abcPO);
AbcEnumPO abcEnumPO = sqlService.queryForObject("select * from tbl_abc limit 1", AbcEnumPO.class);
log.info("abcEnumPO={}", abcEnumPO);
String exMsg = null;
try {
List<AbcEnumPO> list = sqlService.queryForList("select t.id, t.code, t.status, t.create_time as createTime from tbl_abc t limit 1", AbcEnumPO.class);
log.info("list={}", list);
} catch (Exception e) {
exMsg = e.getMessage();
}
MatcherAssert.assertThat(exMsg, CoreMatchers.containsString("Cannot set createTime: incompatible types, cannot convert java.sql.Timestamp to java.time.LocalDateTime"));
}
}问题
- 可以自动处理 varchar 到 java Enum的情况。
- 不能自动处理 timestamp 到 java.time.LocalDateTime的情况。此时可以手工转换,也可以使用jdbi3(可以在本站搜索“jdbi3”)。
作者:张三 创建时间:2025-10-23 10:40
最后编辑:张三 更新时间:2025-10-23 11:13
最后编辑:张三 更新时间:2025-10-23 11:13