SpringBoot整合Mybatis-Plus插件,本文只介绍基础功能运用,更多Mybatis-plus的功能请查看官方文档。Mybatis-plus基于Mybatis做了很多丰富提高,更加方便我们开发。有些接口和注解用起来还是很顺手的。
本Demo源码:GitHub
项目结构
其中有些工具类包。我就不一一列出来了。可查看源码。
druid,lombok,swagger2也都用到了。
本Demo源码:GitHub
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.spring-boot</groupId>
<artifactId>mybatis-plus</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mybatis-plus</name>
<description>Demo project for Spring Boot Mybatis Plus</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatisplus-spring-boot-starter</artifactId>
<version>1.0.4</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>2.3</version>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!--swagger接口文档-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<!--poi-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<filtering>false</filtering>
<includes>
<include>**/mapper/*.xml</include>
</includes>
</resource>
</resources>
</build>
</project>
切勿再引入mybatis的依赖,mybatis-plus会自动维护。
maven中最下面的这个**< include>* * /mapper/*.xml < /include>**配置是为扫描mapper.xml文件特别配置的,若没有的话,mapper文件位置不对时会报错找不到。
项目配置文件 application.yml
server:
port: 8080
# 数据库访问配置,主数据源,默认的
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8
username: mistra
password: 123456
# 初始化大小,最小,最大
druid:
initial-size: 1
min-idle: 1
max-active: 20
# 配置获取连接等待超时的时间
max-wait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
# 打开PSCache,并且指定每个连接上PSCache的大小
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
use-global-data-source-stat: true
# mybatis-plus
mybatis-plus:
# 如果是放在src/main/java目录下 classpath:/com/mistra/axela/*/mapper/*Mapper.xml
# 如果是放在resource目录 classpath:/mapper/*Mapper.xml
mapper-locations: classpath:/com/springboot/mybatisplus/*/mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.springboot.mybatisplus.entity
global-config:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: 2
#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
field-strategy: 2
#驼峰下划线转换
db-column-underline: true
#刷新mapper 调试神器
#refresh-mapper: true
#数据库大写下划线转换
#capital-mode: true
# Sequence序列接口实现类配置
key-generator: com.baomidou.mybatisplus.incrementer.OracleKeyGenerator
#逻辑删除配置(下面3个配置)
logic-delete-value: 1
logic-not-delete-value: 0
sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
#配置JdbcTypeForNull
jdbc-type-for-null: 'null'
Mybatis-Plus配置文件 MybatisPlusConfig.java
package com.springboot.mybatisplus.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
/**
* Author: WangRui
* Date: 2018/5/20
* Describe: mybatis-plus配置
*/
@EnableTransactionManagement
@Configuration
@MapperScan("com.springboot.mybatisplus.dao")
public class MybatisPlusConfig {
/**
* 数据源
*
* @return
*/
@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return new DruidDataSource();
}
/**
* 事物管理器
*
* @return
*/
@Bean(name = "transactionManager")
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
/**
* mybatis-plus 分页插件
*
* @return
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor page = new PaginationInterceptor();
page.setDialectType("mysql");
return page;
}
}
实体类 Mistra.java
package com.springboot.mybatisplus.entity;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.mapper.SqlCondition;
import io.swagger.annotations.ApiParam;
import lombok.Data;
/**
* Author: WangRui
* Date: 2018/5/20
* Describe:
*/
@Data
@TableName("mistra")
public class Mistra {
@ApiParam("主键id")
@TableId(value="id")
private Long id;
/**
* TableField 的value可为空,驼峰命名方式自动识别
*/
@ApiParam("姓名")
@TableField(value = "name")
private String name;
@ApiParam("性别")
@TableField("sex")
private Integer sex;
@ApiParam("年龄")
@TableField("age")
private Integer age;
/**
* 使用数据库时间,输出 SQL 为:update 表 set 字段=now() where ...
*/
@ApiParam("更新时间")
@TableField(value = "modifyTime",update = "now()")
private String modifyTime;
/**
* 表示类中有的属性,而对应的属性在表中没有这样的一个字段,不映射
*/
@TableField(exist = false)
private String testField;
}
实体类注解有很多,可查文档选用。
实体类查询类 MistraVo.java
package com.springboot.mybatisplus.vo;
import io.swagger.annotations.ApiParam;
import lombok.Data;
/**
* Author: WangRui
* Date: 2018/6/6
* Describe:
*/
@Data
public class MistraVo {
@ApiParam("姓名")
private String name;
@ApiParam("性别")
private Integer sex;
@ApiParam("年龄")
private Integer age;
}
service MistraService.java
package com.springboot.mybatisplus.service;
import com.baomidou.mybatisplus.plugins.Page;
import com.springboot.mybatisplus.entity.Mistra;
import com.springboot.mybatisplus.util.query.PageCondition;
import com.springboot.mybatisplus.vo.MistraVo;
import java.util.List;
/**
* Author: WangRui
* Date: 2018/5/20
* Describe:
*/
public interface MistraService {
void save(MistraVo mistraVo);
void delete(Long id);
Mistra get(Long id);
void update(Mistra mistra);
List<Mistra> selectAll();
Page<Mistra> getPager(MistraVo mistraVo, PageCondition condition);
List<Mistra> customSql(MistraVo mistraVo);
}
serviceImpl MistraServiceImpl.java
package com.springboot.mybatisplus.service.Impl;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.springboot.mybatisplus.dao.MistraMapper;
import com.springboot.mybatisplus.entity.Mistra;
import com.springboot.mybatisplus.service.MistraService;
import com.springboot.mybatisplus.util.query.PageCondition;
import com.springboot.mybatisplus.vo.MistraVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* Author: WangRui
* Date: 2018/5/20
* Describe:
*/
@Service
public class MistraServiceImpl extends ServiceImpl<MistraMapper, Mistra> implements MistraService {
@Autowired
private MistraMapper mistraMapper;
/**
* 新增
*
* @param mistraVo
*/
@Override
public void save(MistraVo mistraVo) {
Mistra mistra = new Mistra();
BeanUtils.copyProperties(mistraVo, mistra);
insert(mistra);
}
/**
* 删除单条
*
* @param id
*/
@Override
public void delete(Long id) {
deleteById(id);
}
/**
* 查询单条
*
* @param id
* @return
*/
@Override
public Mistra get(Long id) {
return selectById(id);
}
/**
* 修改
*
* @param mistra
*/
@Override
public void update(Mistra mistra) {
updateById(mistra);
}
/**
* 查询所有
*
* @return
*/
@Override
public List<Mistra> selectAll() {
List<Mistra> mistraList = selectList(
new EntityWrapper<Mistra>()
);
return mistraList;
}
/**
* 条件查询,分页查询
* 分页查询时,分页插件会自动填充数据总行数和总页数
* @param mistraVo
* @return
*/
@Override
public Page<Mistra> getPager(MistraVo mistraVo, PageCondition condition) {
Page<Mistra> page = new Page<Mistra>(condition.getPageNum(), condition.getPageSize());
Wrapper<Mistra> eWrapper = new EntityWrapper<Mistra>().like(StringUtils.isNoneBlank(mistraVo.getName()), "name", mistraVo.getName());
page = selectPage(page, eWrapper);
return page;
}
/**
* 自定义sql
*
* @param mistraVo
* @return
*/
@Override
public List<Mistra> customSql(MistraVo mistraVo) {
return mistraMapper.customSql(mistraVo);
}
List<MistraVo> voConvertList(List<Mistra> list) {
if (list.size() > 0) {
List<MistraVo> mistraVoList = new ArrayList<>();
list.forEach(mistra ->
mistraVoList.add(convertVo(mistra)));
return mistraVoList;
} else {
return null;
}
}
/**
* 实体类与查询类转换
*
* @param mistra
* @return
*/
public MistraVo convertVo(Mistra mistra) {
if (mistra != null) {
MistraVo mistraVo = new MistraVo();
BeanUtils.copyProperties(mistra, mistraVo);
return mistraVo;
} else {
return null;
}
}
}
service继承了ServiceImpl,所有很多crud方法可以直接调用,可查看ServiceImpl源码。
dao MistraMapper.java
package com.springboot.mybatisplus.dao;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.springboot.mybatisplus.entity.Mistra;
import com.springboot.mybatisplus.vo.MistraVo;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* Author: WangRui
* Date: 2018/5/20
* Describe: 一般写自定义sql才会用到,其他常用的crud在Impl里面可以直接调用IService的方法。
*/
@Repository
public interface MistraMapper extends BaseMapper<Mistra> {
List<Mistra> customSql(MistraVo mistraVo);
}
MistraMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.springboot.mybatisplus.dao.MistraMapper">
<resultMap id="BaseResultMap" type="com.springboot.mybatisplus.entity.Mistra">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="sex" property="sex"/>
<result column="age" property="age"/>
<result column="modifyTime" property="modifyTime"/>
</resultMap>
<!-- 通用查询结果列-->
<sql id="Base_Column_List">
id, name, sex , age,modifyTime
</sql>
<select id="customSql" parameterType="com.springboot.mybatisplus.vo.MistraVo" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM mistra
<where>
<if test="name != null and name != ''">
AND name LIKE CONCAT('%',#{name},'%')
</if>
<if test="sex != null and sex != ''">
AND sex = #{sex}
</if>
<if test="age != null and age != ''">
AND sex = #{age}
</if>
</where>
</select>
</mapper>
controller MistraController.java
package com.springboot.mybatisplus.controller;
import com.baomidou.mybatisplus.plugins.Page;
import com.springboot.mybatisplus.entity.Mistra;
import com.springboot.mybatisplus.service.MistraService;
import com.springboot.mybatisplus.util.query.PageCondition;
import com.springboot.mybatisplus.util.web.annotation.*;
import com.springboot.mybatisplus.vo.MistraVo;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Author: WangRui
* Date: 2018/5/20
* Describe:
*/
@RestController
@RequestMapping("/mistra")
public class MistraController {
@Autowired
private MistraService mistraService;
@ApiOperation("项目搭建成功测试")
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test() {
return "Mistra---测试成功!";
}
@ApiOperation("新增")
@AddUrl
public void get(MistraVo mistraVo) {
mistraService.save(mistraVo);
}
@ApiOperation("删除单条")
@DeleteUrl
public void delete(Long id) {
mistraService.delete(id);
}
@ApiOperation("获取单条")
@GetMapping
public Mistra get(Long id) {
return mistraService.get(id);
}
@ApiOperation("修改")
@UpdateUrl
public void update(Mistra mistra) {
mistraService.update(mistra);
}
@ApiOperation("查询所有")
@SelectAllUrl
public List<Mistra> selectAll() {
return mistraService.selectAll();
}
@ApiOperation("分页查询+条件查询")
@SelectPageUrl
public Page<Mistra> selectPage(MistraVo mistraVo, PageCondition condition) {
return mistraService.getPager(mistraVo, condition);
}
@ApiOperation("自定义sql测试")
@GetMapping("/customSql")
public List<Mistra> customSql(MistraVo mistraVo){
return mistraService.customSql(mistraVo);
}
}
controller里有些自定义注解在util>>web>>annotation包下。
辅助查询类 PageCondition.java
package com.springboot.mybatisplus.util.query;
import io.swagger.annotations.ApiParam;
import lombok.Data;
/**
* Author: WangRUi
* Time: 2018/6/12/012
* Describe:
*/
@Data
public class PageCondition {
@ApiParam("页数")
private int pageNum = 0;
@ApiParam("每页数量")
private int pageSize = 15;
@ApiParam("排序字段")
private String order;
@ApiParam("排序规则 默认降序,升序=ASC")
private String orderBy = "DESC";
}
swagger2配置 SwaggerConfiguration .java
package com.springboot.mybatisplus.util.swagger;
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.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* Author: WangRui
* Date: 2018/5/20
* Describe: Swagger接口文档配置类
*/
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.springboot.mybatisplus"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
//http://localhost:8080/swagger-ui.html
return new ApiInfoBuilder()
.title("罗罗诺亚丶小王瑞")
.description("----------接口文档----------")
.termsOfServiceUrl("www.mistra.wang")
.contact(new Contact("WangRui", "", ""))
.version("1.0")
.build();
}
}
启动项目,查看swagger接口文档
本Demo源码:GitHub
- 我的公众号:Coding抠腚
- 一个没有福报的社畜程序员。吐槽程序员生存,生活,职业发展。Java学习路线,经验,技术分享。技术问题交流探讨。超喜欢这里的,这里的老哥写代码都好sao的。
我有个野心,我要成为世界第一的剑豪!
----Roronoa丶Zoro