wbase-mybatis
大约 5 分钟
wbase-mybatis
数据库连接池、多数据源、事务、MyBatis Plus 拓展模块
📦 Maven 依赖
<dependency>
<groupId>com.wzhcode.wbase</groupId>
<artifactId>wbase-mybatis</artifactId>
<version>1.0.0</version>
</dependency>📁 目录结构
wbase-mybatis/src/main/java/com/wzhcode/wbase/
│
├── 📂 mybatis/ # MyBatis Plus 拓展
│ ├── 📂 config/ # 自动配置
│ └── 📂 core/
│ ├── 📂 dataobject/ # 基础实体类
│ ├── 📂 enums/ # SQL常量
│ ├── 📂 handler/ # 字段自动填充
│ ├── 📂 mapper/ # 增强Mapper基类
│ ├── 📂 query/ # 增强QueryWrapper
│ ├── 📂 type/ # TypeHandler类型处理器
│ └── 📂 util/ # 工具类
│
├── 📂 datasource/ # 数据源配置
│ ├── 📂 config/ # 自动配置
│ └── 📂 core/
│ ├── 📂 enums/ # 数据源枚举
│ └── 📂 filter/ # Druid过滤器
│
└── 📂 translate/ # VO数据翻译
├── 📂 config/ # 自动配置
└── 📂 core/ # 翻译工具类📑 目录
🗄️ 基础实体类
位置:
com.wzhcode.wbase.mybatis.core.dataobject
BaseDO
所有数据库实体的基类,提供通用字段和自动填充:
@Data
public abstract class BaseDO implements Serializable, TransPojo {
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime; // 创建时间
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime; // 更新时间
@TableField(fill = FieldFill.INSERT)
private String creator; // 创建者
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updater; // 更新者
@TableLogic
private Boolean deleted; // 逻辑删除
}字段自动填充
DefaultDBFieldHandler 自动处理:
| 操作 | 自动填充字段 |
|---|---|
| INSERT | createTime, updateTime, creator, updater |
| UPDATE | updateTime, updater |
📝 使用示例
@TableName("sys_user")
public class UserDO extends BaseDO {
@TableId
private Long id;
private String username;
private String password;
}🔌 增强Mapper
位置:
com.wzhcode.wbase.mybatis.core.mapper
BaseMapperX
继承 MPJBaseMapper,提供丰富的便捷方法:
| 方法类型 | 方法 | 说明 |
|---|---|---|
| 分页 | selectPage(PageParam, Wrapper) | 分页查询 |
selectPage(SortablePageParam, Wrapper) | 可排序分页 | |
selectJoinPage(PageParam, Class, MPJLambdaWrapper) | 联表分页 | |
| 单条 | selectOne(field, value) | 单字段查询 |
selectOne(f1, v1, f2, v2) | 双字段查询 | |
selectOne(f1, v1, f2, v2, f3, v3) | 三字段查询 | |
| 列表 | selectList() | 查询全部 |
selectList(field, value) | 单字段列表 | |
selectList(field, values) | IN查询 | |
| 统计 | selectCount() | 总数 |
selectCount(field, value) | 条件统计 | |
| 批量 | insertBatch(entities) | 批量插入 |
insertBatch(entities, size) | 分批插入 | |
updateBatch(entities) | 批量更新 | |
insertOrUpdateBatch(entities) | 批量保存或更新 | |
| 删除 | delete(field, value) | 条件删除 |
📝 使用示例
@Mapper
public interface UserMapper extends BaseMapperX<UserDO> {
}
// ========== 分页查询 ==========
PageResult<UserDO> page = userMapper.selectPage(pageParam,
new LambdaQueryWrapperX<UserDO>()
.likeIfPresent(UserDO::getUsername, reqVO.getUsername())
.eqIfPresent(UserDO::getStatus, reqVO.getStatus()));
// ========== 单条查询 ==========
UserDO user = userMapper.selectOne(UserDO::getUsername, "admin");
// ========== 批量操作 ==========
userMapper.insertBatch(userList);
userMapper.updateBatch(userList);🔍 增强QueryWrapper
位置:
com.wzhcode.wbase.mybatis.core.query
xxxIfPresent 方法
当值为空时自动跳过条件,避免空值判断:
| Wrapper | 说明 |
|---|---|
LambdaQueryWrapperX<T> | Lambda风格增强 |
QueryWrapperX<T> | 字符串风格增强 |
MPJLambdaWrapperX<T> | 联表查询增强 |
支持的方法
| 方法 | 说明 |
|---|---|
eqIfPresent | 等于(非空时生效) |
neIfPresent | 不等于 |
likeIfPresent | 模糊查询 |
inIfPresent | IN查询 |
gtIfPresent / geIfPresent | 大于 / 大于等于 |
ltIfPresent / leIfPresent | 小于 / 小于等于 |
betweenIfPresent | 范围查询 |
📝 使用示例
// LambdaQueryWrapperX
new LambdaQueryWrapperX<UserDO>()
.likeIfPresent(UserDO::getUsername, reqVO.getUsername()) // username为空则跳过
.eqIfPresent(UserDO::getStatus, reqVO.getStatus())
.betweenIfPresent(UserDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(UserDO::getId);
// QueryWrapperX - 支持 limitN
new QueryWrapperX<UserDO>()
.eqIfPresent("status", status)
.limitN(10); // 自动适配不同数据库
// MPJLambdaWrapperX - 联表查询
new MPJLambdaWrapperX<UserDO>()
.selectAll(UserDO.class)
.selectAs(DeptDO::getName, UserVO::getDeptName)
.leftJoin(DeptDO.class, DeptDO::getId, UserDO::getDeptId)
.eqIfPresent(UserDO::getStatus, status);🔄 TypeHandler类型处理器
位置:
com.wzhcode.wbase.mybatis.core.type
内置TypeHandler
| TypeHandler | 数据库类型 | Java类型 | 说明 |
|---|---|---|---|
StringListTypeHandler | VARCHAR | List<String> | 逗号分隔 |
LongListTypeHandler | VARCHAR | List<Long> | 逗号分隔 |
IntegerListTypeHandler | VARCHAR | List<Integer> | 逗号分隔 |
StringSetTypeHandler | VARCHAR | Set<String> | JSON格式 |
StringSet2TypeHandler | VARCHAR | Set<?> | JSON格式(泛型) |
JacksonTypeHandler | VARCHAR | Object | JSON格式(通用) |
EncryptTypeHandler | VARCHAR | String | AES加密存储 |
📝 使用示例
@TableName(value = "sys_user", autoResultMap = true)
public class UserDO extends BaseDO {
// 逗号分隔存储: "1,2,3"
@TableField(typeHandler = LongListTypeHandler.class)
private List<Long> roleIds;
// JSON存储: ["tag1","tag2"]
@TableField(typeHandler = StringSetTypeHandler.class)
private Set<String> tags;
// AES加密存储
@TableField(typeHandler = EncryptTypeHandler.class)
private String idCard;
}加密配置(application.yml):
mybatis-plus:
encryptor:
password: your-16-char-key # AES密钥📊 多数据源
位置:
com.wzhcode.wbase.datasource
数据源枚举
public interface DataSourceEnum {
String MASTER = "master"; // 主库
String SLAVE = "slave"; // 从库
}使用方式
@Service
public class UserService {
@DS("master") // 或 @Master
public void save(User user) { }
@DS("slave") // 或 @Slave
public User get(Long id) { }
}配置示例
spring:
datasource:
dynamic:
primary: master
datasource:
master:
url: jdbc:mysql://localhost:3306/master_db
username: root
password: 123456
slave:
url: jdbc:mysql://localhost:3306/slave_db
username: root
password: 123456🔗 VO数据翻译
位置:
com.wzhcode.wbase.translate
基于 Easy-Trans 实现 VO 字段自动翻译:
TranslateUtils
// 手动触发翻译(无法使用 @TransMethodResult 时)
List<UserVO> voList = TranslateUtils.translate(userVOList);使用示例
@Data
public class UserVO implements VO {
private Long id;
@Trans(type = TransType.DICTIONARY, key = "user_status")
private Integer status;
@TransRef // 翻译结果字段
private String statusName;
@Trans(type = TransType.SIMPLE, target = DeptDO.class, fields = "name")
private Long deptId;
@TransRef
private String deptName;
}⚙️ 自动配置
自动配置类
| 配置类 | 说明 |
|---|---|
WBaseMybatisAutoConfiguration | MyBatis Plus配置(分页插件、字段填充) |
WBaseDataSourceAutoConfiguration | 数据源配置(事务管理、Druid广告过滤) |
WBaseTranslateAutoConfiguration | Easy-Trans翻译配置 |
IdTypeEnvironmentPostProcessor | 自动设置ID生成策略 |
ID策略自动适配
根据数据库类型自动设置 IdType:
| 数据库 | IdType |
|---|---|
| MySQL | AUTO |
| Oracle / PostgreSQL / H2 / Kingbase | INPUT |
Druid监控配置
spring:
datasource:
druid:
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: admin
login-password: admin
filter:
stat:
enabled: true
log-slow-sql: true
slow-sql-millis: 100📚 主要依赖
| 依赖 | 用途 | 版本管理 |
|---|---|---|
| MyBatis Plus | ORM框架 | ✅ |
| Dynamic Datasource | 多数据源 | ✅ |
| Druid | 连接池 | ✅ |
| MyBatis Plus Join | 联表查询 | ✅ |
| Easy-Trans | VO翻译 | ✅ |
| MySQL Connector | MySQL驱动 | ✅ |
| Oracle JDBC | Oracle驱动(可选) | ✅ |
| PostgreSQL | PostgreSQL驱动(可选) | ✅ |
| SQL Server | SQL Server驱动(可选) | ✅ |
| DM JDBC | 达梦驱动(可选) | ✅ |
版本由
wbase-dependencies统一管理
💡 最佳实践
| 场景 | 推荐做法 |
|---|---|
| 🗄️ 实体定义 | 继承 BaseDO,自动填充通用字段 |
| 🔌 Mapper定义 | 继承 BaseMapperX,使用增强方法 |
| 🔍 条件查询 | 使用 xxxIfPresent 方法,避免空值判断 |
| 📄 分页查询 | 入参用 PageParam,返回用 PageResult |
| 🔗 联表查询 | 使用 MPJLambdaWrapperX + selectJoinPage |
| 📊 多数据源 | 使用 @DS / @Master / @Slave 注解 |
| 🔐 敏感字段 | 使用 EncryptTypeHandler 加密存储 |
| 📦 批量操作 | 使用 insertBatch / updateBatch 提升性能 |