提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、 mybatisplus 是什么?
- 二、框架
- 三
- mybatisplus 入门例子 (官网的例子)
- mybatisplus 自动代码生成
- mybatisplus提供的service和dao接口
前言
一、 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 入门例子 (官网的例子)
- 创建表
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');
- 引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>
- 编写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'
# 注意如果密码是全数字的话 加 引号
- 实体
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;
}
- 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> {
}
- 启动类
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);
}
}
- 测试类(注意测试类和启动类需要包名称一致)
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 自动代码生成
在上面的基础写的
- 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>
- 代码
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接口
- 配置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;
}
}
- 编写分页带参查询代码,学习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);
}
}
- 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
- 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>
- 代码
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();
}
}
- 启动类
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);
}
}