当前位置:   article > 正文

Springboot整合mybatis-plus_springboot mybatisplus

springboot mybatisplus

目录

一、Mybatis-plus是什么?

二、快速开始

1.创建表

2.插入数据

3.导入依赖 

4.配置数据源、日志、sql打印

5.编写启动类

 6.pojo、mapper(dao)

7.测试

分页

分页的方法

三、Service CRUD 接口

1、创建service接口

2、创建serviceImpl实现类

 3、测试

四、代码生成器(新) 

1、导入依赖

2、 配置文件

3、编写代码生成器类

 4.启动类

五、扩展功能

1、 执行SQL分析打印

2、逻辑删除

3、乐观锁



一、Mybatis-plus是什么?

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

划重点:mybaits-plus是对mybatis的增强,在mybatis-plus中也可以使用mybatis的功能

官网:简介 | MyBatis-Plus

一般看官网就可以看懂,这个框架是国人开发的 

二、快速开始

1.创建表

  1. CREATE TABLE user
  2. (
  3. id BIGINT(20) NOT NULL COMMENT '主键ID',
  4. name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
  5. age INT(11) NULL DEFAULT NULL COMMENT '年龄',
  6. email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
  7. create_time date NULL DEFAULT NULL COMMENT '创建时间',
  8. update_time date NULL DEFAULT NULL COMMENT '修改时间',
  9. PRIMARY KEY (id)
  10. );

2.插入数据

  1. INSERT INTO user (id, name, age, email) VALUES
  2. (1, 'Jone', 18, 'test1@baomidou.com'),
  3. (2, 'Jack', 20, 'test2@baomidou.com'),
  4. (3, 'Tom', 28, 'test3@baomidou.com'),
  5. (4, 'Sandy', 21, 'test4@baomidou.com'),
  6. (5, 'Billie', 24, 'test5@baomidou.com');

3.导入依赖 

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.projectlombok</groupId>
  4. <artifactId>lombok</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-test</artifactId>
  13. <scope>test</scope>
  14. </dependency>
  15. <dependency>
  16. <groupId>com.baomidou</groupId>
  17. <artifactId>mybatis-plus-boot-starter</artifactId>
  18. <version>3.5.1</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>mysql</groupId>
  22. <artifactId>mysql-connector-java</artifactId>
  23. </dependency>
  24. </dependencies>

4.配置数据源、日志、sql打印

  1. spring:
  2. datasource:
  3. driver-class-name: com.mysql.cj.jdbc.Driver
  4. url: jdbc:mysql://localhost:3306/dubbotest?serverTimezone=UTC
  5. username: root
  6. password: root
  7. logging:
  8. level:
  9. root: info
  10. com.sofwin: debug
  11. mybatis-plus:
  12. configuration:
  13. #打印sql语句
  14. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

5.编写启动类

  1. package com.sofwin;
  2. import org.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. /**
  6. * @author : wentao
  7. * @version : 1.0
  8. */
  9. @SpringBootApplication
  10. @MapperScan(basePackages = "com.sofwin.mapper")
  11. public class App {
  12. public static void main(String[]args){
  13. SpringApplication.run(App.class,args);
  14. }
  15. }

 6.pojo、mapper(dao)

  1. package com.sofwin.pojo;
  2. import com.baomidou.mybatisplus.annotation.*;
  3. import lombok.Data;
  4. import java.util.Date;
  5. /**
  6. * @author : wentao
  7. * @version : 1.0
  8. */
  9. //查看方法的快捷键 alt +7
  10. @Data
  11. //表名注解,标识实体类中对应的表 使用位置实体类
  12. //value 表名
  13. @TableName(value = "user")
  14. public class User {
  15. //标识id为表的主键
  16. //value为id的名称 type为主键自增情况
  17. //auto为数据库自增
  18. //ASSIGN_UUID 通过uuid进行主键的自增
  19. @TableId(value = "id",type = IdType.AUTO)
  20. private Long id;
  21. @TableField("name") //非主键的字段描述
  22. private String name;
  23. private Integer age;
  24. private String email;
  25. private String realName;
  26. //insert的时候触发的时候自动填充
  27. @TableField(fill = FieldFill.INSERT)
  28. private Date createTime;
  29. //update触发的时候自动填充
  30. @TableField(fill = FieldFill.UPDATE)
  31. private Date updateTime;
  32. }

  1. package com.sofwin.mapper;
  2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  3. import com.sofwin.pojo.User;
  4. /**
  5. * @author : wentao
  6. * @version : 1.0
  7. */
  8. public interface UserMapper extends BaseMapper<User> {
  9. }

