自动填充功能
基本介绍
Mybatis-plus自动填充功能是指在数据库表进行增、删、改、查操作时,自动将某些字段的值进行填充。这些字段的值可以是当前时间、登录用户ID等。
在项目中有一些属性,如果我们不希望每次都填充的话,我们可以设置为自动填充,比如常见的时间,创建时间和更新时间可以设置为自动填充。
具体使用
【1】在数据库的表中添加两个字段
【2】在实体类中,添加对应字段,并为需要自动填充的属性指定填充时机
1. @Data 2. @NoArgsConstructor 3. @AllArgsConstructor 4. @TableName(autoResultMap = true) 5. public class User extends Model<User> { 6. @TableId 7. private Long id; 8. private String name; 9. private Integer age; 10. private String email; 11. private Integer status; 12. private GenderEnum gender; 13. @TableField(typeHandler = FastjsonTypeHandler.class) 14. private Map<String,String> contact; 15. @TableField(fill = FieldFill.INSERT) 16. private Date createTime; 17. @TableField(fill = FieldFill.INSERT_UPDATE) 18. private Date updateTime; 19. }
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
【3】注意只有设置了下划线和小驼峰映射,这种mysql的写法才能和实体类完成映射
mybatis-plus:
global-config:
db-config:
logic-not-delete-value: 0
logic-delete-value: 5
logic-delete-field: status
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
【3】编写自动填充处理器,指定填充策略
1. @Component 2. public class MyMetaHandler implements MetaObjectHandler { 3. @Override 4. public void insertFill(MetaObject metaObject) { 5. setFieldValByName("createTime",new Date(),metaObject); 6. setFieldValByName("updateTime",new Date(),metaObject); 7. } 8. 9. @Override 10. public void updateFill(MetaObject metaObject) { 11. setFieldValByName("updateTime",new Date(),metaObject); 12. } 13. }
【4】测试插入操作
1. @Test 2. void testFill(){ 3. User user = new User(); 4. user.setName("wang"); 5. user.setAge(35); 6. user.setEmail("wang@powernode.com"); 7. user.setGender(GenderEnum.MAN); 8. user.setStatus(1); 9. HashMap<String, String> contact = new HashMap<>(); 10. contact.put("phone","010-1234567"); 11. contact.put("tel","13388889999"); 12. userMapper.insert(user); 13. }
【5】测试更新操作
1. @Test 2. void testFill2(){ 3. User user = new User(); 4. user.setId(6L); 5. user.setName("wang"); 6. user.setAge(35); 7. user.setEmail("wang@powernode.com"); 8. user.setGender(GenderEnum.MAN); 9. user.setStatus(1); 10. HashMap<String, String> contact = new HashMap<>(); 11. contact.put("phone","010-1234567"); 12. contact.put("tel","13388889999"); 13. 14. userMapper.updateById(user); 15. }
防全表更新与删除插件
基本介绍
在实际开发中,全表更新和删除是非常危险的操作,在MybatisPlus中,提供了插件和防止这种危险操作的发生。MybatisPlus提供了一个叫做"SqlExplainInterceptor"的拦截器,可以用于防止全表更新和删除操作。
开启后,当数据库操作SQL中出现“UPDATE”或者“DELETE”的时候,拦截器会对SQL进行解析,如果存在没有带条件的“UPDATE”或者“DELETE”语句,拦截器会抛出异常,从而防止全表更新和删除操作。
需要注意的是,此拦截器只能拦截MybatisPlus自动生成的SQL语句,无法拦截手写的SQL语句,因此在编写手写SQL时仍需要注意防止全表更新和删除操作。
具体使用
【1】注入MybatisPlusInterceptor类,并配置BlockAttackInnerInterceptor拦截器
1. @Configuration 2. public class MybatisPlusConfig { 3. @Bean 4. public MybatisPlusInterceptor mybatisPlusInterceptor() { 5. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); 6. //分页插件 7. interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); 8. //防全表更新与删除插件 9. interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); 10. return interceptor; 11. } 12. }
【2】测试全表更新,会出现抛出异常,防止了全表更新
1. @SpringBootTest 2. public class QueryTest { 3. 4. @Autowired 5. private UserService userService; 6. 7. @Test 8. void allUpdate(){ 9. User user = new User(); 10. user.setId(999L); 11. user.setName("wang"); 12. user.setEmail("wang@powernode.com"); 13. userService.saveOrUpdate(user,null); 14. } 15. }