目录
日志配置
# 日志配置(配置SQL在控制台输出)
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
控制台输出结果
主键生成策略
新增操作
执行insert操作时,数据库插入的id默认值为:全局的唯一id (雪花算法生成)
雪花算法:
SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增。这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。
新增时默认生成主键截图:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
// 对应数据库中的主键 (uuid、自增id、雪花算法生成、redis生成ID、zookeeper)
private Long id;
private String name;
private Integer age;
private String email;
}
主键自增
1、实体类主键上标注 @TableId(type = IdType.AUTO)
2、数据库主键字段改为自增
3、插入数据,测试主键自增
其余源码解释:
public enum IdType {
AUTO(0), // 数据库id自增
NONE(1), // 未设置主键
INPUT(2), // 手动输入;设置手动输入后,需要自己配置id
ASSIGN_ID(3),
ASSIGN_UUID(4),
/** @deprecated */
@Deprecated
ID_WORKER(3), // 默认全局id
/** @deprecated */
@Deprecated
ID_WORKER_STR(3), // ID_WORKER 的字符串形式
/** @deprecated */
@Deprecated
UUID(4); // 全局唯一id uuid
}
更新操作
自动填充
创建时间、修改时间!我们希望是自动化完成,不希望手动更新!
阿里巴巴开发手册:所有数据库表需配置:gmt_create、gmt_modified 且需要自动化。
方式一:数据库
1、在表中新增字段 create_time、update_time
注意事项:时间列默认系统当前时间 default CURRENT_TIMESTAMP 一个表中只能有一个列。
否则报错,报错信息:
Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
修改其中一个 TIMESTAMP 列,默认值不为系统当前时间,创建成功
方式二:代码
1、删除数据库默认值
2、实体类属性上增加注解
//执行插入操作时,自动填充内容,默认是不填充
@TableField(fill = FieldFill.INSERT)
private java.util.Date createTime;
//执行插入或者更新操作时,自动填充内容
@TableField(fill = FieldFill.INSERT_UPDATE)
private java.util.Date updateTime;
public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入填充字段
*/
INSERT,
/**
* 更新填充字段
*/
UPDATE,
/**
* 插入和更新填充字段
*/
INSERT_UPDATE
}
3、编写处理器
/**
* @Author LMGD
* @Date 2021/12/17 10:25
*/
@Component //加上 @Component 注解,把处理器配置到IOC容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
private Logger log = LoggerFactory.getLogger(MyMetaObjectHandler.class);
//插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
this.setFieldValByName("createTime", new java.util.Date(), metaObject);
this.setFieldValByName("updateTime", new java.util.Date(), metaObject);
}
//更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.setFieldValByName("updateTime", new java.util.Date(), metaObject);
}
}
4、执行效果图
执行插入、修改操作自动填充时间
乐观锁
官网地址:乐观锁插件 | MyBatis-Plus
分页查询
分页查询:
1、原始的 limit 进行分页查询
2、pageHelper 第三方分页插件
3、MyBatis-Plus 内置的分页插件
如何使用MyBatis-Plus 内置的分页插件?
1、配置 PaginationInnerInterceptor 分页插件
/**
* @Author LMGD
* @Date 2021/12/17 14:34
*/
@MapperScan("com.lmgd.mybatisplus.mapper")
@EnableTransactionManagement//添加事务
@Configuration
public class MyBatisPlusConfig {
@Bean
public PaginationInnerInterceptor paginationInnerInterceptor() {
return new PaginationInnerInterceptor();
}
// 最新版
/* @Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}*/
}
2、使用 BaseMapper类中的 selectPage()方法 + Page 类
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> selectPageUser(User user) {
Page<User> page = new Page(1, 5);
page = userMapper.selectPage(page, null);
List<User> userList = page.getRecords();
userList.forEach(System.out::println);
return userList;
}
}