前言
该文主要讲述springboot整合mybatis plus(后面简称MP)的使用,mp意在简化开发,使得开发人员更注重于项目上业务逻辑、细节。在开发过程中,你会发现你的CRUD操作都会变得非常简单,还有代码生成器、分页插件等都极大成度地简化了我们的开发,事半功倍!
MP官网:https://mp.baomidou.com/
GIT地址:https://github.com/litaijie/mybatisplus.git
YML配置文件
spring:
jpa:
database: oracle
show-sql: true
datasource:
driver-class-name: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@127.0.0.1:1521:ORCLCDB
username: root
password: 123456
mybatis-plus:
mapper-locations: classpath*:/resources/mapper/common/**Mapper.xml #你放mapper文件的路径
global-config:
db-config:
id-type: input #全局设置使用uuid主键策略-->assign_uuid
type-aliases-package: com.mps.mybatisplus.user.entity
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql
jdbc-type-for-null: null #oracle数据库必须加这个
logging:
level:
com.haocheng.study.springboot.mybatisplus: debug
pom文件
引入以下相关依赖(MP核心依赖、代码生成、swagger-ui等)
–>oracle驱动包:https://pan.baidu.com/s/1qI7BW_Lee8JlKgpvNYqvfA 提取码: 7ngk
<!--MP依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc8</artifactId>
<version>8.0.0</version>
</dependency>
<!--代码生成器依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
开始配置
在主程序入口添加注解 @MapperScan
package com.mps.mybatisplus;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@SpringBootApplication
@MapperScan("com.mps.mybatisplus.*.mapper")//在主程序入口添加该依赖,value为你mapper接口所在路径
public class MybatisplusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisplusApplication.class, args);
}
}
好了,到了这里可以启动我们的项目试一下了。启动没问题。。
我们接下来进行代码生成,并且简单地验证一下CRUD操作。
代码生成
代码生成逻辑主要代码:
package com.mps.mybatisplus.generator;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* mp代码生成实践
*
* @author jackcooperz
* @version v1.0
* @since 2019
*/
public class Generator {
/**
* 读取控制台内容
*/
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotBlank(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
public static void main(String[] args) {
// 代码生成器
AutoGenerator auto = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("ken");
gc.setOpen(false);
// gc.setSwagger2(true); 实体属性 Swagger2 注解
auto.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:ORCLCDB");
// dsc.setSchemaName("public");
dsc.setDriverName("oracle.jdbc.driver.OracleDriver");
dsc.setUsername("root");
dsc.setPassword("123456");
auto.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName(scanner("模块名"));
pc.setParent("com.mps.mybatisplus");//填自己的包路径
auto.setPackageInfo(pc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 如果模板引擎是 freemarker,我们这里使用这个
String templatePath = "/templates/mapper.xml.ftl";
// 如果模板引擎是 velocity
// String templatePath = "/templates/mapper.xml.vm";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
auto.setCfg(cfg);
// 模板配置
TemplateConfig tmpConfig = new TemplateConfig();
tmpConfig.setXml(null);
auto.setTemplate(tmpConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
// strategy.setSuperEntityClass("com.baomidou.ant.common.BaseEntity");
// strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
// 写于父类中的公共字段
// strategy.setSuperEntityColumns("id");
strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
auto.setStrategy(strategy);
auto.setTemplateEngine(new FreemarkerTemplateEngine());
auto.execute();
}
}
现在,我们就可以开始测试生成代码—>
回车,生成如下代码:
是不是你熟悉的dao、service、controller代码!并且生成的代码默认继承MP的类BaseMapper、ServiceImpl<M extends BaseMapper, T> 类,这些类提供了丰富的接口,基本可以解决我们平常时遇到的CRUD操作。
到此,我们可以写几个接口试一下我们的配置是否可用了。
进入到MpsUserController类,主要代码:
package com.mps.mybatisplus.common.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mps.mybatisplus.common.entity.MpsUser;
import com.mps.mybatisplus.common.service.IMpsUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* <p>
* 员工信息 前端控制器
* </p>
*
* @author ken
* @since 2020-03-31
*/
@RestController
@RequestMapping("/common/mps-user")
@Api("员工信息")
public class MpsUserController {
@Autowired
private IMpsUserService iMpsUserService;
/**
* 保存员工信息
* @param mpsUser
* @return
*/
@ApiOperation(value = "保存员工信息",notes = "--")
@PutMapping("/save")
public boolean save(@RequestBody MpsUser mpsUser){
if (mpsUser==null){
return false;
}
MpsUser user = null;
if (StringUtils.isEmpty(mpsUser.getId())){
user = MpsUser.builder()
.name("ltj")
.build();
}else {
user = mpsUser;
}
return iMpsUserService.saveOrUpdate(user);
}
/**
* 删除
* @param id
* @return
*/
@ApiOperation(value = "删除员工信息",notes = "--")
@DeleteMapping("/delete")
public boolean deleteUser(@RequestParam String id){
return iMpsUserService.removeById(id);
}
/**
* 查询列表
* @return
*/
@ApiOperation(value = "员工信息列表查询",notes = "--")
@PostMapping("listUser")
public Page<MpsUser> listUser(){
Page<MpsUser> mpsUserPage =new Page<>(1,2);
LambdaQueryWrapper<MpsUser> ltj = new QueryWrapper<MpsUser>().lambda()
.eq(MpsUser::getName, "ltj");
ltj.select(MpsUser::getName,MpsUser::getId);
return iMpsUserService.page(mpsUserPage, ltj);
}
}
新建分页插件的配置类,代码如下:
package com.mps.mybatisplus.config;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.baomidou.mybatisplus.extension.incrementer.OracleKeyGenerator;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import java.util.concurrent.atomic.AtomicLong;
@Component
public class MpConfig {
/**
* 序列生成器
*/
@Bean
public OracleKeyGenerator oracleKeyGenerator(){
return new OracleKeyGenerator();
}
/**
* 分页插件
* @return
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
注意!!!
我这里使用的是oracle数据库序列的主键策略,如果同学们的项目中有不一样需求的自行修改。主要是yml配置文件中修改全局主键策略(id-type属性),这样就不用每个实体去针对性的处理id字段的配置。
到此,就可以请求我们的接口,测试效果了!
后续(饭后点心)
我们上面就是描述了springboot整合MP的整个过程,讲述了MP安装、配置,代码生成以及简单的CRUD过程。这些都是我们这片文章的主食,那么30分钟过去了,消化得也差不多了吧?我们来一点小东西,是我们的饭后甜点——springboot整合swagger-ui。
新建配置类,代码如下:
package com.mps.mybatisplus.config;
import springfox.documentation.service.Contact;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class Swagger2Config {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//为当前包路径
.apis(RequestHandlerSelectors.basePackage("com.mps.mybatisplus"))
.paths(PathSelectors.any())
.build();
}
//构建 api文档的详细信息函数,注意这里的注解引用的是哪个
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
//页面标题
.title("Spring Boot 使用 Swagger2 构建RESTful API")
//创建人
.contact(new Contact("litaijie", "--", ""))
//版本号
.version("1.0")
//描述
.description("API 描述")
.build();
}
}
接下来就可以访问我们的swagger-ui页面进行接口服务调用:http://localhost:8080/swagger-ui.html
测试结果
新加员工:
结果:
查询员工列表:
这篇文章总结到这里,后续会详细介绍MP的使用细节,如:条件构造器。
感谢大家阅读!