A comprehensive Java utility library providing static method wrappers for common operations to reduce API learning costs and improve development efficiency
—
Database utilities through DbUtil and Db classes, providing JDBC wrapper with ActiveRecord pattern, connection management, and SQL execution utilities.
import cn.hutool.db.DbUtil;
import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import cn.hutool.db.sql.SqlBuilder;// Create database instance
public static Db use(); // Uses default datasource
public static Db use(String group); // Uses named datasource
public static Db use(DataSource ds); // Uses specific datasource
// Connection management
public static Connection getConnection();
public static Connection getConnection(String group);
public static void close(Connection conn);// Insert operations
public static int insert(String tableName, Entity entity);
public static Long insertForGeneratedKey(String tableName, Entity entity);
// Query operations
public static List<Entity> findAll(String tableName);
public static Entity findById(String tableName, Object id);
public static List<Entity> findBy(String tableName, String field, Object value);
// Update operations
public static int update(String tableName, Entity entity, String wherePart);
public static int updateById(String tableName, Entity entity, Object id);
// Delete operations
public static int delete(String tableName, String wherePart);
public static int deleteById(String tableName, Object id);Usage Examples:
// Insert new record
Entity user = Entity.create()
.set("name", "John Doe")
.set("email", "john@example.com")
.set("age", 30);
Long userId = DbUtil.insertForGeneratedKey("users", user);
// Query records
List<Entity> allUsers = DbUtil.findAll("users");
Entity johnUser = DbUtil.findById("users", userId);
List<Entity> adults = DbUtil.findBy("users", "age >= ?", 18);
// Update record
Entity updates = Entity.create().set("age", 31);
DbUtil.updateById("users", updates, userId);
// Delete record
DbUtil.deleteById("users", userId);public class Entity extends LinkedHashMap<String, Object> {
// Creation
public static Entity create();
public static Entity create(String tableName);
// Value operations
public Entity set(String key, Object value);
public Entity setIgnoreNull(String key, Object value);
// Type-safe getters
public <T> T get(String key, Class<T> type);
public String getStr(String key);
public Integer getInt(String key);
public Long getLong(String key);
public Double getDouble(String key);
public Boolean getBool(String key);
public Date getDate(String key);
// Table operations
public String getTableName();
public Entity setTableName(String tableName);
// Conversion
public <T> T toBean(Class<T> beanClass);
public Map<String, Object> toMap();
}// Execute queries
public static List<Entity> query(String sql, Object... params);
public static Entity queryOne(String sql, Object... params);
public static <T> T queryValue(String sql, Object... params);
// Execute updates
public static int execute(String sql, Object... params);
public static int[] executeBatch(String sql, Object[]... paramsBatch);
// Call procedures
public static Object call(String sql, Object... params);// Transaction operations
public static void tx(Runnable runnable);
public static <T> T tx(Supplier<T> supplier);
public static <T> T tx(Func0<T> func);
// Manual transaction control
public static void beginTransaction();
public static void commit();
public static void rollback();Usage Examples:
// Raw SQL queries
List<Entity> activeUsers = DbUtil.query(
"SELECT * FROM users WHERE active = ? AND created_date > ?",
true, DateUtil.parse("2023-01-01")
);
String userName = DbUtil.queryValue(
"SELECT name FROM users WHERE id = ?",
userId);
// Batch operations
String insertSql = "INSERT INTO logs (message, level, timestamp) VALUES (?, ?, ?)";
Object[][] batchParams = {
{"Error occurred", "ERROR", new Date()},
{"User login", "INFO", new Date()},
{"Debug info", "DEBUG", new Date()}
};
int[] results = DbUtil.executeBatch(insertSql, batchParams);
// Transactions
DbUtil.tx(() -> {
// Multiple database operations in transaction
DbUtil.insert("orders", order);
DbUtil.update("inventory", inventoryUpdate, "product_id = ?", productId);
DbUtil.insert("order_items", orderItem);
});
// Transaction with return value
Long orderId = DbUtil.tx(() -> {
Entity order = Entity.create()
.set("customer_id", customerId)
.set("total", orderTotal);
return DbUtil.insertForGeneratedKey("orders", order);
});public class SqlBuilder {
// Creation
public static SqlBuilder create();
// SELECT operations
public SqlBuilder select(String... fields);
public SqlBuilder from(String table);
public SqlBuilder where(String condition);
public SqlBuilder and(String condition);
public SqlBuilder or(String condition);
// JOIN operations
public SqlBuilder join(String table, String condition);
public SqlBuilder leftJoin(String table, String condition);
public SqlBuilder rightJoin(String table, String condition);
// ORDER and GROUP
public SqlBuilder orderBy(String field, boolean isAsc);
public SqlBuilder groupBy(String... fields);
public SqlBuilder having(String condition);
// LIMIT and OFFSET
public SqlBuilder limit(int limit);
public SqlBuilder offset(int offset);
// Build SQL
public String build();
public String toString();
}Usage Examples:
// Build complex SELECT query
String sql = SqlBuilder.create()
.select("u.name", "u.email", "p.title")
.from("users u")
.leftJoin("profiles p", "u.id = p.user_id")
.where("u.active = ?")
.and("u.created_date > ?")
.orderBy("u.name", true)
.limit(10)
.build();
List<Entity> results = DbUtil.query(sql, true, DateUtil.parse("2023-01-01"));// Get table information
public static List<String> getTables();
public static List<String> getTables(String schema);
// Get column information
public static List<String> getColumns(String tableName);
public static Map<String, String> getColumnTypes(String tableName);
// Database metadata
public static String getDatabaseProductName();
public static String getDatabaseProductVersion();
public static String getDriverName();// Configure datasources
public static void setDataSource(DataSource ds);
public static void setDataSource(String group, DataSource ds);
// Get datasource
public static DataSource getDataSource();
public static DataSource getDataSource(String group);Usage Examples:
// Configure HikariCP datasource
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
config.setUsername("user");
config.setPassword("password");
config.setMaximumPoolSize(10);
HikariDataSource ds = new HikariDataSource(config);
DbUtil.setDataSource(ds);
// Use multiple datasources
DbUtil.setDataSource("primary", primaryDs);
DbUtil.setDataSource("secondary", secondaryDs);
Db primaryDb = DbUtil.use("primary");
Db secondaryDb = DbUtil.use("secondary");public class Db {
// Query operations
public List<Entity> findAll(String tableName);
public Entity findById(String tableName, Object id);
public List<Entity> query(String sql, Object... params);
public Entity queryOne(String sql, Object... params);
// Insert operations
public int insert(String tableName, Entity entity);
public Long insertForGeneratedKey(String tableName, Entity entity);
// Update operations
public int update(String tableName, Entity entity, String wherePart);
public int updateById(String tableName, Entity entity, Object id);
// Delete operations
public int delete(String tableName, String wherePart);
public int deleteById(String tableName, Object id);
// Execute operations
public int execute(String sql, Object... params);
// Transaction operations
public void tx(Runnable runnable);
public <T> T tx(Supplier<T> supplier);
}Usage Examples:
// Instance usage
Db db = DbUtil.use();
// Fluent operations
List<Entity> users = db.query("SELECT * FROM users WHERE active = ?", true);
Entity user = db.queryOne("SELECT * FROM users WHERE email = ?", "john@example.com");
// Transaction with instance
db.tx(() -> {
Entity order = Entity.create()
.set("customer_id", customerId)
.set("status", "pending");
Long orderId = db.insertForGeneratedKey("orders", order);
Entity item = Entity.create()
.set("order_id", orderId)
.set("product_id", productId)
.set("quantity", 2);
db.insert("order_items", item);
});Database operations throw DbRuntimeException for SQL errors, with proper exception chaining and detailed error messages.
// Connection validation
public static boolean isValidConnection(Connection conn);
// Close resources safely
public static void close(ResultSet rs, Statement stmt, Connection conn);
public static void closeQuietly(AutoCloseable... closeables);The database utilities provide a simple yet powerful abstraction over JDBC, supporting both simple operations and complex queries while maintaining type safety and proper resource management.
Install with Tessl CLI
npx tessl i tessl/maven-cn-hutool--hutool-all