目录
4.分页
1.乐观锁
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
- 取出记录时,获取当前 version
- 更新时,带上这个 version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果 version 不对,就更新失败
增加数据库的字段:
package com.ruojuan.mp01.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
// Spring Boot 方式
@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;
}
}
乐观锁测试代码:
//测试乐观锁
@Test
public void testLock01() {
User user01 = userMapper.selectById(66L);
User user02 = userMapper.selectById(66L);
user01.setName("leguansuo01");
userMapper.updateById(user01);
user02.setName("leguansuo02");
userMapper.updateById(user02);
}
运行之后会改变name也会改变version(乐观标识)
2.乐观锁与悲观锁的区别
乐观锁:指的是在操作数据的时候非常乐观,乐观地认为别人不会同时修改数据,因此乐观锁默认是不会上锁的,只有在执行更新的时候才会去判断在此期间别人是否修改了数据,如果别人修改了数据则放弃操作,否则执行操作。
冲突比较少的时候, 使用乐观锁(没有悲观锁那样耗时的开销) 由于乐观锁的不上锁特性,所以在性能方面要比悲观锁好,比较适合用在DB的读大于写的业务场景。
悲观锁:指的是在操作数据的时候比较悲观,悲观地认为别人一定会同时修改数据,因此悲观锁在操作数据时是直接把数据上锁,直到操作完成之后才会释放锁,在上锁期间其他人不能操作数据。
冲突比较多的时候, 使用悲观锁(没有乐观锁那么多次的尝试)对于每一次数据修改都要上锁,如果在DB读取需要比较大的情况下有线程在执行数据修改操作会导致读操作全部被挂载起来,等修改线程释放了锁才能读到数据,体验极差。所以比较适合用在DB写大于读的情况。
读取频繁使用乐观锁,写入频繁使用悲观锁。
————————————————
版权声明:本文为CSDN博主「阿彬在上路」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_50966947/article/details/124096601
3.查询构造器
可以根据官网来学习:
条件构造器 | MyBatis-PlusMyBatis-Plus 官方文档https://baomidou.com/pages/10c804/#alleq
4.分页
package com.ruojuan.mp01.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
// Spring Boot 方式
@Configuration
//@MapperScan("按需修改")
public class MybatisPlusConfig {
// /**
// * 旧版
// */
// @Bean
// public OptimisticLockerInterceptor optimisticLockerInterceptor() {
// return new OptimisticLockerInterceptor();
// }
/**
* 新版
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//乐观锁
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
//分页
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
@Test
public void testSelectPage() {
PageDTO<User> page = new PageDTO<>();
page.setCurrent(1);
page.setSize(5);
//select * form user limit (5-1)*5,1
PageDTO<User> pageDTO = userMapper.selectPage(page, null);
System.out.println(pageDTO.getTotal());
List<User> records = pageDTO.getRecords();
records.forEach(t-> System.out.println(t));
}
6.逻辑删除
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
server.port=8080
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/weixin?useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.username=root
#逻辑删除字段名
mybatis-plus.global-config.db-config.logic-delete-field=deleted
# 1表示逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
# 0 表示未删除
mybatis-plus.global-config.db-config.logic-not-delete-value=0
//删除
@Test
public void testDeleteLogic() {
int i = userMapper.deleteById(1L);
System.out.println(i);
}
7.Mybatis的应用
mybatis-plus.mapper-locations=classpath:/mapper/**/*.xml
@Repository
public interface UserMapperXml extends BaseMapper<User> {
List<User> list();
}
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace = "com.zking.mpdemo.mapper.UserMapperXml" ><select id = "list" resultType = "com.zking.mpdemo.model.User" >select * from user;</select></mapper>
public interface UserMapperXml extends BaseMapper<User> {
@Select("select * from user")
List<User> list();
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MpdemoApplication.class)
public class UserMapperXmlTest {
@Autowired
private UserMapperXml userMapperXml;
//使用xml配置的方法
@Test
public void list() {
List<User> list = userMapperXml.list();
list.forEach(t-> System.out.println(t));
}
//mybatis-plus提供的方法
@Test
public void testSelectByID() {
User user = userMapperXml.selectById(2L);
System.out.println(user);
}
}