一.@TableFiled 的value属性
作用是将实体类属性转换成数据库字段属性
@Data
@TableName(value = "user")
public class User {
@TableId(value = "uid")
//@TableId(value = "uid", type = IdType.AUTO)
private Long id;
@TableField(value = "user_name")
private String name;
private Integer age;
private String email;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
二.数据库设置时间自动更新
ALTER TABLE `users` MODIFY COLUMN `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
三.业务层实现自动添加
1.实体类@TableField()注解添加
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
2.通过handler文件添加
package com.example.mybatisplus.handle;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
@Slf4j //更改日志
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("insert 自动填充 。。。。");
//实现填充业务逻辑
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("update 自动填充。。。。");
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
注意:使用handler文件时,实体类需要自动添加的属性需要加上@TableField注解
如果不是大量表使用相同的字段,不建议在handler文件做自动添加
关于自动填充的判断优化
/*判断当前对象的自动填充属性是否已经进行了赋值*/
Object age = this.getFieldValByName("age", metaObject);
if (age == null) {
log.info("insert age 属性");
this.strictInsertFill(metaObject, "age", Integer.class, 18);
}
/*判断当前对象的自动填充属性是否包含当前属性*/
boolean hasAuthor = metaObject.hasSetter("author");
if (hasAuthor) {
log.info("insert author 属性");
this.strictInsertFill(metaObject, "author", String.class, "铁根");
}
四.数据库逻辑删除处理
@TableLogic //逻辑删除
@TableField(value = "is_deleted")
private Boolean deleted;
需要更改删除标识时配置application.propertise文件
#数据库逻辑删除表示更改
mybatis-plus.global-config.db-config.logic-delete-field=deleted
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
五.分页
1.mybatis插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加
//interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbType
return interceptor;
}
分页方法测试
@Test
public void testSelectPage() {
Page<User> pageParam = new Page<User>(1, 5);
userMapper.selectPage(pageParam, null);
List<User> user = pageParam.getRecords();
user.forEach(System.out::println);
long total = pageParam.getTotal();
System.out.println(total);
boolean bn = pageParam.hasNext();
System.out.println("下一页" + bn);
boolean bp = pageParam.hasPrevious();
System.out.println("上一页" + bp);
}
2.通过xml分页
mapper.java文件
/**
* 查询 : 根据年龄查询用户列表 ,分页显示
*
* @param page 分页对象,xml中可以从里面进行取值,传递参数 Page
* @param age 年龄
* @return 分页对象
*/
IPage<User> selectPageByAge(Page<?> page, Integer age);
mapper.xml文件
<select id="selectPageByAge" resultType="com.example.mybatisplus.entity.User">
select <include refid="Base_Colum_list"></include>
from t_user
where age > #{age}
</select>
测试上述代码
@Test
public void testSelectPageByAge() {
Page<User> pageParam = new Page<>(1,5);
userMapper.selectPageByAge(pageParam,20);
List<User> users = pageParam.getRecords();
users.forEach(System.out::println);
}