MyBatis-Flex is an elegant enhancement framework for MyBatis providing type-safe query building, active record patterns, and comprehensive ORM capabilities
npx @tessl/cli install tessl/maven-com-mybatis-flex--mybatis-flex-core@1.10.0MyBatis-Flex is an elegant enhancement framework for MyBatis that provides type-safe query building, active record patterns, and comprehensive ORM capabilities. It supports 40+ database types and offers multiple programming paradigms including Repository pattern, Active Record, and Service Layer abstractions.
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-core</artifactId>
<version>1.10.8</version>
</dependency>import com.mybatisflex.core.MybatisFlexBootstrap;
import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.activerecord.Model;
import com.mybatisflex.core.service.IService;
import com.mybatisflex.core.row.Db;
import com.mybatisflex.core.FlexGlobalConfig;// 1. Bootstrap MyBatis-Flex
MybatisFlexBootstrap bootstrap = MybatisFlexBootstrap.getInstance()
.setDataSource(dataSource)
.addMapper(UserMapper.class)
.start();
// 2. Get mapper instance
UserMapper userMapper = bootstrap.getMapper(UserMapper.class);
// 3. Basic CRUD operations
User user = new User("Alice", 25);
userMapper.insert(user);
// 4. Query building
List<User> adults = userMapper.selectListByQuery(
QueryWrapper.create()
.select()
.from(User.class)
.where(USER.AGE.ge(18))
);
// 5. Active Record pattern
User activeUser = new User();
activeUser.setName("Bob");
activeUser.setAge(30);
activeUser.save();
// 6. Row-based operations (no entities)
Db.insert("users", Row.ofMap(Map.of("name", "Charlie", "age", 28)));MyBatis-Flex is built around several key components:
MybatisFlexBootstrap for framework initialization and configurationBaseMapper<T> interface providing universal CRUD operationsQueryWrapper for type-safe, fluent SQL generationModel<T> base class for entity-centric operationsIService<T> interface for business logic abstractionDb utility class for entity-free database operationsFramework initialization, global configuration, and multi-datasource setup. Essential for getting MyBatis-Flex running in any Java application.
public class MybatisFlexBootstrap {
public static MybatisFlexBootstrap getInstance();
public MybatisFlexBootstrap setDataSource(DataSource dataSource);
public MybatisFlexBootstrap addDataSource(String key, DataSource dataSource);
public MybatisFlexBootstrap addMapper(Class<?> mapperClass);
public MybatisFlexBootstrap start();
public <T> T getMapper(Class<T> mapperClass);
}
public class FlexGlobalConfig {
public static FlexGlobalConfig getDefaultConfig();
public static void setConfig(String configId, FlexGlobalConfig config, boolean isDefault);
}Comprehensive CRUD interface that eliminates the need for custom mapper methods. Supports batch operations, relationship loading, and advanced querying.
public interface BaseMapper<T> {
// Insert operations
int insert(T entity);
int insertSelective(T entity);
int insertBatch(Collection<T> entities);
int insertOrUpdate(T entity);
// Select operations
T selectOneById(Serializable id);
List<T> selectListByQuery(QueryWrapper queryWrapper);
long selectCountByQuery(QueryWrapper queryWrapper);
Page<T> paginate(Page<T> page, QueryWrapper queryWrapper);
// Update operations
int update(T entity);
int updateByQuery(T entity, QueryWrapper queryWrapper);
// Delete operations
int deleteById(Serializable id);
int deleteBatchByIds(Collection<? extends Serializable> ids);
int deleteByQuery(QueryWrapper queryWrapper);
}Type-safe, fluent query building with comprehensive SQL support. Includes support for complex joins, subqueries, CTEs, and all major SQL operations.
public class QueryWrapper {
public static QueryWrapper create();
public QueryWrapper select(QueryColumn... queryColumns);
public QueryWrapper from(Class<?>... entityClasses);
public QueryWrapper where(QueryCondition queryCondition);
public QueryWrapper leftJoin(Class<?> entityClass);
public QueryWrapper orderBy(QueryColumn... queryColumns);
public QueryWrapper groupBy(QueryColumn... queryColumns);
public QueryWrapper limit(Number rows);
}
public class QueryColumn {
public static QueryColumn create(String columnName);
public QueryCondition eq(Object value);
public QueryCondition ge(Object value);
public QueryCondition in(Object... values);
}Entity-centric operations where domain objects handle their own persistence. Provides a clean, object-oriented approach to database operations.
public abstract class Model<T extends Model<T>> {
public boolean save();
public boolean update();
public boolean update(boolean ignoreNulls);
public boolean remove();
public Optional<Boolean> saveOpt();
public Optional<Boolean> updateOpt();
public Optional<Boolean> removeOpt();
}Type-safe, chainable update operations that provide a clean alternative to traditional entity updates. Supports conditional field setting, complex WHERE conditions, and direct SQL execution.
public class UpdateChain<T> {
public static <T> UpdateChain<T> of(Class<T> entityClass);
public static <T> UpdateChain<T> of(BaseMapper<T> mapper);
public UpdateChain<T> set(String column, Object value);
public UpdateChain<T> set(QueryColumn column, Object value);
public <R> UpdateChain<T> set(LambdaGetter<R> getter, Object value);
public UpdateChain<T> where(QueryCondition condition);
public UpdateChain<T> and(QueryCondition condition);
public UpdateChain<T> or(QueryCondition condition);
public boolean update();
}Business logic abstraction with enhanced CRUD operations, batch processing, and query chaining. Perfect for service-oriented architectures.
public interface IService<T> {
boolean save(T entity);
boolean saveBatch(Collection<T> entities);
boolean saveOrUpdate(T entity);
boolean removeById(Serializable id);
boolean update(T entity);
T getById(Serializable id);
List<T> list(QueryWrapper queryWrapper);
Page<T> page(Page<T> page, QueryWrapper queryWrapper);
long count(QueryWrapper queryWrapper);
}Direct database operations without entity classes. Ideal for dynamic queries, reporting, and working with unknown table structures.
public class Db {
public static int insert(String tableName, Row row);
public static int insertBySql(String sql, Object... args);
public static List<Row> selectBySql(String sql, Object... args);
public static int updateBySql(String sql, Object... args);
public static int deleteBySql(String sql, Object... args);
}
public class Row {
public static Row ofMap(Map<String, Object> map);
public Row set(String column, Object value);
public Object get(String column);
}Comprehensive database dialect system supporting 40+ database types including MySQL, PostgreSQL, Oracle, SQL Server, and specialized databases.
public enum DbType {
MYSQL, POSTGRESQL, ORACLE, SQL_SERVER, DB2,
CLICKHOUSE, H2, SQLITE, DERBY, FIREBIRD,
DM, KINGBASE, GBASE, OSCAR, HANA, REDSHIFT;
}
public interface IDialect {
String forSelectByQuery(QueryWrapper queryWrapper);
String forPaginateQuery(QueryWrapper queryWrapper, long offset, long rows);
String wrap(String keyword);
}Comprehensive pagination with performance optimizations, count query optimization, and type conversion support.
public class Page<T> {
public Page(int pageNumber, int pageSize);
public Page(int pageNumber, int pageSize, boolean optimizeCountQuery);
public List<T> getRecords();
public long getTotalRow();
public int getTotalPage();
public int getPageNumber();
public int getPageSize();
public <R> Page<R> convert(Function<T, R> mapper);
}// Core query types
public class QueryCondition {
public QueryCondition and(QueryCondition condition);
public QueryCondition or(QueryCondition condition);
public QueryCondition not();
}
public class QueryColumn {
public static QueryColumn create(String columnName);
public QueryColumn as(String alias);
public QueryCondition eq(Object value);
public QueryCondition ge(Object value);
public QueryCondition in(Object... values);
public QueryCondition like(String pattern);
public QueryCondition isNull();
public QueryCondition between(Object start, Object end);
}
public class QueryTable {
public static QueryTable create(String tableName);
public static QueryTable create(Class<?> entityClass);
public QueryTable as(String alias);
}
// Update operations
public class UpdateChain<T> {
public static <T> UpdateChain<T> of(Class<T> entityClass);
public static <T> UpdateChain<T> of(BaseMapper<T> mapper);
public UpdateChain<T> set(String column, Object value);
public UpdateChain<T> where(QueryCondition condition);
public boolean update();
}
// Pagination types
public class Page<T> {
public Page(int pageNumber, int pageSize);
public Page(int pageNumber, int pageSize, boolean optimizeCountQuery);
public List<T> getRecords();
public long getTotalRow();
public int getTotalPage();
public int getPageNumber();
public int getPageSize();
public <R> Page<R> convert(Function<T, R> mapper);
}
// Row operations
public class Row extends LinkedHashMap<String, Object> {
public static Row ofMap(Map<String, Object> map);
public Row set(String column, Object value);
public <T> T get(String column);
public Object get(String column);
}
public class RowKey {
public static RowKey of(String... columns);
public static RowKey of(QueryColumn... columns);
}
// Functional interfaces
@FunctionalInterface
public interface LambdaGetter<T> extends Serializable, Function<T, Object> {
}
// Cursor for streaming results
public interface Cursor<T> extends Closeable, Iterable<T> {
boolean isOpen();
boolean isConsumed();
int getCurrentIndex();
}
// Field query builder for relationship loading
public interface FieldQueryBuilder {
FieldQueryBuilder with(String fieldName);
FieldQueryBuilder with(LambdaGetter<?>... fieldGetters);
}
// Configuration types
public class FlexGlobalConfig {
public DbType getDbType();
public void setDbType(DbType dbType);
public KeyConfig getKeyConfig();
public void setKeyConfig(KeyConfig keyConfig);
public boolean isLogicDeleteColumn(String column);
public void setLogicDeleteColumn(String column);
}
public class KeyConfig {
public KeyType getKeyType();
public void setKeyType(KeyType keyType);
public String getValue();
public void setValue(String value);
}
// Enums
public enum DbType {
MYSQL, POSTGRESQL, ORACLE, SQL_SERVER, DB2,
CLICKHOUSE, H2, SQLITE, DERBY, FIREBIRD,
DM, KINGBASE, GBASE, OSCAR, HANA, REDSHIFT;
}
public enum KeyType {
None, Auto, Generator, Sequence;
}
// Transaction support
public enum Propagation {
REQUIRED,
REQUIRES_NEW,
NESTED,
NOT_SUPPORTED,
NEVER,
SUPPORTS,
MANDATORY;
}
// Batch processing
@FunctionalInterface
public interface BatchArgsSetter<T> {
void setArgs(PreparedStatement ps, T item, int index) throws SQLException;
}