service实现BashMapper接口 这个接口中由mybatis-plus对单表增删改查的封装

7.测试

  1. package com.sofwin.test;
  2. import com.baomidou.mybatisplus.core.conditions.Wrapper;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  6. import com.baomidou.mybatisplus.core.metadata.IPage;
  7. import com.baomidou.mybatisplus.core.toolkit.Constants;
  8. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  9. import com.sofwin.mapper.UserMapper;
  10. import com.sofwin.pojo.User;
  11. import org.apache.ibatis.annotations.Param;
  12. import org.junit.jupiter.api.Test;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.boot.test.context.SpringBootTest;
  15. import javax.xml.transform.Source;
  16. import java.util.ArrayList;
  17. import java.util.Arrays;
  18. import java.util.List;
  19. import static javafx.scene.input.KeyCode.T;
  20. /**
  21. * @author : wentao
  22. * @version : 1.0
  23. */
  24. @SpringBootTest
  25. public class MybatisPlusTest {
  26. @Autowired
  27. private UserMapper mapper;
  28. //继承 BashMapper的接口的方法
  29. @Test
  30. public void testList(){
  31. IPage<User> page =new Page<User>(1,10);
  32. page= mapper.selectPage(page,null);
  33. List<User> records = page.getRecords();
  34. }
  35. @Test
  36. public void test01(){
  37. // 1.根据 ID 查询
  38. User user = mapper.selectById(1L);
  39. System.out.println("根据ID查询 "+user);
  40. // 2.根据 entity 条件,查询一条记录 ,查询出现多个数据的话会出错
  41. QueryWrapper<User> queryWrapper=new QueryWrapper<User>();
  42. //第一个参数的表的字段名
  43. queryWrapper.like("real_Name","xiao").
  44. eq("age",20);
  45. User user1 = mapper.selectOne(queryWrapper);
  46. System.out.println("根据条件继续查询"+user1);
  47. // 3.查询(根据ID 批量查询)
  48. List list=new ArrayList();
  49. list.add(1);
  50. list.add(2);
  51. list.add(3);
  52. list.add(4);
  53. List<User> list1 = mapper.selectBatchIds(list);
  54. System.out.println("通过id集合查询多条数据 "+list1);
  55. // 4.根据 entity 条件,查询全部记录
  56. QueryWrapper<User> queryWrapper1=new QueryWrapper<User>();
  57. //第一个参数的表的字段名
  58. queryWrapper.like("real_Name","xiao");
  59. List<User> list2 = mapper.selectList(queryWrapper1);
  60. System.out.println("通过条件查询多条数据 "+list2);
  61. // 5.根据 Wrapper 条件,查询总记录数
  62. Long aLong = mapper.selectCount(queryWrapper1);
  63. System.out.println("通过Wrapper条件,查询总记录数 "+aLong);
  64. //分页通过pagehelper进行分页
  65. }
  66. //新增
  67. @Test
  68. public void test02(){
  69. User user=new User();
  70. user.setName("wwwttt111");
  71. int insert = mapper.insert(user);
  72. }
  73. //删除
  74. @Test
  75. public void test03(){
  76. //通过id删除
  77. // int i = mapper.deleteById(6);
  78. //批量删除
  79. Integer [] ids={7,8,9,10};
  80. //批量删除传入的是集合
  81. mapper.deleteBatchIds(Arrays.asList(ids));
  82. }
  83. //修改
  84. @Test
  85. public void test04(){
  86. //通过id进行修改
  87. User user=new User();
  88. user.setId(11L);
  89. user.setName("zhangsna");
  90. user.setAge(11);
  91. user.setEmail("100@11");
  92. int i = mapper.updateById(user);
  93. }
  94. @Test
  95. public void test05(){
  96. //通过条件进行修改 ---利用条件构造器
  97. User user=new User();
  98. user.setName("zhangsnaplus11");
  99. //条件构造器
  100. UpdateWrapper<User> userWrapper=new UpdateWrapper<User>();
  101. userWrapper.eq("id","2");
  102. // LambdaQueryWrapper的类型
  103. // LambdaQueryWrapper<User> lambdaQueryWrapper =new LambdaQueryWrapper<User>();
  104. // lambdaQueryWrapper.eq(User::getRealName,"zhang");
  105. int i = mapper.update(user,userWrapper);
  106. }
  107. }

 注意:mybatis-plus的分页要写一个拦截器才能产生作用

