开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情
- Mapper类继承基本的类 BaseMapper:所有的CRUD操作都已经编写完成了
- 需要在主启动类上去扫描我们的mapper包下的所有接口:@MapperScan("com.takeoff.mapper")
List<User> users = userMapper.selectList(null);
//参数是一个 Wrapper ,条件构造器,这里我们先不用,所以为null
//查询全部用户
配置日志
默认的情况下,sql是不可见的
//配置文件
mybatis-plus.configuration.log-impl = org.apache.ibatis.logging.stdout.StdOutImpl
CRUD扩展
- Insert插入
User user = new User();
user.setName("test");
int result = userMapper.insert(user);//帮我们自动生成id
//result:受影响的行数
- 数据库插入的id默认值为:全局的唯一id。
主键生成策略
- 默认 ID_WORKER 全局唯一ID
分布式系统唯一id生成:雪花算法--结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(前5个是数据中心,后5个机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生4096个ID),最后还有一个符号位,永远是0。可以保证几乎全球唯一!
- 主键自增
我们需要配置主键自增:
1、实体类字段上 @TableId(type = IdType.AUTO)
2、数据库字段一定要是自增!
自动填充
创建时间、修改时间等几乎所有表都需要配置上,且自动更新。
在数据库和代码上都可以操作
- 代码级别
1.实体类字段属性上需要增加注解
//字段添加填充内容
@TableField( fill = FieldFill.INSERT)
private Date createTime;
@TableField( fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
2.编写处理器来处理这个注解即可!
乐观锁
- 乐观锁:无论干什么都不会上锁。 悲观锁:无论干什么都会去上锁
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
- 测试MP的乐观锁插件
1.给数据库中增加version字段!
2.我们实体类加对应的字段
@Version //乐观锁Version注解
private Integer version
3.注册组件
@Bean
public OptimistiLockerInterceptor 0ptimistiLockerInterceptor() {
return new OptimistiLockerInterceptor();
}
分页查询
- 使用方法
1、配置拦截器
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
2、直接使用Page对象
//参数一:当前页 参数二:页面大小
Page<User> page = new Page<>(2,5);
userMapper.selectPage(page,null);
逻辑删除
- 物理删除:从数据库直接删除
- 逻辑删除:数据库没有被移除,通过一个变量来判断他是否失效
步骤;
- 1.在数据库中增加一个 deleted 字段
- 2.实体类中增加属性
@TableLogic
private Integer deleted
- 3.配置!
// 逻辑删除组件
@Bean
public ISqlInjector sqlInjector(){
return new LogicSqlInjector();
}
性能分析插件
暂时省略,工作环境用到不多
条件构造器 Wrapper
测试代码
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.isNotNull("name") //查询name不为空
.isNotNull("email") //并且邮箱不为空
.ge("age",12); //年龄大于等于12
userMapper.selectList(wrapper).forEach(System.out::println);//查询多个数据
userMapper.selectOne(wrapper);//查询多个数据
Integer count = userMapper.selectCount(wrapper);//查询结果数
wrapper.eq("name","test") //查询name 等于 test
wrapper.between("age",23,30) //查询age在23到30之间
wrapper.notLike("name","e") //模糊查询 notlike %e%
.likeRight("email","t"); //模糊查询 like t%
wrapper.inSql("id","select id from user where id = 3"); //子查询
wrapper.orderByAsc("id"); //通过id进行排序