0
点赞
收藏
分享

微信扫一扫

MyBatis(1)( springboot+mybatis plus)

yongxinz 2022-01-17 阅读 65

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

一、 mybatisplus 是什么?

1.简介

为简化开发而生,简化mybatis单表CRUD过程,只做增强不做改变,自动代码生成,自动分页。 MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

2.特征

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

二、框架

在这里插入图片描述

mybatisplus 入门例子 (官网的例子)

  1. 创建表
DROP TABLE IF EXISTS user;

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 '邮箱',
    PRIMARY KEY (id)
);

DELETE FROM user;

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
  1. 引jar
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.2</version>
<relativePath/>
</parent>
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <!--mybatisplus核心包-->
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>3.5.0</version>
    </dependency>
    <!-- mysql驱动包 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.49</version>
    </dependency>

    <!-- lombok 简化实体类写法  日志功能支持-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.22</version>
      <scope>provided</scope>
    </dependency>
  1. 编写application.yml配置
# DataSource Config
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
   # schema: classpath:db/schema-h2.sql
   # data: classpath:db/data-h2.sql
    url: jdbc:mysql://localhost:3306/tab_account?serverTimezone=GMT%2B8&yesSSL=false
    username: root
    password: '04161220' 
# 注意如果密码是全数字的话 加 引号
  1. 实体
package com.aaa.sbmp.entity;

import lombok.Data;

/**
 * @author zhangyifan
 * @version 8.0
 * @description:
 * @date 2022/1/14 9:56
 */
@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
  1. mapper
package com.aaa.sbmp.mapper;

import com.aaa.sbmp.entity.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
 * @author zhangyifan
 * @version 8.0
 * @description:
 * @date 2022/1/14 9:56
 */
public interface UserMapper extends BaseMapper<User> {
}

  1. 启动类
package com.aaa.sbmp;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * @author zhangyifan
 * @version 8.0
 * @description:
 * @date 2022/1/14 9:50
 */
@SpringBootApplication
@MapperScan("com.aaa.sbmp.mapper")
//@EnableSwagger2
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

  1. 测试类(注意测试类和启动类需要包名称一致)
package com.aaa.sbmp;

import com.aaa.sbmp.entity.User;
import com.aaa.sbmp.mapper.UserMapper;
import org.junit.jupiter.api.Test;
//import org.junit.Test;
import org.springframework.util.Assert;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.List;

/**
 * @author zhangyifan
 * @version 8.0
 * @description:
 * @date 2022/1/14 9:58
 */
//
@SpringBootTest
public class SampleTest {
    @Resource
    private UserMapper userMapper;

    @Test
    public void testSelect() {
        System.out.println(("----- selectAll method test ------"));
        List<User> userList = userMapper.selectList(null);
        //断言 不空继续 空就不执行
        Assert.notNull(userList, "为空");

        //jdk 8 新特性   System.out::println      执行类::方法
        userList.forEach(System.out::println);
    }
}

结果
在这里插入图片描述

mybatisplus 自动代码生成

在上面的基础写的

  1. jar包

     <!--mybatisplus 代码生成器包-->
      <dependency>
     <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-generator</artifactId>
      <version>3.5.1</version>
     </dependency>
      <!--默认前端引擎包 不加生成时会报错-->
      <dependency>
     <groupId>org.apache.velocity</groupId>
      <artifactId>velocity-engine-core</artifactId>
    <version>2.3</version>
     </dependency>
  1. 代码
 package com.aaa.sbmp;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;

import java.util.Collections;

/**
 * @author zhangyifan
 * @version 8.0
 * @description: 生成器
 * @date 2022/1/16 14:04
 */
public class AutoCodeGenerator {
    public static void main(String[] args) {
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/tab_account?serverTimezone=GMT%2B8&yesSSL=false","root","04161220").
                globalConfig(builder -> {
                    builder.author("zy")// 设置作者
                            .enableSwagger()// 开启 swagger 模式
                            .fileOverride() //覆盖已生成文件
                            .outputDir("G:\\java\\idea_2qi\\springboot_mybatisplus_demo_20220114\\src\\main\\java"); //指定输出目录
                }).packageConfig(builder -> {//包配置
                    builder.parent("com.aaa")//设置父包名
                            .moduleName("sbmp")//设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml,
                                    "G:\\java\\idea_2qi\\springboot_mybatisplus_demo_20220114\\src\\main\\resources\\mapper"));
                }).strategyConfig(builder -> {
                    builder.addInclude("tb_dept","sys_menu")//设置需要生成的表名
                            .addTablePrefix("tb_", "sys_");// 设置过滤表前缀
                })
        //.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板 可以生成前端引擎
                .execute();


    }
}
 