分页

  1. package com.sofwin.config;
  2. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
  3. import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. /**
  7. * @author : wentao
  8. * @version : 1.0
  9. */
  10. //mybatis plus的插件的拦截器
  11. @Configuration
  12. public class PageInteceptor {
  13. @Bean
  14. public MybatisPlusInterceptor getPageInteceptor(){
  15. MybatisPlusInterceptor pageInteceptor= new MybatisPlusInterceptor();
  16. pageInteceptor.addInnerInterceptor(new PaginationInnerInterceptor());
  17. return pageInteceptor;
  18. }
  19. }

分页的方法

  1. @Test
  2. public void testPage() {
  3. //第一页 每页显示3条数据的page对象
  4. Page<User> page = new Page<>(1,3);
  5. Page<User> userPages = userMapper.selectPage(page, null);
  6. long pages = userPages.getPages();//总页数
  7. System.out.println(pages);
  8. long current = userPages.getCurrent();//当前页
  9. System.out.println(current);
  10. List<User> records = userPages.getRecords(); //查询数据集合
  11. System.out.println(records);
  12. long total = userPages.getTotal();//总记录数
  13. System.out.println(total);
  14. boolean hasNext = userPages.hasNext();//是否有下一页
  15. System.out.println(hasNext);
  16. boolean hasPrevious = userPages.hasPrevious();//是否有上一页
  17. System.out.println(hasPrevious);
  18. }

  注意:mybatis-plus的还有一个功能是在新增和修改的时候自动添加时间

1.我们要在pojo中设置

2.写一个类实现 MetaObjectHandler接口

  1. package com.sofwin.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. /**
  7. * @author : wentao
  8. * @version : 1.0
  9. */
  10. //当新增或者修改的时候自动添加时间
  11. @Component
  12. public class DateHander implements MetaObjectHandler {
  13. @Override
  14. public void insertFill(MetaObject metaObject) {
  15. this.strictInsertFill(metaObject,"createTime",Date.class,new Date());
  16. }
  17. @Override
  18. public void updateFill(MetaObject metaObject) {
  19. this.strictUpdateFill(metaObject,"updateTime",Date.class,new Date());
  20. }
  21. }

三、Service CRUD 接口

1、创建service接口

实现IService接口

  1. package com.sofwin.service;
  2. import com.baomidou.mybatisplus.extension.service.IService;
  3. import com.sofwin.pojo.User;
  4. /**
  5. * @author : wentao
  6. * @version : 1.0
  7. */
  8. public interface UserService extends IService<User> {
  9. }

2、创建serviceImpl实现类

实现userservice接口继承ServiceImpl<M,T>

M代表的mapper  T代表实体类

  1. package com.sofwin.service.impl;
  2. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  3. import com.sofwin.mapper.UserMapper;
  4. import com.sofwin.pojo.User;
  5. import com.sofwin.service.UserService;
  6. import org.springframework.stereotype.Service;
  7. /**
  8. * @author : wentao
  9. * @version : 1.0
  10. */
  11. @Service
  12. //第一个泛型是mapper的 第一个是实体类的
  13. public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService{
  14. }

 3、测试

  1. package com.sofwin.test;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.sofwin.pojo.User;
  4. import com.sofwin.service.UserService;
  5. import org.junit.jupiter.api.Test;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.boot.test.context.SpringBootTest;
  8. /**
  9. * @author : wentao
  10. * @version : 1.0
  11. */
  12. @SpringBootTest
  13. public class ServiceTest {
  14. @Autowired
  15. private UserService userService;
  16. @Test
  17. public void test(){
  18. LambdaQueryWrapper<User> lambdaQueryWrapper=new LambdaQueryWrapper<>();
  19. lambdaQueryWrapper.eq(User::getName,"wwwttt")
  20. ;
  21. //eq 等于 nq不等于
  22. //gt 大于 ge 大于等于 lt小于 le小于等于
  23. // .or().进行拼接 正常. 接着. 是and
  24. userService.getOne(lambdaQueryWrapper);
  25. }
  26. }

