Springboot整合mybatis-plus

目录

一、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.创建表

CREATE TABLE user
(
    id BIGINT(20) NOT NULL COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    create_time date NULL  DEFAULT  NULL COMMENT '创建时间',
    update_time date NULL  DEFAULT  NULL COMMENT '修改时间',
    PRIMARY KEY (id)
);

2.插入数据

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, '[email protected]'),
(2, 'Jack', 20, '[email protected]'),
(3, 'Tom', 28, '[email protected]'),
(4, 'Sandy', 21, '[email protected]'),
(5, 'Billie', 24, '[email protected]');

3.导入依赖 


        
            org.projectlombok
            lombok
        
        
            org.springframework.boot
            spring-boot-starter
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            com.baomidou
            mybatis-plus-boot-starter
            3.5.1
        
        
            mysql
            mysql-connector-java
        

    

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

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/dubbotest?serverTimezone=UTC
    username: root
    password: root
logging:
  level:
    root: info
    com.sofwin: debug
mybatis-plus:
  configuration:
  #打印sql语句
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

5.编写启动类

package com.sofwin;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author : wentao
 * @version : 1.0
 */
@SpringBootApplication
@MapperScan(basePackages = "com.sofwin.mapper")
public class App {
    public static void main(String[]args){
        SpringApplication.run(App.class,args);
    }
}

 6.pojo、mapper(dao)

package com.sofwin.pojo;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

import java.util.Date;

/**
 * @author : wentao
 * @version : 1.0
 */
//查看方法的快捷键  alt +7
    @Data
    //表名注解,标识实体类中对应的表  使用位置实体类
    //value 表名
    @TableName(value = "user")
    public class User {
    //标识id为表的主键
    //value为id的名称  type为主键自增情况
    //auto为数据库自增
    //ASSIGN_UUID 通过uuid进行主键的自增
        @TableId(value = "id",type = IdType.AUTO)
        private Long id;
        @TableField("name")  //非主键的字段描述
        private String name;
        private Integer age;
        private String email;
        private  String realName;
    //insert的时候触发的时候自动填充
        @TableField(fill = FieldFill.INSERT)
        private Date createTime;
        //update触发的时候自动填充
        @TableField(fill = FieldFill.UPDATE)
        private Date updateTime;


    }

package com.sofwin.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sofwin.pojo.User;

/**
 * @author : wentao
 * @version : 1.0
 */
public interface UserMapper extends BaseMapper {
}

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

7.测试

package com.sofwin.test;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sofwin.mapper.UserMapper;
import com.sofwin.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.xml.transform.Source;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static javafx.scene.input.KeyCode.T;

/**
 * @author : wentao
 * @version : 1.0
 */
@SpringBootTest
public class MybatisPlusTest {
    @Autowired
    private UserMapper mapper;

//继承 BashMapper的接口的方法

    @Test
    public  void testList(){
      IPage page =new Page(1,10);
      page=  mapper.selectPage(page,null);
        List records = page.getRecords();
    }
    @Test
    public  void test01(){
    // 1.根据 ID 查询
        User user = mapper.selectById(1L);
        System.out.println("根据ID查询 "+user);
    // 2.根据 entity 条件,查询一条记录 ,查询出现多个数据的话会出错
        QueryWrapper queryWrapper=new   QueryWrapper();
           //第一个参数的表的字段名
        queryWrapper.like("real_Name","xiao").
                eq("age",20);
        User user1 = mapper.selectOne(queryWrapper);
        System.out.println("根据条件继续查询"+user1);
    // 3.查询(根据ID 批量查询)
        List list=new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        List list1 = mapper.selectBatchIds(list);
        System.out.println("通过id集合查询多条数据 "+list1);
    // 4.根据 entity 条件,查询全部记录
        QueryWrapper queryWrapper1=new   QueryWrapper();
        //第一个参数的表的字段名
        queryWrapper.like("real_Name","xiao");
        List list2 = mapper.selectList(queryWrapper1);
        System.out.println("通过条件查询多条数据 "+list2);
    // 5.根据 Wrapper 条件,查询总记录数
        Long aLong = mapper.selectCount(queryWrapper1);
        System.out.println("通过Wrapper条件,查询总记录数 "+aLong);
        //分页通过pagehelper进行分页
    }
    //新增
    @Test
    public  void test02(){
        User user=new User();
        user.setName("wwwttt111");
        int insert = mapper.insert(user);
    }
    //删除
    @Test
    public  void test03(){
        //通过id删除
//        int i = mapper.deleteById(6);
        //批量删除
        Integer [] ids={7,8,9,10};
        //批量删除传入的是集合
        mapper.deleteBatchIds(Arrays.asList(ids));
    }

