MyBatisPlus简介

1.是什么

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

2.为什么

合理封装,简化开发

入门

1.创建数据库

2.创建工程

3.引入依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.atguigu</groupId>
  6. <artifactId>mybatisplus</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>mybatisplus</name>
  9. <description>Demo project for Spring Boot</description>
  10. <properties>
  11. <java.version>1.8</java.version>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  14. <spring-boot.version>2.2.1.RELEASE</spring-boot.version>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-test</artifactId>
  24. <scope>test</scope>
  25. <exclusions>
  26. <exclusion>
  27. <groupId>org.junit.vintage</groupId>
  28. <artifactId>junit-vintage-engine</artifactId>
  29. </exclusion>
  30. </exclusions>
  31. </dependency>
  32. <!--mybatis-plus-->
  33. <dependency>
  34. <groupId>com.baomidou</groupId>
  35. <artifactId>mybatis-plus-boot-starter</artifactId>
  36. <version>3.0.5</version>
  37. </dependency>
  38. <!--mysql-->
  39. <dependency>
  40. <groupId>mysql</groupId>
  41. <artifactId>mysql-connector-java</artifactId>
  42. </dependency>
  43. <!--lombok用来简化实体类-->
  44. <dependency>
  45. <groupId>org.projectlombok</groupId>
  46. <artifactId>lombok</artifactId>
  47. </dependency>
  48. </dependencies>
  49. <dependencyManagement>
  50. <dependencies>
  51. <dependency>
  52. <groupId>org.springframework.boot</groupId>
  53. <artifactId>spring-boot-dependencies</artifactId>
  54. <version>${spring-boot.version}</version>
  55. <type>pom</type>
  56. <scope>import</scope>
  57. </dependency>
  58. </dependencies>
  59. </dependencyManagement>
  60. <build>
  61. <plugins>
  62. <plugin>
  63. <groupId>org.apache.maven.plugins</groupId>
  64. <artifactId>maven-compiler-plugin</artifactId>
  65. <version>3.8.1</version>
  66. <configuration>
  67. <source>1.8</source>
  68. <target>1.8</target>
  69. <encoding>UTF-8</encoding>
  70. </configuration>
  71. </plugin>
  72. <plugin>
  73. <groupId>org.springframework.boot</groupId>
  74. <artifactId>spring-boot-maven-plugin</artifactId>
  75. <version>2.2.10.RELEASE</version>
  76. <configuration>
  77. <mainClass>com.atguigu.mpdemo.MpdemoApplication</mainClass>
  78. </configuration>
  79. <executions>
  80. <execution>
  81. <id>repackage</id>
  82. <goals>
  83. <goal>repackage</goal>
  84. </goals>
  85. </execution>
  86. </executions>
  87. </plugin>
  88. </plugins>
  89. </build>

4.创建启动类

  1. @SpringBootApplication
  2. public class MybatisPlusApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(MybatisPlusApplication.class,args);
  5. }
  6. }

5.实现MP

(1)创建实体类

  1. @Data
  2. public class User {
  3. private Long id;
  4. private String name;
  5. private Integer age;
  6. private String email;
  7. }

(2) 创建配置文件 application.properties

  1. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  2. spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8
  3. spring.datasource.username=root
  4. spring.datasource.password=123123

(3)添加mapper接口

  1. @Repository
  2. public interface UserMapper extends BaseMapper<User> {
  3. }

(4) 启动类添加注解

  1. @SpringBootApplication
  2. @MapperScan("com.atguigu.mybatisplus.mapper")
  3. public class MybatisPlusApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(MybatisPlusApplication.class,args);
  6. }
  7. }

(5) 测试

  1. @SpringBootTest
  2. public class MybatisPlusApplicationTest {
  3. @Autowired
  4. private UserMapper userMapper;
  5. @Test
  6. public void getAll(){
  7. List<User> users = userMapper.selectList(null);
  8. users.forEach(System.out::println);
  9. }
  10. }

MP配置日志输出

  1. #mybatis日志
  2. mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

MP添加信息+主键策略

1.添加用户信息

  1. @Test
  2. public void addUser(){
  3. User user = new User();
  4. user.setName("zhang3");
  5. user.setAge(33);
  6. user.setEmail("zhang3@qq.com");
  7. userMapper.insert(user);
  8. }

2.主键策略

(1)策略 => 自增 , UUID : 随机字符串 , Redis , MP生成 , AUTO : 自动 , INPUT : 手动输入 , NONE : 不使用 , ID_WORKER : 根据算法生成全局序列(数字) , ID_WORKER_STR : 根据算法生成全局序列(字符串)

3.MP修改数据

  1. @Test
  2. public void updateUser(){
  3. User user = new User();
  4. user.setId(1366632417028227073L);
  5. user.setName("zhang3UPUP");
  6. userMapper.updateById(user);
  7. }

4.MP实现自动填充

  1. 1修改表字段
  2. User表中添加datetime类型的新的字段 create_timeupdate_time
  3. 2、增加实体字段
  4. 1)增加字段
  5. private Date createTime;
  6. private Date updateTime;
  7. 2)添加注解
  8. @TableField(fill = FieldFill.INSERT)
  9. private Date createTime;
  10. @TableField(fill = FieldFill.INSERT_UPDATE)
  11. private Date updateTime;
  12. 3、添加控制器
  13. @Component
  14. public class MyMetaObjectHandler implements MetaObjectHandler {
  15. @Override
  16. public void insertFill(MetaObject metaObject) {
  17. this.setFieldValByName("createTime",new Date(),metaObject);
  18. this.setFieldValByName("updateTime",new Date(),metaObject);
  19. }
  20. @Override
  21. public void updateFill(MetaObject metaObject) {
  22. this.setFieldValByName("updateTime",new Date(),metaObject);
  23. }
  24. }