mybatisplus提供的service和dao接口

官网

  1. 配置mybatisplus 分页插件
package com.aaa.sbmp.config;

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

/**
 * @author zhangyifan
 * @version 8.0
 * @description: 分页插件
 * @date 2022/1/16 14:31
 */
@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
        return interceptor;
    }
}

  1. 编写分页带参查询代码,学习QueryWrapper用
    官网
package com.aaa.sbmp.service.impl;

import com.aaa.sbmp.entity.Dept;
import com.aaa.sbmp.mapper.DeptMapper;
import com.aaa.sbmp.service.IDeptService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.util.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Map;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author zy
 * @since 2022-01-16
 */
@Service
public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements IDeptService {

    @Resource
    private DeptMapper deptMapper;
    @Override
    public IPage<Dept> queryPage(Map map) {
        //分页参数设置
        IPage<Dept> page = new Page<>();
        //设置当前页码  第几页
        page.setCurrent(Long.valueOf(map.get("pageNo")+""));
        //设置每页显示条数
        page.setSize(Long.valueOf(map.get("pageSize")+""));
        //查询封装类
        QueryWrapper queryWrappe = new QueryWrapper();
        //使用加各种参数
        // if(map.get("deptName")!=null&&!map.get("deptName").equals("")){
        if (!StringUtils.isEmpty(map.get("deptName"))){
            queryWrappe.like("dname",map.get("deptName"));
        }
        if (!StringUtils.isEmpty(map.get("loc"))){
            queryWrappe.like("loc",map.get("loc"));
        }
        return deptMapper.selectPage(page,queryWrappe);
    }
}

  1. controller
package com.aaa.sbmp.controller;


import com.aaa.sbmp.entity.Dept;
import com.aaa.sbmp.service.IDeptService;
import com.aaa.sbmp.util.Result;
import org.springframework.web.bind.annotation.*;

import org.springframework.stereotype.Controller;

import javax.annotation.Resource;
import java.util.Map;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author zy
 * @since 2022-01-16
 */
@Controller
@RequestMapping("/sbmp/dept")
public class DeptController extends BaseController{
    @Resource
    private IDeptService iDeptService;

    /**
     * 添加
     * @param dept
     * @return
     */
    @PostMapping("/add")
    public Result add(@RequestBody Dept dept){
    return success(iDeptService.save(dept));
    }
    /**
     * 修改
     * @param dept
     * @return
     */
    @PutMapping("/update")
    public Result update(@RequestBody Dept dept){
        return success(iDeptService.saveOrUpdate(dept));
    }
    /**
     * 删除
     * @param depNO
     * @return
     */
    @DeleteMapping("/deleteById")
    public Result delete(Integer depNO){
        return success(iDeptService.removeById(depNO));
    }

    /**
     * 分页带查询方法
     * @param map
     * @return
     */
    @GetMapping("page")
    public Result page(@RequestBody Map map){
        return success(iDeptService.queryPage(map));
    }
}


swagger及测试

http://localhost:8080/swagger-ui.html

  1. jar
    注意:最新版本spring-boot 3.6.2整合swagger任何版本都会报空指针,降低springboot版本为3.5.7
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger2</artifactId>
      <version>2.9.2</version>
    </dependency>
    <!-- springfox-swagger-ui -->
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger-ui</artifactId>
      <version>2.9.2</version></dependency>
  1. 代码
package com.aaa.sbmp.config;

import org.springframework.context.annotation.Bean;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

/**
 * @author zhangyifan
 * @version 8.0
 * @description:
 * @date 2022/1/16 15:35
 */
public class SwaggerConfig {
    @Bean
    public Docket docket(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                // .qnable(false) //swagger 设置不能访问
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.aaa.sbmp.controller"))
                //路劲过滤
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("\"Spring Boot中使用Swagger2构建springboot+mybatisplus\"")
                .description("更多请关注https://blog.csdn.net/qq_45438019?spm=1000.2115.3001.5343")
                .termsOfServiceUrl("http://www.baidu.com")
                .contact(new Contact("AAA","https://blog.csdn.net/qq_45438019?spm=1000.2115.3001.5343","123@qq.com"))
                .version("1.0")
                .build();
    }
}

  1. 启动类
package com.aaa.sbmp;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * @author zhangyifan
 * @version 8.0
 * @description:
 * @date 2022/1/14 9:50
 */
@SpringBootApplication
@MapperScan("com.aaa.sbmp.mapper")
@EnableSwagger2
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

举报

相关推荐

0 条评论