MybatisPlus是一款基于Mybatis的ORM框架,它可以让开发者在使用Mybatis的基础上,快速实现数据库的CRUD操作。MybatisPlus高级用法主要包括以下几个方面:
1、自动填充功能。MybatisPlus可以自动填充字段,例如创建时间、修改时间等,这样可以大大减少开发者的工作量。
@TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime;
2、乐观锁。乐观锁是一种常用的数据库并发处理机制,它通过版本号来保证数据的一致性。MybatisPlus中使用@Version注解来标识乐观锁字段:
@Version private Integer version;
3、逻辑删除。MybatisPlus中使用@TableLogic注解来标识逻辑删除字段:
@TableLogic private Integer deleted; // 逻辑删除标识字段,1-已删除 0-未删除
4、SQL注入器。SQL注入器是MybatisPlus中一个重要的功能,它可以帮助开发者快速生成常用的SQL语句,例如批量新增、批量修改等。
@SqlParser(filter = true) public void batchInsert() { List<User> userList = new ArrayList<>(); userList.add(new User()); userList.add(new User()); // 批量新增 boolean result = new User().insertBatch(userList); }<
mybatis-mate
为 mp 企业级模块,旨在更敏捷优雅处理数据。
mybatis-mate 示例 :传送门
mybatis-mate-audit
// 1,异步回调,注意 @EnableAsync 开启异步
applicationEventPublisher.publishEvent(new DataAuditEvent((t) -> {
List<Change> changes = t.apply(newVersion, oldVersion);
for (Change valueChange : changes) {
ValueChange change = (ValueChange) valueChange;
System.err.println(String.format("%s不匹配,期望值 %s 实际值 %s", change.getPropertyName(), change.getLeft(), change.getRight()));
}
}));
// 2,手动调用对比
DataAuditor.compare(obj1, obj2);
mybatis-mate-sensitive-words
mybatis-mate-datascope
@DataScope
属性 | 类型 | 必须指定 | 默认值 | 描述 |
type |
String | 否 | "" | 范围类型,用于区分对于业务分类,默认空 |
value |
DataColumn[] | 否 | {} | 数据权限字段,支持多字段组合 |
ignore |
boolean | 否 | false | 忽略权限处理逻辑 true 是 false 否 |
@DataColumn
属性 | 类型 | 必须指定 | 默认值 | 描述 |
alias | String | 否 | "" | 关联表别名 |
name | String | 是 | 字段名 |
// 测试 test 类型数据权限范围,混合分页模式
@DataScope(type = "test", value = {
// 关联表 user 别名 u 指定部门字段权限
@DataColumn(alias = "u", name = "department_id"),
// 关联表 user 别名 u 指定手机号字段(自己判断处理)
@DataColumn(alias = "u", name = "mobile")
})
@Select("select u.* from user u")
List<User> selectTestList(IPage<User> page, Long id, @Param("name") String username);
// 测试数据权限,最终执行 SQL 语句
SELECT u.* FROM user u WHERE (u.department_id IN ("1", "2", "3", "5")) AND u.mobile LIKE "%1533%" LIMIT 1,10
请注意必须注入 IDataScopeProvider
实现类处理数据权限,关于数据传参支持 2 种方式:
mapper
方法通过方法参数传递,在 setWhere
方法 Object[] args
参数中获取 ThreadLocal
传递参数,你可以拦截 controller
层或者 service
层设置数据权限处理参数,更多可以参考
mybatis-mate-ddl-mysql,mybatis-mate-ddl-postgres
Schema
初始化,升级 SQL 自动维护,区别于 flyway
支持分表库、可控制代码执行 SQL 脚本ddl_history
表,每次执行SQL脚本会自动维护版本信息。@Component
public class MysqlDdl implements IDdl {
@Override
public List<String> getSqlFiles() {
return Arrays.asList(
"db/tag-schema.sql",
"D:dbtag-data.sql"
);
}
}
// 切换到 mysql 从库,执行 SQL 脚本
ShardingKey.change("mysqlt2");
ddlScript.run(new StringReader("DELETE FROM user;n" +
"INSERT INTO user (id, username, password, sex, email) VALUESn" +
"(20, "Duo", "123456", 0, "Duo@baomidou.com");"));
mybatis-mate-dict
@FieldBind
属性 | 类型 | 必须指定 | 默认值 | 描述 |
sharding |
String | 否 | "" | 分库分表数据源指定 |
type |
String | 是 | 类型(用于区分不同业务) | |
target |
String | 是 | 目标显示属性(待绑定属性,注意非数据库字段请排除) |
@FieldBind(type = "user_sex", target = "sexText")
private Integer sex;
// 绑定显示属性,非表字典(排除)
@TableField(exist = false)
private String sexText;
IDataBind
接口,注入 spring 容器@Component
public class DataBind implements IDataBind {
...
}
mybatis-mate-jsonbind
@JsonBind
@JsonBind("绑定类型")
public class User {
...
}
@Component
public class JsonBindStrategy implements IJsonBindStrategy {
@Override
public Map<String, Function<Object, Map<String, Object>>> getStrategyFunctionMap() {
return new HashMap<String, Function<Object, Map<String, Object>>>(16) {
{
// 注入虚拟节点
put(Type.departmentRole, (obj) -> new HashMap(2) {{
User user = (User) obj;
// 枚举类型转换
put("statusText", StatusEnum.get(user.getStatus()).getDesc());
// 可调用数据库查询角色信息
put("roleName", "经理");
}});
}
};
}
}
mybatis-mate-encrypt
@FieldEncrypt
属性 | 类型 | 必须指定 | 默认值 | 描述 |
password |
String | 否 | "" | 加密密码 |
algorithm |
Algorithm | 否 | PBEWithMD5AndDES | PBE MD5 DES 混合算法 |
encryptor |
Class | 否 | IEncryptor | 加密处理器 |
Algorithm
算法 | 描述 |
MD5_32 |
32 位 md5 算法 |
MD5_16 |
16 位 md5 算法 |
BASE64 |
64 个字符来表示任意二进制数据算法 |
AES |
AES 对称算法 |
RSA |
非对称加密算法 |
SM2 |
国密 SM2 非对称加密算法,基于 ECC |
SM3 |
国密 SM3 消息摘要算法,可以用 MD5 作为对比理解 |
SM4 |
国密 SM4 对称加密算法,无线局域网标准的分组数据算法 |
PBEWithMD5AndDES |
混合算法 |
PBEWithMD5AndTripleDES |
混合算法 |
PBEWithHMACSHA512AndAES_256 |
混合算法 |
PBEWithSHA1AndDESede |
混合算法 |
PBEWithSHA1AndRC2_40 |
混合算法 |
MD5
算法为不可逆算法,存储数据库及查询结果都是密文 SM4
算法必须依赖 bouncycastle
加密库 混合算法必须依赖 jasypt
加密库 【注意】查询返回加密对象必须包含加密注解信息,单纯的返回某个 String
或者 List
某个集合是无法解密的。
FieldEncrypt
实现数据加解密,支持多种加密算法@FieldEncrypt
private String email;
mybatis-mate-sensitive-jackson
@FieldSensitive
FieldSensitive
实现数据脱敏,内置 手机号、邮箱、银行卡号 等 9 种常用脱敏规则@FieldSensitive("testStrategy")
private String username;
@Configuration
public class SensitiveStrategyConfig {
@Bean
public ISensitiveStrategy sensitiveStrategy() {
// 自定义 testStrategy 类型脱敏处理
return new SensitiveStrategy().addStrategy("testStrategy", t -> t + "***test***");
}
}
// 跳过脱密处理,用于编辑场景
RequestDataTransfer.skipSensitive();
mybatis-mate-sharding
@Sharding
属性 | 类型 | 必须指定 | 默认值 | 描述 |
value | String | 是 | "" | 分库组名,空使用默认主数据源 |
strategy | Class | 否 | RandomShardingStrategy | 分库&分表策略 |
mybatis-mate:
sharding:
health: true # 健康检测
primary: mysql # 默认选择数据源
datasource:
mysql: # 数据库组
- key: node1
...
- key: node2
cluster: slave # 从库读写分离时候负责 sql 查询操作,主库 master 默认可以不写
...
postgres:
- key: node1 # 数据节点
...
Sharding
切换数据源,组内节点默认随机选择(查从写主)@Mapper
@Sharding("mysql")
public interface UserMapper extends BaseMapper<User> {
@Sharding("postgres")
Long selectByUsername(String username);
}
// 切换到 mysql 从库 node2 节点
ShardingKey.change("mysqlnode2");
mybatis-mate-sharding-dynamic
mybatis-mate-sharding-jta-atomikos
MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。特性无侵...
多数据库支持如果配置了databaseIdProvider,你就可以在动态代码中使用名为“_databaseId”的变量来为不同的数据库构建...
问题Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL语句。这通常是因为需要动态生成SQL语句,不然我们可以将它们放到...
架构Hibernate 架构是分层的,作为数据访问层,你不必知道底层 API 。Hibernate 利用数据库以及配置数据来为应用程序提供持续性...
简介Hibernate 是由 Gavin King 于 2001 年创建的开放源代码的对象关系框架。它强大且高效的构建具有关系对象持久性和查询服务的...
Spring 编程式事务管理编程式事务管理方法允许你在对你的源代码编程的帮助下管理事务。这给了你极大地灵活性,但是它很难维护。...
Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试...
Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理。BeanPostProcessor 接口定义回调方法,你可以实现该方法...