接口的具体方法官网:CRUD 接口 | MyBatis-Plus 

四、代码生成器(新) 

我使用的新版的版本要大于等于3.5.1 

1、导入依赖

  1. <dependencies>
  2. <!-- 代码生成器 -->
  3. <dependency>
  4. <groupId>com.baomidou</groupId>
  5. <artifactId>mybatis-plus-generator</artifactId>
  6. <version>3.5.3</version>
  7. </dependency>
  8. <dependency>
  9. <groupId>com.baomidou</groupId>
  10. <artifactId>mybatis-plus-boot-starter</artifactId>
  11. <version>3.5.2</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.projectlombok</groupId>
  15. <artifactId>lombok</artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>mysql</groupId>
  19. <artifactId>mysql-connector-java</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-web</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-freemarker</artifactId>
  28. </dependency>
  29. <!--文档框架 swagger 要跟springboot的低版本兼容 2.4.8-->
  30. <dependency>
  31. <groupId>io.springfox</groupId>
  32. <artifactId>springfox-boot-starter</artifactId>
  33. <version>3.0.0</version>
  34. </dependency>
  35. </dependencies>

2、 配置文件

  1. server:
  2. port: 80
  3. spring:
  4. datasource:
  5. driver-class-name: com.mysql.cj.jdbc.Driver
  6. url: jdbc:mysql://localhost:3306/dubbotest?serverTimezone=UTC
  7. username: root
  8. password: root

3、编写代码生成器类

  1. package com.sofwin.controller;
  2. import com.baomidou.mybatisplus.generator.FastAutoGenerator;
  3. import com.baomidou.mybatisplus.generator.config.OutputFile;
  4. import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.Mapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import java.io.OutputStream;
  10. import java.util.Collections;
  11. /**
  12. * <p>
  13. * 前端控制器
  14. * </p>
  15. *
  16. * @author wentao
  17. * @since 2022-08-24
  18. */
  19. @RestController
  20. public class GeneratorController {
  21. @GetMapping("/gen")
  22. public String test(){
  23. //url是数据库的url 账户 密码
  24. FastAutoGenerator.create("jdbc:mysql://localhost:3306/dubbotest?serverTimezone=UTC", "root", "root")
  25. .globalConfig(builder -> {
  26. builder.author("wentao") // 设置作者
  27. .enableSwagger() // 开启 swagger 模式
  28. .fileOverride() // 覆盖已生成文件
  29. .outputDir("D://mybatisplus-generator"); // 指定输出目录
  30. })
  31. .packageConfig(builder -> {
  32. builder.parent("com.sofwin") // 设置父包名
  33. .moduleName("system") // 设置父包模块名
  34. .pathInfo(Collections.singletonMap(OutputFile.xml, "D://mybatisplus-generator")); // 设置mapperXml生成路径
  35. })
  36. .strategyConfig(builder -> {
  37. builder.addInclude("user") ;// 设置需要生成的表名
  38. // .addTablePrefix("t_", "c_"); // 设置过滤表前缀
  39. })
  40. .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
  41. .execute();
  42. return "ok";
  43. }
  44. }

 4.启动类

  1. package com.sofwin;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import springfox.documentation.swagger2.annotations.EnableSwagger2;
  5. /**
  6. * @author : wentao
  7. * @version : 1.0
  8. */
  9. @SpringBootApplication
  10. @EnableSwagger2
  11. public class App {
  12. public static void main(String[]args){
  13. SpringApplication.run(App.class,args);
  14. }
  15. }

启动访问即可生成 

五、扩展功能

1、 执行SQL分析打印

