当前位置:   article > 正文

SpringBoot集成MyBatis-Plus快速入门Demo_springboot整合mybatis plus

springboot整合mybatis plus

目录

1. MyBatis-Plus概述

2. MyBatis-Plus框架结构

3. MyBatis-Plus快速入门

3.1 创建表

3.2 创建工程

3.3 导入依赖

3.4 添加配置文件application.yml,配置数据库信息

3.5 创建实体类(包括自动填充)

3.6 创建配置类(包括配置乐观锁、分页、逻辑删除等插件) 

3.7 编写自动填充handler类

3.8 编写mapper接口类

3.9 编写启动类,添加MapperScan

3.10 编写测试类,CRUD操作

3.11 编写多条件查询测试类

3.12 性能分析

3.12.1 配置文件中添加配置

3.12.2 配置类中添加插件 

4. Demo下载地址


1. MyBatis-Plus概述

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

        官网: https://baomidou.com/

2. MyBatis-Plus框架结构

MyBatis-Plus模块
序号模块功能
1

MyBatis-Plus Core

核心模块,提供了对MyBatis的增强和扩展,包括分页、动态SQL、对象映射等功能。

2

MyBatis-Plus JDBC

JDBC模块,提供了一些实用的方法,如获取数据库连接、执行SQL语句等。

3

MyBatis-Plus Meta

元数据模块,用于解析数据库的元数据信息,包括数据库表结构、字段信息等。

4

MyBatis-Plus PageHelper

分页模块,提供分页查询的功能

5

MyBatis-Plus Generator

代码生成模块,用于自动生成MyBatis的Mapper接口、XML文件和Java实体类。

6

MyBatis-Plus Annotations

注解模块,提供了一些自定义的注解,用于简化代码编写。

7

MyBatis-Plus Extensions

扩展模块,提供了一些实用的扩展功能,如缓存、事务管理等。

3. MyBatis-Plus快速入门

3.1 创建表

        创建数据库mybatis_db

        创建表user

  1. CREATE TABLE user (
  2. id bigint(20) NOT NULL COMMENT '主键ID',
  3. name varchar(30) DEFAULT NULL COMMENT '姓名',
  4. age int(11) DEFAULT NULL COMMENT '年龄',
  5. email varchar(50) DEFAULT NULL COMMENT '邮箱',
  6. create_time datetime DEFAULT NULL COMMENT '创建时间',
  7. update_time datetime DEFAULT NULL COMMENT '修改时间',
  8. version int(11) DEFAULT NULL COMMENT '版本',
  9. deleted int(11) DEFAULT NULL COMMENT '删除标记',
  10. PRIMARY KEY (`id`)
  11. );

        添加测试数据

  1. INSERT INTO `user` VALUES
  2. (1, '张三', 18, 'zs@qq.com', '2024-01-17 10:31:30', '2024-01-17 10:31:30', 1, 0),
  3. (2, '李四', 20, 'ls@qq.com', '2024-01-17 10:31:30', '2024-01-17 10:31:30', 1, 0),
  4. (3, '王五', 28, 'ww@qq.com', '2024-01-17 10:31:30', '2024-01-17 10:31:30', 1, 0),
  5. (4, '赵六', 21, 'zl@qq.com', '2024-01-17 10:31:30', '2024-01-17 10:31:30', 1, 0),
  6. (5, '周七', 24, 'zq@qq.com', '2024-01-17 10:31:30', '2024-01-17 10:31:30', 1, 0);

3.2 创建工程

        设置 Maven

        设置自动导入包 Auto Import

        设置启动注解 Annotation Processors

