- 注册乐观锁组件在config包下创建MybatisPlusConfig类
如果在mapper接口类中添加了注解@Mapper 可以省略这个类中的@MapperScan("com.jsxs.mapper"),@EnableTransactionManagement
package com.jsxs.config; import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableTransactionManagement //可省略 @MapperScan("com.jsxs.mapper") //可省略 @Configuration public class MyBatisPlusConfig { // 注册乐观锁插件 @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } }
- 测试一下乐观锁成功案列
// 乐观锁成功 @Test public void testOptimisticLockerInterceptor(){ // 1.查询用户信息 user user = userMapper.selectById(1L); // 2. 修改用户信息 user.setName("sdsd"); user.setEmail("45455@qq.com"); // 3.执行更新操作 int i = userMapper.updateById(user); System.out.println(i); }
5. 测试乐观锁(失败案列->多线程)
// 乐观锁失败->(多线程。线程2抢先线程1) @Test public void testOptimisticLockerInterceptor2(){ /** * 线程1 */ // 1.查询用户信息 user user = userMapper.selectById(1L); // 2. 修改用户信息 user.setName("sdsd111"); user.setEmail("45455@qq.com"); /** * 线程2 */ user user2 = userMapper.selectById(1L); // 2. 修改用户信息 user.setName("sdsd222"); user.setEmail("45455@qq.com"); // 3.抢先执行更新操作user2 int i = userMapper.updateById(user2); // 3.执行更新操作user1 int count = userMapper.updateById(user); System.out.println(i+" "+count); //如果没有乐观锁那么就会覆盖->即后面执行user的会覆盖前面的user2 }
7.查询操作💲
查询全部、通过id、批量查询、多条件查询
// 测试查询通过id @Test public void testSelectById(){ user user = userMapper.selectById(1L); System.out.println("查询单个用户->"+user); } // 测试查询批量 @Test public void testSelectBatchIds(){ List<com.jsxs.pojo.user> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3)); // 利用语法糖遍历链表 users.forEach(System.out::println); } @Test // 测试条件查询 public void testSelectByMap(){ HashMap<String, Object> map = new HashMap<>(); // 自定义查询 map.put("name","李明先生"); List<user> users = userMapper.selectByMap(map); // 利用语法糖遍历链表 users.forEach(System.out::println); }
8.分页查询
分页在网站使用的十分之多!
- 原始的limit进行分页。
- pageHelper进行分页。
- MP其实也内置了分页插件。
如何使用MybatisPlus的分页插件
- 配置拦截器组件即可
package com.jsxs.config; import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor; import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableTransactionManagement @Configuration public class MyBatisPlusConfig { // 注册乐观锁插件 @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } // 分页插件 @Bean public PaginationInterceptor paginationinterceptor(){ PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); return paginationInterceptor; } }
- 进行测试
首页=(n-1)*页面距离
// 测试分页查询 @Test public void testPage(){ // 参数一: 当前页。参数二: 页面大小. Page<user> page = new Page<>(0,5); IPage<user> userIPage = userMapper.selectPage(page, null); page.getRecords().forEach(System.out::println); //查看总条目 System.out.println(page.getTotal()); //查看当前页面 System.out.println(page.getCurrent()); //查看总页数 System.out.println(page.getPages()); //产看一页几条 System.out.println(page.getSize()); }
9.删除操作
删除全部、通过id、批量删除、多条件删除
// 删除操作通过id @Test public void testDeleteByID(){ int i = userMapper.deleteById(7L); System.out.println(i); }
10.逻辑删除
物理删除:从数据库中直接移除。
逻辑删除: 在数据库中没有被移除,而是通过一个变量来让他失效! deleted=0=>deleted=1
管理员可以查看被删除的记录! 防止数据的丢失,类似于回收站。
- 在数据表中增加一个deleted字段
- 实体类中添加这个属性。
package com.jsxs.pojo; import com.baomidou.mybatisplus.annotation.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.Date; @Data @AllArgsConstructor @NoArgsConstructor public class user { // bigint->Long @TableId(type = IdType.AUTO) private Long id; private String name; // int->Integer private Integer age; private String email; @Version // 乐观锁注解 private Integer version; @TableLogic //逻辑删除注解 private Integer deleted; @TableField(fill = FieldFill.INSERT) // 这个意思就是插入的操作,当我们插入的时候会帮助我们自动更新时间 private Date gmtCreate; @TableField(fill = FieldFill.INSERT_UPDATE) //这个意思就是更新的操作,当我们插入然后更新就会自动更新时间 private Date gmtUpdate; }
- 去config进行配置
package com.jsxs.config; import com.baomidou.mybatisplus.core.injector.ISqlInjector; import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector; import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor; import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration public class MyBatisPlusConfig { // 注册乐观锁插件 @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } // 分页插件 @Bean public PaginationInterceptor paginationinterceptor(){ PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); return paginationInterceptor; } // 逻辑删除组件 @Bean public ISqlInjector sqlInjector(){ return new LogicSqlInjector(); } }
- 配置
application.xml
mybatis-plus: global-config: db-config: logic-delete-value: 1 # 逻辑已删除值(默认为 1) logic-not-delete-value: 0 # 逻辑未删除值(默认为 0
- 开始测试:
// 删除操作通过id @Test public void testDeleteByID(){ int i = userMapper.deleteById(7L); System.out.println(i); }
记录依旧在数据库,只不过改变了deleted.
6.
查询一哈,我们发现会自动过滤掉不等于0的deleted信息。
以上的CRUD操作及其扩展,我们都必须精通掌握!会大大提高我们的工作和写项目的效率。