    //修改
    @Test
    public  void test04(){
        //通过id进行修改
        User user=new User();
        user.setId(11L);
        user.setName("zhangsna");
        user.setAge(11);
        user.setEmail("100@11");
        int i = mapper.updateById(user);
    }
    @Test
    public  void test05(){
       //通过条件进行修改  ---利用条件构造器
        User user=new User();

        user.setName("zhangsnaplus11");
        //条件构造器
        UpdateWrapper userWrapper=new UpdateWrapper();
        userWrapper.eq("id","2");
//        LambdaQueryWrapper的类型
//        LambdaQueryWrapper lambdaQueryWrapper =new LambdaQueryWrapper();
//        lambdaQueryWrapper.eq(User::getRealName,"zhang");
        int i = mapper.update(user,userWrapper);
    }

}

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

分页

package com.sofwin.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author : wentao
 * @version : 1.0
 */
//mybatis plus的插件的拦截器
@Configuration
public class PageInteceptor  {

    @Bean
    public MybatisPlusInterceptor getPageInteceptor(){
        MybatisPlusInterceptor pageInteceptor= new MybatisPlusInterceptor();
       pageInteceptor.addInnerInterceptor(new PaginationInnerInterceptor());
       return  pageInteceptor;
    }
}

分页的方法

@Test
public void testPage() {
    //第一页 每页显示3条数据的page对象
    Page page = new Page<>(1,3);
    Page userPages = userMapper.selectPage(page, null);
    long pages = userPages.getPages();//总页数
    System.out.println(pages);
    long current = userPages.getCurrent();//当前页
    System.out.println(current);
    List records = userPages.getRecords(); //查询数据集合
    System.out.println(records);
    long total = userPages.getTotal();//总记录数
    System.out.println(total);
    boolean hasNext = userPages.hasNext();//是否有下一页
    System.out.println(hasNext);
    boolean hasPrevious = userPages.hasPrevious();//是否有上一页
    System.out.println(hasPrevious);
}

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

1.我们要在pojo中设置

2.写一个类实现 MetaObjectHandler接口

package com.sofwin.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @author : wentao
 * @version : 1.0
 */
//当新增或者修改的时候自动添加时间
@Component
public class DateHander implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject,"createTime",Date.class,new Date());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
           this.strictUpdateFill(metaObject,"updateTime",Date.class,new Date());
    }
}

三、Service CRUD 接口

1、创建service接口

实现IService接口

package com.sofwin.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.sofwin.pojo.User;

/**
 * @author : wentao
 * @version : 1.0
 */
public interface UserService extends IService {
}

2、创建serviceImpl实现类

实现userservice接口继承ServiceImpl

M代表的mapper  T代表实体类

package com.sofwin.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sofwin.mapper.UserMapper;
import com.sofwin.pojo.User;
import com.sofwin.service.UserService;
import org.springframework.stereotype.Service;

/**
 * @author : wentao
 * @version : 1.0
 */
@Service
//第一个泛型是mapper的  第一个是实体类的
public class UserServiceImpl extends  ServiceImpl implements UserService{

}

 3、测试

package com.sofwin.test;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.sofwin.pojo.User;
import com.sofwin.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * @author : wentao
 * @version : 1.0
 */
@SpringBootTest
public class ServiceTest {
    @Autowired
    private UserService userService;
    @Test
    public void test(){
        LambdaQueryWrapper lambdaQueryWrapper=new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getName,"wwwttt")
                ;
        //eq 等于   nq不等于
        //gt 大于 ge 大于等于   lt小于 le小于等于
        // .or().进行拼接   正常. 接着. 是and
        userService.getOne(lambdaQueryWrapper);
    }

}

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