5.乐观锁

MP实现乐观锁

(1)增加字段

数据库增加字段 version

(2)添加注解实现自动填充

@TableField(fill = FieldFill.INSERT)

private Integer version;

(3)添加乐观锁注解

@Version

@TableField(fill = FieldFill.INSERT)

private Integer version;

(4)添加插件

  1. @Configuration
  2. @EnableTransactionManagement
  3. @MapperScan("com.atguigu.mybatisplus.mapper")
  4. public class MybatisPlusConfig {
  5. /**
  6. * 乐观锁插件
  7. */
  8. @Bean
  9. public OptimisticLockerInterceptor optimisticLockerInterceptor() {
  10. return new OptimisticLockerInterceptor();
  11. }
  12. }

(5) 测试

要想用到乐观锁,就必须先实现 => 先查询后修改

  1. @Test
  2. public void updateUser(){
  3. User user = userMapper.selectById(1366652515570946050L);
  4. user.setName("wang5");
  5. userMapper.updateById(user);
  6. }

MP实现基本查询

1.根据id查询

User user = userMapper.selsectById(xxxxxxxx);

2.根据集合查询

  1. public void selectByIds(){
  2. List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
  3. users.forEach(System.out::println);
  4. }

3.简单查询

  1. @Test
  2. public void selectByMap(){
  3. Map<String,Object> map = new HashMap<>();
  4. map.put("name","wang5");
  5. map.put("age",55);
  6. List<User> users = userMapper.selectByMap(map);
  7. users.forEach(System.out::println);
  8. }

分页查询

(1)添加插件

  1. /**
  2. * 分页插件
  3. */
  4. @Bean
  5. public PaginationInterceptor paginationInterceptor() {
  6. return new PaginationInterceptor();
  7. }

(2)实现分页

  1. @Test
  2. public void selectByPage(){
  3. Page<User> page = new Page<>(1,3);
  4. //IPage<User> userIPage = userMapper.selectPage(page, null);
  5. userMapper.selectPage(page, null);
  6. List<User> records = page.getRecords();
  7. records.forEach(System.out::println);
  8. System.out.println(page.getCurrent());
  9. System.out.println(page.getPages());
  10. System.out.println(page.getSize());
  11. System.out.println(page.getTotal());
  12. System.out.println(page.hasNext());
  13. System.out.println(page.hasPrevious());
  14. }

MP实现删除数据

1.根据id删除

  1. @Test
  2. public void delUser(){
  3. int i = userMapper.deleteById(1366652515570946050L);
  4. System.out.println(i);
  5. }

2.批量删除

  1. @Test
  2. public void delUsers(){
  3. int i = userMapper.deleteBatchIds(Arrays.asList(1366632417028227073L,1366640077500923905L));
  4. System.out.println(i);
  5. }

逻辑删除

  • 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据
  • 逻辑删除:假删除,将数据中代表是否被删除字段修改为”被删除状态”,之后在数据库中仍然能看到此条数据记录

(1) 修改表 添加字段

deleted tinyint 0 (0为存在,1为删除)

(2)添加注解,实现自动填充

  1. @TableField(fill = fieldFill.INSERT)
  2. private Integer deleted;
  3. this.setFieldValByName("deleted",0,metaObject);

(3)添加逻辑删除注解

  1. @TableLogic
  2. @TableField(fill = fieldFill.INSERT)
  3. private Integer deleted;

(4) 添加配置

mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

(5)添加插件

  1. @Bean
  2. public ISqlInjector sqlInjector() {
  3. return new LogicSqlInjector();
  4. }

MP实现条件查询

(1) eq 等于 = eq(“name”, “老王”)—->name = ‘老王’

  1. ne 不等于 <> ne("name", "老王")--->name <> '老王'

(2) ge 等于 >= ge(“age”, 18)--->age >= 18

  1. gt 大于 > gt("age", 18)`--->`age > 18
  2. le 小于等于<= le("age", 18)`--->`age <= 18
  3. lt 小于 < lt("age", 18)`--->`age < 18

(3) like LIKE ‘%值%’

  1. like("name", "王")--->name like '%王%'

(4) between BETWEEN 值1 AND 值2

  1. between("age", 18, 30)`--->`age between 18 and 30

(5) orderByDesc ORDER BY 字段, … DESC

(6) select 设置查询字段

  1. orderByDesc("id", "name")--->order by id DESC,name DESC

测试

  1. @Test
  2. public void selectByInfo(){
  3. QueryWrapper<User> wrapper = new QueryWrapper<>();
  4. // (1) eq、ne
  5. //wrapper.eq("name","zhang3");
  6. //(2) ge、gt、le、lt
  7. //wrapper.ge("age",18);
  8. //(3) like
  9. //wrapper.like("name","J");
  10. //(4) between
  11. //wrapper.between("age",18,28);
  12. //(5) orderByDesc
  13. wrapper.orderByDesc("age");
  14. //(6) select
  15. wrapper.select("id","name","age");
  16. List<User> users = userMapper.selectList(wrapper);
  17. users.forEach(System.out::println);
  18. }