3.3 导入依赖

  1. <!--引入springboot依赖-->
  2. <parent>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-parent</artifactId>
  5. <version>2.3.4.RELEASE</version>
  6. </parent>
  7. <dependencies>
  8. <!--引入spring-boot启动器依赖, 添加启动器后web工程常用的依赖会自动帮你引入-->
  9. <dependency>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-web</artifactId>
  12. </dependency>
  13. <!--test-->
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-test</artifactId>
  17. <scope>test</scope>
  18. </dependency>
  19. <!--lombok-->
  20. <dependency>
  21. <groupId>org.projectlombok</groupId>
  22. <artifactId>lombok</artifactId>
  23. </dependency>
  24. <!--mybatis-plus-->
  25. <dependency>
  26. <groupId>com.baomidou</groupId>
  27. <artifactId>mybatis-plus-boot-starter</artifactId>
  28. <version>3.0.5</version>
  29. </dependency>
  30. <!--mysql-->
  31. <dependency>
  32. <groupId>mysql</groupId>
  33. <artifactId>mysql-connector-java</artifactId>
  34. <version>8.0.16</version>
  35. </dependency>
  36. </dependencies>
  37. <!--打包-->
  38. <build>
  39. <plugins>
  40. <plugin>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-maven-plugin</artifactId>
  43. </plugin>
  44. </plugins>
  45. </build>

3.4 添加配置文件application.yml,配置数据库信息

  1. # 配置日志输出格式
  2. logging:
  3. pattern:
  4. console: "%clr(%5p) %clr(-){faint} %clr(%-80.80logger{79}){cyan} %clr(:) %m%n"
  5. spring:
  6. # 数据源配置
  7. datasource:
  8. username: root #数据库用户名
  9. password: 163.com #密码
  10. url: jdbc:mysql://localhost:3306/mybatis_db?serverTimezone=GMT%2B8
  11. driver-class-name: com.mysql.cj.jdbc.Driver
  12. # sql输出日志配置
  13. mybatis-plus:
  14. configuration:
  15. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.5 创建实体类(包括自动填充)

  1. package com.miaxis.entity;
  2. import com.baomidou.mybatisplus.annotation.*;
  3. import lombok.Data;
  4. import java.util.Date;
  5. @Data
  6. @TableName("user")
  7. public class User {
  8. @TableId(type = IdType.ID_WORKER) //主键生成策略
  9. private Long id;
  10. private String name;
  11. private Integer age;
  12. private String email;
  13. @TableField(fill = FieldFill.INSERT)
  14. private Date createTime; //自动填充
  15. @TableField(fill = FieldFill.INSERT_UPDATE)
  16. private Date updateTime; //自动填充
  17. @TableField(fill = FieldFill.INSERT)
  18. @Version
  19. private Integer version; //自动填充 当做更新时, version字段会自动加1
  20. @TableLogic //逻辑删除
  21. @TableField(fill = FieldFill.INSERT) //自动填充
  22. private Integer deleted;
  23. }

3.6 创建配置类(包括配置乐观锁、分页、逻辑删除等插件) 

  1. package com.miaxis.config;
  2. import com.baomidou.mybatisplus.core.injector.ISqlInjector;
  3. import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
  4. import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
  5. import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
  6. import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.context.annotation.Profile;
  10. @Configuration
  11. public class Config {
  12. /*配置乐观锁插件*/
  13. @Bean
  14. public OptimisticLockerInterceptor optimisticLockerInterceptor(){
  15. return new OptimisticLockerInterceptor();
  16. }
  17. /*配置分页插件*/
  18. @Bean
  19. public PaginationInterceptor paginationInterceptor(){
  20. return new PaginationInterceptor();
  21. }
  22. /*逻辑删除配置*/
  23. @Bean
  24. public ISqlInjector sqlInjector() {
  25. return new LogicSqlInjector();
  26. }
  27. }

乐观锁:一个人操作时,允许多人可以同时操作,但是同一时刻只能有一个操作。使用一个额外的字段Version,取出记录时,获取当前version,更新时,带上这个version,把version值+1。


逻辑删除(假删除),将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录 。逻辑删除添加后,使用查询, 查询的内容只有标记为0的被查出来

3.7 编写自动填充handler类

