SpringBoot 整合 Mybatis-Plus,含swagger接口文档

SpringBoot整合Mybatis-Plus插件,本文只介绍基础功能运用,更多Mybatis-plus的功能请查看官方文档。Mybatis-plus基于Mybatis做了很多丰富提高,更加方便我们开发。有些接口和注解用起来还是很顺手的。


项目结构
这里写图片描述
其中有些工具类包。我就不一一列出来了。可查看源码。
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&amp;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接口文档
这里写图片描述


这里写图片描述

我有个野心,我要成为世界第一的剑豪!
                                                            ----Roronoa丶Zoro

猜你喜欢

转载自blog.csdn.net/Axela30W/article/details/80679167