1、Mybatis-plus的介绍
Mybatis-plus是Mybatis的简化版 是为了简化而生
要使用Mybatis-plus进行开发 第一步就是要导入相应的jar包
实现如下:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
2、主键自增策略
MP可以设置主键自增策略 是基于雪花策略 还有一些比较常见的 有基于mysql的自增策略 在最后一条记录id+1 还有基于redis的自增策略
分布式系统唯一ID生成方案汇总
实现如下:
在实体类的ID属性上加入@TableId注解 设置type属性值
//@TableId(type = IdType.AUTO) 自增
//@TableId(type = IdType.ID_WORKER) 默认 id为int类型
//@TableId(type = IdType.ID_WORKER_STR) Id为String类型
private Long id;
3、自动填充
项目中经常会遇到一些数据,每次都使用相同的方式进行创建,比如创建时间,和修改时间
实现如下:
1.在实体类上添加相应的注解 @TableField 并且设置属性fill的值 通常是在插入和更新的时候修改
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
2.创建/处理自动填充创建和修改时间的类 并实现MetaObjectHandler类 并重写里面的insertFill、updateFill方法
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
3.进行测试即可 不需要设置创建时间和更新时间 就会自动填充
@Test
void testInsert(){
User user= new User();
user.setName("zyy");
user.setAge(18);
user.setEmail("888@qq.com");
int row = userMapper.insert(user);
System.out.println(row);
}
4、乐观锁
乐观锁是为了保证线程安全 举个例子:当一个人存款1000 如果同时两个人进行操作就会出错
解决方法
- 一次只允许一个人操作,但是这种方式效率太低
- 在原先的基础上加上一个version操作 在开始操作时获取version 在提交事务时再获取version 两个version进行对比 相同则提交成功 不相同则提交失败
实现方式如下:
1.在实体类添加version属性 并加入注解@Version
//实现乐观锁 加入version
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
2.在配置类中配置乐观锁的插件
/**
* 添加乐观锁插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
5、逻辑删除
删除分为两种
- 物理删除:指的是将数据库中的数据删除
- 逻辑删除:指的是将数据库中deleted字段设置为1表示删除 可以恢复 类似于我们的回收站机制
实现方式如下:
1.在实体类添加deleted属性 并添加注解@TableLogic
//实现逻辑删除
@TableField(fill = FieldFill.INSERT)
@TableLogic //实现逻辑删除
private Integer deleted;
2.测试 会将数据库表中deleted字段设置为0
//测试逻辑删除
@Test
void testLogicDelete(){
int rows = userMapper.deleteById(3L);
System.out.println(rows);
}
6、分页操作
分页是项目中经常要使用的操作
实现方式如下:
1.在配置类中添加分页插件
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
2.测试 需要传入一个Page对象
//测试分页
@Test
void testPage(){
Page<User> page = new Page<>(1, 3);//当前页 和 每页大小
userMapper.selectPage(page, null);
System.out.println(page.getRecords()); //所有的记录
System.out.println(page.getTotal()); //所有的记录数
System.out.println(page.getCurrent()); //当前页
System.out.println(page.getSize()); //每页的大小
System.out.println(page.hasNext()); //是否有下一页
System.out.println(page.hasPrevious()); //是否有上一页
}
7.Wrapper使用
Wrapper实现条件查询 我们通常使用Wrapper实现类QueryWrapper
实现方式如下
1、测试年龄大于等于20的用户
//测试年龄大于等于20的用户
@Test
void testGtLt(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.ge("age", 20);
List<User> users = userMapper.selectList(queryWrapper);
for (User user : users) {
System.out.println(user);
}
}
2.测试年龄大于20的用户
//测试年龄大于20的用户
@Test
void testGt(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 20);
List<User> users = userMapper.selectList(queryWrapper);
for (User user : users) {
System.out.println(user);
}
}
3.测试年龄大于20~30岁之间的用户
//测试年龄大于20小于30的用户
@Test
void testBetween(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.between("age", 20, 30);
List<User> users = userMapper.selectList(queryWrapper);
for (User user : users) {
System.out.println(user);
}
}
4.测试模糊查询
//测试模糊查询
@Test
void testLike(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name", "h");
List<User> users = userMapper.selectList(wrapper);
for (User user : users) {
System.out.println(user);
}
}
5.测试排序查询
//测试排序查询
@Test
void testOrderBy(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("age");
List<User> users = userMapper.selectList(wrapper);
for (User user : users) {
System.out.println(user);
}
}
8、总结
今天是项目开始的第一天,也是开始写博客的第一天,今天的内容能够完全消化,也学到了很多的新知识,希望自己能够不断积累,坚持15天把这个在线项目做完,同时也养成写博客的好习惯,加油!