四、代码生成器(新) 

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

1、导入依赖

 
        
        
            com.baomidou
            mybatis-plus-generator
            3.5.3
        

        
            com.baomidou
            mybatis-plus-boot-starter
            3.5.2
        
        
            org.projectlombok
            lombok
        
        
            mysql
            mysql-connector-java
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-starter-freemarker
        
        
        
            io.springfox
            springfox-boot-starter
            3.0.0
        
    

2、 配置文件

server:
  port: 80
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/dubbotest?serverTimezone=UTC
    username: root
    password: root

3、编写代码生成器类

package com.sofwin.controller;


import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.Mapping;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import java.io.OutputStream;
import java.util.Collections;

/**
 * 

* 前端控制器 *

* * @author wentao * @since 2022-08-24 */ @RestController public class GeneratorController { @GetMapping("/gen") public String test(){ //url是数据库的url 账户 密码 FastAutoGenerator.create("jdbc:mysql://localhost:3306/dubbotest?serverTimezone=UTC", "root", "root") .globalConfig(builder -> { builder.author("wentao") // 设置作者 .enableSwagger() // 开启 swagger 模式 .fileOverride() // 覆盖已生成文件 .outputDir("D://mybatisplus-generator"); // 指定输出目录 }) .packageConfig(builder -> { builder.parent("com.sofwin") // 设置父包名 .moduleName("system") // 设置父包模块名 .pathInfo(Collections.singletonMap(OutputFile.xml, "D://mybatisplus-generator")); // 设置mapperXml生成路径 }) .strategyConfig(builder -> { builder.addInclude("user") ;// 设置需要生成的表名 // .addTablePrefix("t_", "c_"); // 设置过滤表前缀 }) .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板 .execute(); return "ok"; } }

 4.启动类

package com.sofwin;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * @author : wentao
 * @version : 1.0
 */
@SpringBootApplication
@EnableSwagger2
public class App {
    public static void main(String[]args){
        SpringApplication.run(App.class,args);
    }
}

启动访问即可生成 

五、扩展功能

1、 执行SQL分析打印

导入依赖

 
        
            p6spy
            p6spy
            3.9.1
        

 配置yml

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

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

 spy.properties

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

执行的时候就会出现 

代表成功 

2、逻辑删除

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

设置yml 

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

设置pojo的属性

package com.sofwin.pojo;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

import java.util.Date;

/**
 * @author : wentao
 * @version : 1.0
 */
//查看方法的快捷键  alt +7
    @Data
    //表名注解,标识实体类中对应的表  使用位置实体类
    //value 表名
    @TableName(value = "user")
    public class User {
    //标识id为表的主键
    //value为id的名称  type为主键自增情况
    //auto为数据库自增
    //ASSIGN_UUID 通过uuid进行主键的自增
        @TableId(value = "id",type = IdType.AUTO)
        private Long id;
        @TableField("name")  //非主键的字段描述
        private String name;
        private Integer age;
        private String email;
        private  String realName;
    //insert的时候触发的时候自动填充
        @TableField(fill = FieldFill.INSERT)
        private Date createTime;
        //update触发的时候自动填充
        @TableField(fill = FieldFill.UPDATE)
        private Date updateTime;
        //乐观锁的   要设置默认为1
        @Version
        private  Integer version;
        @TableLogic
        private Integer status;
    }

测试 

 @Test
    public  void test03(){
        //通过id删除
      mapper.deleteById(14);

//        mapper.deleteBatchIds(Arrays.asList(ids));
    }

 Springboot整合mybatis-plus_第1张图片

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

3、乐观锁

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

添加bean对象

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
    return interceptor;
}

在pojo中 

@Version
private Integer version;

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

//乐观锁  一般都是先进行查找 然后进行设置
    @Test
    public  void test14(){
        //通过id进行修改
        User user = mapper.selectById(11);
        user.setAge(10);
        User user1 = mapper.selectById(11);
        user1.setAge(20);

        mapper.updateById(user);
        mapper.updateById(user1);

    }

Springboot整合mybatis-plus_第2张图片  

Springboot整合mybatis-plus_第3张图片


你可能感兴趣的:(暑期四阶段学习笔记,mybatis,java)