添加注解 来去指明 哪些字段需要自动填充

  1. package com.miaxis.handler;
  2. import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
  3. import org.apache.ibatis.reflection.MetaObject;
  4. import org.springframework.stereotype.Component;
  5. import java.util.Date;
  6. /* 1.编写handler 指定 填充的内容
  7. * 2.在实体类当中 添加注解 来去指明 哪些字段需要自动填充
  8. * */
  9. @Component
  10. public class UserMetaObjectHandler implements MetaObjectHandler {
  11. @Override
  12. public void insertFill(MetaObject metaObject) {
  13. this.setFieldValByName("createTime",new Date(),metaObject);
  14. this.setFieldValByName("updateTime",new Date(),metaObject);
  15. this.setFieldValByName("version",1,metaObject);
  16. this.setFieldValByName("deleted",0,metaObject);
  17. }
  18. @Override
  19. public void updateFill(MetaObject metaObject) {
  20. this.setFieldValByName("updateTime",new Date(),metaObject);
  21. }
  22. }

3.8 编写mapper接口类

  1. package com.miaxis.mapper;
  2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  3. import com.miaxis.entity.User;
  4. public interface UserMapper extends BaseMapper<User> {
  5. }

3.9 编写启动类,添加MapperScan

  1. package com.miaxis;
  2. import org.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. @SpringBootApplication
  6. @MapperScan("com.miaxis.mapper")
  7. public class Application {
  8. public static void main(String[] args ) {
  9. SpringApplication.run(Application.class, args );
  10. }
  11. }

3.10 编写测试类,CRUD操作

  1. package com.miaxis;
  2. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  3. import com.miaxis.entity.User;
  4. import com.miaxis.mapper.UserMapper;
  5. import org.junit.jupiter.api.Test;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.boot.test.context.SpringBootTest;
  8. import java.util.Arrays;
  9. import java.util.HashMap;
  10. import java.util.List;
  11. @SpringBootTest
  12. public class ApplicationTests {
  13. @Autowired
  14. private UserMapper userMapper;
  15. @Test
  16. //查询所有内容
  17. public void getAll() { /*如果添加了逻辑删除 默认查询只会查询出标记为0的选项*/
  18. /**查询所有内容*/
  19. List<User> users = userMapper.selectList(null);
  20. /** 打印集合中元素*/
  21. users.forEach(System.out::println);
  22. }
  23. @Test
  24. //create添加数据
  25. public void testInsert(){
  26. User user = new User();
  27. user.setName("fmjava");
  28. user.setAge(1);
  29. user.setEmail("fmjava.com@qq.com");
  30. int result = userMapper.insert(user);
  31. System.out.println(result); //影响的行数
  32. System.out.println(user.getId()); //id自动回填
  33. }
  34. @Test
  35. //read读取数据
  36. public void testSelect(){
  37. //根据单个id查询
  38. User user = userMapper.selectById(2);
  39. System.out.println(user);
  40. }
  41. @Test
  42. //read读取数据
  43. public void testSelect2(){
  44. //多id批量查询
  45. List<User> users = userMapper.selectBatchIds(Arrays.asList(2, 3, 4));
  46. users.forEach(System.out::println);
  47. }
  48. @Test
  49. //read读取数据
  50. public void testSelect3(){
  51. //把需要查询的条件添加到map当中
  52. HashMap<String,Object> map = new HashMap<>();
  53. map.put("name","王五");
  54. map.put("age","28");
  55. List<User> users = userMapper.selectByMap(map);
  56. users.forEach(System.out::println);
  57. }
  58. @Test
  59. //分页查询
  60. public void selectByPage(){
  61. /*当前页, 一页查询多少条记录*/
  62. Page<User> page = new Page<>(2, 3);
  63. userMapper.selectPage(page,null);
  64. /*把查询出所有结果给封装到page对象当中*/
  65. System.out.println("当前页 : "+page.getCurrent());
  66. System.out.println("每页数据 : "+page.getRecords());
  67. System.out.println("每页显示多少条记录 :"+page.getSize());
  68. System.out.println("总记录数 : "+page.getTotal());
  69. System.out.println("总页数 : "+page.getPages());
  70. System.out.println("是否有下一页 : "+page.hasNext());
  71. System.out.println("是否有上一页 : "+page.hasPrevious());
  72. }
  73. @Test
  74. //update修改数据
  75. public void update(){
  76. //先查询
  77. User user = userMapper.selectById(1L);
  78. //修改数据
  79. user.setName("zs1");
  80. //执行更新
  81. int nRet = userMapper.updateById(user);
  82. if(nRet <= 0) {
  83. System.out.println("更新失败");
  84. }else {
  85. System.out.println("更新成功");
  86. }
  87. }
  88. @Test
  89. //update修改数据
  90. public void update2(){
  91. //先查询
  92. User user = userMapper.selectById(1L);
  93. //修改数据
  94. user.setName("zs2");
  95. //模拟取出数据后,数据库中version实际数据比取出的值大,即已被其它线程修改并更新了version
  96. //把版本给变小,发现代码能执行成功,但是没有修改成功
  97. user.setVersion(user.getVersion() -1);
  98. //执行更新
  99. int nRet = userMapper.updateById(user);
  100. if(nRet <= 0) {
  101. System.out.println("更新失败");
  102. }else {
  103. System.out.println("更新成功");
  104. }
  105. }
  106. @Test
  107. //delete删除数据
  108. public void deleteTest(){ /*逻辑删除*/
  109. int i = userMapper.deleteById(1L);
  110. System.out.println(i);
  111. }
  112. @Test
  113. //delete删除数据
  114. public void deleteTest2(){
  115. int i = userMapper.deleteBatchIds(Arrays.asList(2,3,4));
  116. System.out.println(i);
  117. }
  118. @Test
  119. //delete删除数据
  120. public void deleteTest3(){
  121. HashMap<String, Object> hashMap = new HashMap<>();
  122. hashMap.put("name","fmjava2");
  123. userMapper.deleteByMap(hashMap);
  124. }
  125. }

