自動(dòng)填充功能
基本介紹?
Mybatis-plus自動(dòng)填充功能是指在數(shù)據(jù)庫(kù)表進(jìn)行增、刪、改、查操作時(shí),自動(dòng)將某些字段的值進(jìn)行填充。這些字段的值可以是當(dāng)前時(shí)間、登錄用戶ID等。
在項(xiàng)目中有一些屬性,如果我們不希望每次都填充的話,我們可以設(shè)置為自動(dòng)填充,比如常見(jiàn)的時(shí)間,創(chuàng)建時(shí)間和更新時(shí)間可以設(shè)置為自動(dòng)填充。
?具體使用
【1】在數(shù)據(jù)庫(kù)的表中添加兩個(gè)字段
【2】在實(shí)體類(lèi)中,添加對(duì)應(yīng)字段,并為需要自動(dòng)填充的屬性指定填充時(shí)機(jī)
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(autoResultMap = true)
public class User extends Model<User> {
@TableId
private Long id;
private String name;
private Integer age;
private String email;
private Integer status;
private GenderEnum gender;
@TableField(typeHandler = FastjsonTypeHandler.class)
private Map<String,String> contact;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
? ? @TableField(fill = FieldFill.INSERT)
? ? private Date createTime;
? ? @TableField(fill = FieldFill.INSERT_UPDATE)
? ? private Date updateTime;?
【3】注意只有設(shè)置了下劃線和小駝峰映射,這種mysql的寫(xiě)法才能和實(shí)體類(lèi)完成映射?
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】編寫(xiě)自動(dòng)填充處理器,指定填充策略
@Component
public class MyMetaHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
setFieldValByName("createTime",new Date(),metaObject);
setFieldValByName("updateTime",new Date(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
setFieldValByName("updateTime",new Date(),metaObject);
}
}
?【4】測(cè)試插入操作
@Test
void testFill(){
User user = new User();
user.setName("wang");
user.setAge(35);
user.setEmail("wang@powernode.com");
user.setGender(GenderEnum.MAN);
user.setStatus(1);
HashMap<String, String> contact = new HashMap<>();
contact.put("phone","010-1234567");
contact.put("tel","13388889999");
userMapper.insert(user);
}
【5】測(cè)試更新操作?
@Test
void testFill2(){
User user = new User();
user.setId(6L);
user.setName("wang");
user.setAge(35);
user.setEmail("wang@powernode.com");
user.setGender(GenderEnum.MAN);
user.setStatus(1);
HashMap<String, String> contact = new HashMap<>();
contact.put("phone","010-1234567");
contact.put("tel","13388889999");
userMapper.updateById(user);
}
?防全表更新與刪除插件
?基本介紹
在實(shí)際開(kāi)發(fā)中,全表更新和刪除是非常危險(xiǎn)的操作,在MybatisPlus中,提供了插件和防止這種危險(xiǎn)操作的發(fā)生。MybatisPlus提供了一個(gè)叫做"SqlExplainInterceptor"的攔截器,可以用于防止全表更新和刪除操作。
開(kāi)啟后,當(dāng)數(shù)據(jù)庫(kù)操作SQL中出現(xiàn)“UPDATE”或者“DELETE”的時(shí)候,攔截器會(huì)對(duì)SQL進(jìn)行解析,如果存在沒(méi)有帶條件的“UPDATE”或者“DELETE”語(yǔ)句,攔截器會(huì)拋出異常,從而防止全表更新和刪除操作。
需要注意的是,此攔截器只能攔截MybatisPlus自動(dòng)生成的SQL語(yǔ)句,無(wú)法攔截手寫(xiě)的SQL語(yǔ)句,因此在編寫(xiě)手寫(xiě)SQL時(shí)仍需要注意防止全表更新和刪除操作。
具體使用
【1】注入MybatisPlusInterceptor類(lèi),并配置BlockAttackInnerInterceptor攔截器
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//分頁(yè)插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
//防全表更新與刪除插件
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
return interceptor;
}
}
【2】測(cè)試全表更新,會(huì)出現(xiàn)拋出異常,防止了全表更新文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-606173.html
@SpringBootTest
public class QueryTest {
@Autowired
private UserService userService;
@Test
void allUpdate(){
User user = new User();
user.setId(999L);
user.setName("wang");
user.setEmail("wang@powernode.com");
userService.saveOrUpdate(user,null);
}
}
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-606173.html
到了這里,關(guān)于mybatisPlus之自動(dòng)填充功能及防全表更新與刪除插件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!