1.自动填充
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String nickname;
private String password;
private String salt;
/**
* 注册时间
*/
@TableField(fill = FieldFill.INSERT)
private Date registerDate;
/**
* 登录次数
*/
private Integer loginCount;
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
}
注意:@TabelName不能缺,否则填充失败
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
按道理不需要加@Mapper,但不知道为什么不加会报错
实现接口:
@Component//注解不要忘记,表示交给Spring容器管理
//用于自动填充的工具类,规定必须要实现这个接口
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject)
{
this.setFieldValByName("registerDate",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
//当使用mybatis plus实现添加操作时会执行这个方法
}
@Override
public void updateFill(MetaObject metaObject)
{
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
测试添加:
@Autowired
private UserMapper userMapper;
@Test
public void updateUser(){
User user = new User();
user.setId(2);
user.setSalt("3241341");
userMapper.updateById(user);
// User u2 = new User();
// u2.setId(33);
// u2.setNickname("小红");
// u2.setPassword("12341");
// u2.setSalt("efswagq");
// userMapper.insert(u2);
}
运行插入:
更新:
2.乐观锁
数据库中添加版本号:
version
添加插件:
@Configuration
@MapperScan("按需修改")
public class MybatisPlusConfig {
/**
* 旧版
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
/**
* 新版
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
}
在实体类的字段上加上@Version注解
@Version
private Integer version;
支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
整数类型下 newVersion = oldVersion + 1
newVersion 会回写到 entity 中
仅支持 updateById(id) 与 update(entity, wrapper) 方法
在 update(entity, wrapper) 方法下, wrapper 不能复用!!!
可以自动填充的方式设置版本号的默认值。
3.分页
配置分页插件:
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
测试:
@Test
public void testPage(){
//创建page对象 传入两个参数:当前页和每页显示记录数
Page<User>page = new Page<>(1,3);
//调用mybatisplus分页查询的方法 把分页所有数据封装到page对象中
userMapper.selectPage(page,null);
page.getRecords().forEach(System.out::println);
}
配置类上面一定要加@Configuration,否则没有插件效果
4.条件查询
@Test
public void testSelect(){
//执行复杂查询操作
QueryWrapper<User> wrapper = new QueryWrapper<>();
// wrapper.ge("age",30);//查询age>=30的记录
// List<User> users = userMapper.selectList(wrapper);
// System.out.println(users);
wrapper.eq("nickname","小明");//nickname=小明的数据
List<User> users = userMapper.selectList(wrapper);
System.out.println(users);
}
输出:
[User(id=2, nickname=小明, password=123, salt=3241341, registerDate=null, loginCount=null, updateTime=Thu Jul 29 11:28:56 CST 2021, version=null)]
指定查询的列:
wrapper.select("nickname");
List<User> users = userMapper.selectList(wrapper);
for(User user:users)
System.out.println(user.getNickname());