3.11 编写多条件查询测试类

  1. package com.miaxis;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  4. import com.miaxis.entity.User;
  5. import com.miaxis.mapper.UserMapper;
  6. import org.junit.jupiter.api.Test;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.boot.test.context.SpringBootTest;
  9. import java.util.HashMap;
  10. import java.util.List;
  11. import java.util.Map;
  12. @SpringBootTest
  13. public class ApplicationTests2 {
  14. @Autowired
  15. private UserMapper userMapper;
  16. @Test
  17. public void test1(){
  18. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  19. queryWrapper.eq("name","李四")
  20. .ne("age",10);
  21. List<User> users = userMapper.selectList(queryWrapper);
  22. System.out.println(users);
  23. }
  24. @Test
  25. public void test2(){
  26. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  27. queryWrapper.eq("name","李四")
  28. .ge("age",24)
  29. .isNotNull("email");
  30. userMapper.delete(queryWrapper);
  31. }
  32. @Test
  33. public void testSelectCount() {
  34. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  35. queryWrapper.between("age", 20, 30);
  36. Integer count = userMapper.selectCount(queryWrapper);
  37. System.out.println(count);
  38. }
  39. @Test
  40. public void testSelectList() {
  41. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  42. Map<String, Object> map = new HashMap<>();
  43. map.put("id", 3L);
  44. map.put("name", "王五");
  45. map.put("age", 28);
  46. queryWrapper.allEq(map);
  47. List<User> users = userMapper.selectList(queryWrapper);
  48. users.forEach(System.out::println);
  49. }
  50. @Test
  51. public void testSelectMaps() {
  52. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  53. queryWrapper
  54. .notLike("name", "fm")
  55. .likeRight("email", "l");
  56. List<User> maps = userMapper.selectList(queryWrapper);//返回值是Map列表
  57. maps.forEach(System.out::println);
  58. }
  59. @Test
  60. public void testSelectObjs() {
  61. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  62. //queryWrapper.in("id", 1, 2, 3);
  63. queryWrapper.inSql("id", "select id from user where id < 3");
  64. List<Object> objects = userMapper.selectObjs(queryWrapper);//返回值是Object列表
  65. objects.forEach(System.out::println);
  66. }
  67. @Test
  68. public void testUpdate1() {
  69. //修改值
  70. User user = new User();
  71. user.setAge(99);
  72. user.setName("gxq");
  73. //修改条件
  74. UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
  75. userUpdateWrapper
  76. .like("name", "fm")
  77. .or()
  78. .between("age", 20, 30);
  79. int result = userMapper.update(user, userUpdateWrapper);
  80. System.out.println(result);
  81. }
  82. @Test
  83. public void testUpdate2() {
  84. //修改值
  85. User user = new User();
  86. user.setAge(10);
  87. user.setName("myxq");
  88. //修改条件
  89. UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
  90. userUpdateWrapper
  91. .like("name", "A")
  92. .or(i -> i.eq("name", "gxq").ne("age", 20));
  93. int result = userMapper.update(user, userUpdateWrapper);
  94. System.out.println(result);
  95. }
  96. @Test
  97. public void testSelectListOrderBy() {
  98. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  99. queryWrapper.orderByDesc("id");
  100. List<User> users = userMapper.selectList(queryWrapper);
  101. users.forEach(System.out::println);
  102. }
  103. @Test
  104. public void testSelectListLast() {
  105. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  106. /**只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用*/
  107. queryWrapper.last("limit 1");
  108. List<User> users = userMapper.selectList(queryWrapper);
  109. users.forEach(System.out::println);
  110. }
  111. @Test
  112. public void testSelectListColumn() {
  113. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  114. queryWrapper.select("id", "name", "age");
  115. List<User> users = userMapper.selectList(queryWrapper);
  116. users.forEach(System.out::println);
  117. }
  118. @Test
  119. public void testUpdateSet() {
  120. //修改值
  121. User user = new User();
  122. user.setAge(10);
  123. //修改条件
  124. UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
  125. userUpdateWrapper
  126. .like("name", "A")
  127. .set("name", "fmjava")//除了可以查询还可以使用set设置修改的字段
  128. .setSql(" email = 'fmjava@qq.com'");//可以有子查询
  129. int result = userMapper.update(user, userUpdateWrapper);
  130. }
  131. }

