一、逻辑删除(假删除)
1、application.yml 加入配置(如果你的默认值和mp默认的一样,该配置可无):
mybatis-plus:
global-config:
db-config:
# 全局配置 也可以在注解上指定
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
2、注册 Bean(3.1.1开始不再需要这一步):
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyBatisPlusConfiguration {
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
}
3、实体类字段上加上@TableLogic
注解
@Data
public class User {
@TableLogic
private Boolean locked;
}
3、使用mp自带方法删除和查找都会附带逻辑删除功能
删除时 update user set locked=1 where id =1 and locked=0
查找时 select * from user where locked=0
二、乐观锁
1、说明
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
2、插件配置
@Configuration
public class MybatisPlusConfiguration {
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
3、注解实体字段 @Version
@Data
public class User {
@Version
private Integer version;
}
4、注意
- 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
- 整数类型下
newVersion = oldVersion + 1
-
newVersion
会回写到entity
中 - 仅支持
updateById(id)
与update(entity, wrapper)
方法 - 在 update(entity, wrapper) 方法下, wrapper 不能复用!!!
5、栗子
@Test
public void testVersion() {
User user = new User();
user.setUid(1);
user.setVersion(10);
int update = userMapper.update(user, null);
log.debug(update + "");
}
三、ActiveRecord
1、说明
活动记录,是一种领域模型模式,
通俗的来说就是数据表对应的实体类只需继承 Model 类即可实现基本 CRUD 操作
2、实体类
@EqualsAndHashCode(callSuper = true)
@Data
public class User extends Model<User> {
}
3、UserMapper
注意虽然可以不需要UserMapper的接口,但底层还是实际还是调用了,所以比必须声明
public interface UserMapper extends BaseMapper<User> {
}
4、基本操作
更新操作
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class UserMapperARTest {
@Test
public void update(){
User user = new User();
user.setUid(1);
user.setUsername("测试AR模式");
boolean isSuccess = user.updateById();
log.debug(""+ isSuccess);
}
}
查询操作
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class UserMapperARTest {
@Test
public void select() {
// 其它操作跟Mapper通用方法一样
User user = new User();
int result = user.selectCount(new QueryWrapper<User>().eq("locked", 0));
log.debug("" + result);
}
}
分页操作
@Test
public void selectPage() {
User user = new User();
IPage<User> page = user.selectPage(new Page<>(1, 10), new QueryWrapper<User>().like("username", "test"));
List<User> users = page.getRecords();
users.forEach(u -> u.getUsername());
}