导入依赖

  1. <!--监控sql的执行-->
  2. <dependency>
  3. <groupId>p6spy</groupId>
  4. <artifactId>p6spy</artifactId>
  5. <version>3.9.1</version>
  6. </dependency>

 配置yml

  1. spring:
  2. datasource:
  3. driver-class-name: com.p6spy.engine.spy.P6SpyDriver
  4. url: jdbc:p6spy:mysql://localhost:3306/dubbotest?serverTimezone=UTC
  5. username: root
  6. password: root

只能照着之前的dataSource的稍微改一下即可

 spy.properties

  1. #3.2.1以上使用
  2. modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
  3. #3.2.1以下使用或者不配置
  4. #modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
  5. # 自定义日志打印
  6. logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
  7. #日志输出到控制台
  8. appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
  9. # 使用日志系统记录 sql
  10. #appender=com.p6spy.engine.spy.appender.Slf4JLogger
  11. # 设置 p6spy driver 代理
  12. deregisterdrivers=true
  13. # 取消JDBC URL前缀
  14. useprefix=true
  15. # 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
  16. excludecategories=info,debug,result,commit,resultset
  17. # 日期格式
  18. dateformat=yyyy-MM-dd HH:mm:ss
  19. # 实际驱动可多个
  20. #driverlist=org.h2.Driver
  21. # 是否开启慢SQL记录
  22. outagedetection=true
  23. # 慢SQL记录标准 2 秒
  24. outagedetectioninterval=2

执行的时候就会出现 

代表成功 

2、逻辑删除

一般在企业中,我们进行删除,不是一般会设置一个字段,例如规定0位正常 1位删除,一般删除是进行修改,如果不使用逻辑删除,就是看着比较别扭,但是也是可以实现的,这里mybatis-plus给我们提供了这个逻辑删除的功能

设置yml 

  1. #逻辑删除
  2. global-config:
  3. db-config:
  4. logic-delete-field: status # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
  5. logic-delete-value: 1 # 逻辑已删除值(默认为 1)
  6. logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

设置pojo的属性

  1. package com.sofwin.pojo;
  2. import com.baomidou.mybatisplus.annotation.*;
  3. import lombok.Data;
  4. import java.util.Date;
  5. /**
  6. * @author : wentao
  7. * @version : 1.0
  8. */
  9. //查看方法的快捷键 alt +7
  10. @Data
  11. //表名注解,标识实体类中对应的表 使用位置实体类
  12. //value 表名
  13. @TableName(value = "user")
  14. public class User {
  15. //标识id为表的主键
  16. //value为id的名称 type为主键自增情况
  17. //auto为数据库自增
  18. //ASSIGN_UUID 通过uuid进行主键的自增
  19. @TableId(value = "id",type = IdType.AUTO)
  20. private Long id;
  21. @TableField("name") //非主键的字段描述
  22. private String name;
  23. private Integer age;
  24. private String email;
  25. private String realName;
  26. //insert的时候触发的时候自动填充
  27. @TableField(fill = FieldFill.INSERT)
  28. private Date createTime;
  29. //update触发的时候自动填充
  30. @TableField(fill = FieldFill.UPDATE)
  31. private Date updateTime;
  32. //乐观锁的 要设置默认为1
  33. @Version
  34. private Integer version;
  35. @TableLogic
  36. private Integer status;
  37. }

测试 

  1. @Test
  2. public void test03(){
  3. //通过id删除
  4. mapper.deleteById(14);
  5. // mapper.deleteBatchIds(Arrays.asList(ids));
  6. }

 

执行delete其实执行的就是修改 

3、乐观锁

当要更新一条记录的时候,希望这条记录没有被别人更新乐观锁实现方式

添加bean对象

  1. @Bean
  2. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  3. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  4. interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
  5. return interceptor;
  6. }

在pojo中 

  1. @Version
  2. private Integer version;

 注意:version这个字段一定要设置默认值为1、

  1. //乐观锁 一般都是先进行查找 然后进行设置
  2. @Test
  3. public void test14(){
  4. //通过id进行修改
  5. User user = mapper.selectById(11);
  6. user.setAge(10);
  7. User user1 = mapper.selectById(11);
  8. user1.setAge(20);
  9. mapper.updateById(user);
  10. mapper.updateById(user1);
  11. }

  


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

闽ICP备14008679号