3.12 性能分析

        概述:性能分析拦截器,用于输出每条 SQL 语句及其执行时间。SQL 性能执行分析,开发环境使用,超过指定时间,停止运行,有助于发现问题。

3.12.1 配置文件中添加配置

  1. #环境设置:dev、test、prod
  2. spring:
  3. profiles:
  4. active: test

3.12.2 配置类中添加插件 

  1. /**
  2. * SQL 执行性能分析插件
  3. * 开发环境使用,线上不推荐。
  4. * 参数:maxTime: SQL 执行最大时长,超过自动停止运行,有助于发现问题。
  5. * 参数:format: SQL是否格式化,默认false。
  6. */
  7. @Bean
  8. @Profile({"test"}) // 设置 test 环境开启(可以设置多个 {"test","dev","prod"})
  9. public PerformanceInterceptor performanceInterceptor(){
  10. PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
  11. performanceInterceptor.setMaxTime(1000);//超过此处设置的ms sql不会执行
  12. performanceInterceptor.setFormat(true);//格式化sql
  13. return performanceInterceptor;
  14. }

4. Demo下载地址

编译器版本:IntelliJ IDEA 2020.3.2 x64

JDK版本:java 1.8.0_111

下载地址:https://download.csdn.net/download/mickey2007/89059102

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/665626
推荐阅读
相关标签
  

闽ICP备14008679号