Springboot2整合mybatis-plus+swagger+druid

2023-11-15

一. 简介

 1. 版本

       springboot版本为2.0.5.RELEASE,mybatisplus版本为2.1.9

  2. 项目地址

    https://gitee.com/wbsxch/ssm.git

 3. 留个记录,方便查找

    开发步骤:

    1. 新建springboot项目。

    2. 导入依赖   -->  devtools,lombok,web,thymeleaf,mysql,aop,mybatisplus,druid,swagger。

    3. maven多环境配置。

    4. 编写application.yml  -->  项目端口,项目路径名,mybatisplus配置,mysql多数据源配置。

    5. 新建DataSourceContextHolder 用于设置,获取,清空 当前线程内的数据源变量。

    6. 新建 MultipleDataSource 实现 AbstractRoutingDataSource 类。重写determineCurrentLookupKey(),通过

      DataSourceContextHolder 获取数据源变量,用于当作lookupKey取出指定的数据源。

    7. 新建DataSourceEnum 用于存放数据源名称。

    8. 新建注解 DataSource,用于aop类中当作切入点来选择数据源。

     编写aop类 --> DataSourceAspect.java

    9. 新建并配置DruidConfiguration,MybatisplusConfiguration,SwaggerConfiguration 三个类。

    DruidConfiguration -->  StatViewServlet 和 WebStatFilter Druid监控配置和监控过滤器。

    MybatisplusConfiguration -->  mybatisplus 分页插件,SQL执行效率插件

                    数据源Bean,MultipleDataSource 注入

                    SqlSessionFactory注入

    SwaggerConfiguration --> 常规配置。

    10. crud Controller接口。

    11. 完整项目结构

    

 

 

二. 详细步骤

1. 新建springboot项目 

idea新建Empty项目 然后创建springboot项目 勾选 devtools,lombok,web,thymeleaf,mysql

2. 导入依赖

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.seawaterbt</groupId>
    <artifactId>ssm</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>ssm</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.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>
        <druid.version>1.1.9</druid.version>
        <swagger.version>2.7.0</swagger.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </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.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>2.1.9</version>
        </dependency>

        <!-- druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>${swagger.version}</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>${swagger.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
    </dependencies>

    <profiles>
        <profile>
            <id>prod</id>
            <properties>
                <config.dir>prod</config.dir>
            </properties>
        </profile>
        <profile>
            <id>dev</id>
            <properties>
                <config.dir>dev</config.dir>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>qa</id>
            <properties>
                <config.dir>qa</config.dir>
            </properties>
        </profile>
    </profiles>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>

        <resources>
            <resource>
                <filtering>true</filtering>
                <directory>src/main/resources/config/${config.dir}</directory>
                <includes>
                    <include>*.*</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources/</directory>
            </resource>
        </resources>
    </build>


</project>

 

3. Maven多环境配置 看pom文件

4. 编写application.yml

application.yml

server:
  port: 8080
  servlet:
    context-path: /ssm
spring:
  datasource:
      druid:
          db1:
              username: root
              password: 123456
              driver-class-name: com.mysql.jdbc.Driver
              url: jdbc:mysql:///mds
              initialSize: 5
              minIdle: 5
              maxActive: 20
          db2:
              username: root
              password: 123456
              driver-class-name: com.mysql.jdbc.Driver
              url: jdbc:mysql:///ssj
              initialSize: 5
              minIdle: 5
              maxActive: 20
mybatis-plus:
  # 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Mapper.xml
  # 如果是放在resource目录 classpath:/mapper/*Mapper.xml
  mapper-locations: classpath:/mapper/*Mapper.xml
  #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: com.seawatebt.ssm.entity
  global-config:
    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
    id-type: 0
    #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
    field-strategy: 2
    #驼峰下划线转换
    db-column-underline: true
    #mp2.3+ 全局表前缀 mp_
    #table-prefix: mp_
    #刷新mapper 调试神器
    refresh-mapper: true
    #数据库大写下划线转换
    #capital-mode: true
    #逻辑删除配置(下面3个配置)
    logic-delete-value: 4
    logic-not-delete-value: 0
  configuration:
    #配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(没开启这个,SQL需要写as: select user_id as userId)
    map-underscore-to-camel-case: true
    cache-enabled: false
    #配置JdbcTypeForNull, oracle数据库必须配置
    jdbc-type-for-null: 'null'

 

5. 新建DataSourceContextHolder

DataSourceContextHolder.java

package com.seawaterbt.ssm.multiple;

public class DataSourceContextHolder {

    private static final ThreadLocal<String> contextHolder = new InheritableThreadLocal<>();

    /**
     *  设置数据源
     * @param db
     */
    public static void setDataSource(String db){
        contextHolder.set(db);
    }

    /**
     * 取得当前数据源
     * @return
     */
    public static String getDataSource(){
        return contextHolder.get();
    }

    /**
     * 清除上下文数据
     */
    public static void clear(){
        contextHolder.remove();
    }
}

 

6. 新建 MultipleDataSource

MultipleDataSource.java

package com.seawaterbt.ssm.multiple;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class MultipleDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataSource();
    }
}

 

7. 新建DataSourceEnum

DataSourceEnum.java

package com.seawaterbt.ssm.enums;

public enum DataSourceEnum {

    DB1("db1"),DB2("db2");

    private String value;

    DataSourceEnum(String value){this.value=value;}

    public String getValue() {
        return value;
    }
}

8. 新建注解 DataSource

DataSource.java

package com.seawaterbt.ssm.annotation;

import com.seawaterbt.ssm.enums.DataSourceEnum;

import java.lang.annotation.*;

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataSource {

    DataSourceEnum value() default DataSourceEnum.DB1;
}

 

DataSourceAspect.java

@Component
@Slf4j
@Aspect
@Order(-1)
public class DataSourceAspect {

    @Pointcut("@within(com.seawaterbt.ssm.annotation.DataSource) || @annotation(com.seawaterbt.ssm.annotation.DataSource)")
    public void pointCut(){

    }

    @Before("pointCut() && @annotation(dataSource)")
    public void doBefore(DataSource dataSource){
        log.info("选择数据源---"+dataSource.value().getValue());
        DataSourceContextHolder.setDataSource(dataSource.value().getValue());
    }

    @After("pointCut()")
    public void doAfter(){
        DataSourceContextHolder.clear();
    }
}

 

9. 新建并配置DruidConfiguration,MybatisplusConfiguration,SwaggerConfiguration

 DruidConfiguration.java

package com.seawaterbt.ssm.config;

import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class DruidConfiguration {

    @Bean
    public ServletRegistrationBean startViewServlet(){
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
        // IP白名单
        servletRegistrationBean.addInitParameter("allow","127.0.0.1");
        // IP黑名单(共同存在时,deny优先于allow)
        servletRegistrationBean.addInitParameter("deny","127.0.0.1");
        //控制台管理用户
        servletRegistrationBean.addInitParameter("loginUsername","admin");
        servletRegistrationBean.addInitParameter("loginPassword","123456");
        //是否能够重置数据
        servletRegistrationBean.addInitParameter("resetEnable","false");
        return servletRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean statFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
        //添加过滤规则
        filterRegistrationBean.addUrlPatterns("/*");
        //忽略过滤的格式
        filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }
}

DruidConfiguration.java

 

MyBatiesPlusConfiguration.java

package com.seawaterbt.ssm.config;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.baomidou.mybatisplus.MybatisConfiguration;
import com.baomidou.mybatisplus.entity.GlobalConfiguration;
import com.baomidou.mybatisplus.mapper.LogicSqlInjector;
import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean;
import com.seawaterbt.ssm.enums.DataSourceEnum;
import com.seawaterbt.ssm.multiple.MultipleDataSource;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Profile;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@Configuration
@MapperScan("com.seawaterbt.ssm.mapper*")
public class MyBatiesPlusConfiguration {

    /*
     * 分页插件,自动识别数据库类型
     * 多租户,请参考官网【插件扩展】
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 开启 PageHelper 的支持
        paginationInterceptor.setLocalPage(true);
        return paginationInterceptor;
    }

    /**
     * SQL执行效率插件
     */
    @Bean
    @Profile({"dev","qa"})// 设置 dev test 环境开启
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        performanceInterceptor.setMaxTime(1000);
        performanceInterceptor.setFormat(true);
        return performanceInterceptor;
    }

    @Bean(name = "db1")
    @ConfigurationProperties(prefix = "spring.datasource.druid.db1" )
    public DataSource db1() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean(name = "db2")
    @ConfigurationProperties(prefix = "spring.datasource.druid.db2" )
    public DataSource db2() {
        return DruidDataSourceBuilder.create().build();
    }

    /**
     * 动态数据源配置
     * @return
     */
    @Bean
    @Primary
    public DataSource multipleDataSource(@Qualifier("db1") DataSource db1, @Qualifier("db2") DataSource db2) {
        MultipleDataSource multipleDataSource = new MultipleDataSource();
        Map< Object, Object > targetDataSources = new HashMap<>();
        targetDataSources.put(DataSourceEnum.DB1.getValue(), db1);
        targetDataSources.put(DataSourceEnum.DB2.getValue(), db2);
        //添加数据源
        multipleDataSource.setTargetDataSources(targetDataSources);
        //设置默认数据源
        multipleDataSource.setDefaultTargetDataSource(db1);
        return multipleDataSource;
    }

    @Bean("sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(multipleDataSource(db1(),db2()));
        //sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/*/*Mapper.xml"));

        MybatisConfiguration configuration = new MybatisConfiguration();
        //configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
        configuration.setJdbcTypeForNull(JdbcType.NULL);
        configuration.setMapUnderscoreToCamelCase(true);
        configuration.setCacheEnabled(false);
        sqlSessionFactory.setConfiguration(configuration);
        sqlSessionFactory.setPlugins(new Interceptor[]{ //PerformanceInterceptor(),OptimisticLockerInterceptor()
                paginationInterceptor() //添加分页功能
        });
        //sqlSessionFactory.setGlobalConfig(globalConfiguration());
        return sqlSessionFactory.getObject();
    }

    /*@Bean
    public GlobalConfiguration globalConfiguration() {
        GlobalConfiguration conf = new GlobalConfiguration(new LogicSqlInjector());
        conf.setLogicDeleteValue("-1");
        conf.setLogicNotDeleteValue("1");
        conf.setIdType(0);
        //conf.setMetaObjectHandler(new MyMetaObjectHandler());
        conf.setDbColumnUnderline(true);
        conf.setRefresh(true);
        return conf;
    }*/
}

SwaggerConfiguration.java

package com.seawaterbt.ssm.config;

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;

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.seawaterbt.ssm.controller"))
                .paths(PathSelectors.any())
                .build()
                .apiInfo(apiInfo());
    }
    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("多数据源 SSM 测试服务")
                .description("多数据源 SSM 测试文档")
                .termsOfServiceUrl("http://www.seawaterbt.com")
                //.contact(new Contact("海水不甜","http://www.seawaterbt.com","809318068@qq.com"))
                .version("1.0")
                .build();
    }

}

 

10. crud Controller接口

1. Entity

Student.java

package com.seawaterbt.ssm.entity;

import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Api("学生实体对象")
@Data
@TableName("t_student")
public class Student {

    @ApiModelProperty("学生id")
    @TableId(type = IdType.AUTO)
    private Integer id;

    @ApiModelProperty("学生姓名")
    private String name;

    @ApiModelProperty("学生年龄")
    private Integer age;

    @ApiModelProperty("学生班级")
    private String classname;

}

Teacher.java

package com.seawaterbt.ssm.entity;

import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Api("老师实体对象")
@Data
@TableName("t_teacher")
public class Teacher {

    @ApiModelProperty("老师id")
    @TableId(type = IdType.AUTO)
    private Integer id;

    @ApiModelProperty("老师姓名")
    private String name;

    @ApiModelProperty("老师年龄")
    private Integer age;

    @ApiModelProperty("老师所教学科")
    private String subject;
}

 

2. Mapper 接口及其xml

StudentMapper.java

package com.seawaterbt.ssm.mapper;

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.seawaterbt.ssm.entity.Student;

public interface StudentMapper extends BaseMapper<Student> {
}

 

StudentMapper.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.seawaterbt.ssm.mapper.StudentMapper">

</mapper>

TeacherMapper.java

package com.seawaterbt.ssm.mapper;

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.seawaterbt.ssm.entity.Teacher;

public interface TeacherMapper extends BaseMapper<Teacher> {
}

TeacherMapper.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.seawaterbt.ssm.mapper.TeacherMapper">

</mapper>

3. Service 接口及其实现类

StudentService.java

package com.seawaterbt.ssm.service;

import com.baomidou.mybatisplus.service.IService;
import com.seawaterbt.ssm.entity.Student;

public interface StudentService extends IService<Student> {
}

 

StudentServiceImpl.java

package com.seawaterbt.ssm.service.impl;

import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.seawaterbt.ssm.entity.Student;
import com.seawaterbt.ssm.mapper.StudentMapper;
import com.seawaterbt.ssm.service.StudentService;
import org.springframework.stereotype.Service;

@Service
public class StudentServiceImpl extends ServiceImpl<StudentMapper,Student> implements StudentService {
}

 

TeacherService.java

package com.seawaterbt.ssm.service;

import com.baomidou.mybatisplus.service.IService;
import com.seawaterbt.ssm.entity.Teacher;


public interface TeacherService extends IService<Teacher> {
}

 

TeacherServiceImpl.java

package com.seawaterbt.ssm.service.impl;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.seawaterbt.ssm.annotation.DataSource;
import com.seawaterbt.ssm.entity.Teacher;
import com.seawaterbt.ssm.enums.DataSourceEnum;
import com.seawaterbt.ssm.mapper.TeacherMapper;
import com.seawaterbt.ssm.service.TeacherService;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

@Service
public class TeacherServiceImpl extends ServiceImpl<TeacherMapper,Teacher> implements TeacherService {

    @Override
    @DataSource(DataSourceEnum.DB2)
    public boolean insert(Teacher entity) {
        return super.insert(entity);
    }

    @Override
    @DataSource(DataSourceEnum.DB2)
    public boolean deleteById(Serializable id) {
        return super.deleteById(id);
    }

    @Override
    @DataSource(DataSourceEnum.DB2)
    public boolean updateById(Teacher entity) {
        return super.updateById(entity);
    }

    @Override
    @DataSource(DataSourceEnum.DB2)
    public Teacher selectById(Serializable id) {
        return super.selectById(id);
    }

    @Override
    @DataSource(DataSourceEnum.DB2)
    public List<Teacher> selectList(Wrapper<Teacher> wrapper) {
        return super.selectList(wrapper);
    }

    @Override
    @DataSource(DataSourceEnum.DB2)
    public Page<Teacher> selectPage(Page<Teacher> page) {
        return super.selectPage(page);
    }

    @Override
    @DataSource(DataSourceEnum.DB2)
    public Page<Teacher> selectPage(Page<Teacher> page, Wrapper<Teacher> wrapper) {
        return super.selectPage(page, wrapper);
    }
}

4. Vo 

StudentVo.java

package com.seawaterbt.ssm.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
@ApiModel("学生vo")
public class StudentVo {

    @ApiModelProperty("学生姓名")
    private String name;

    @ApiModelProperty("学生年龄")
    private Integer age;

    @ApiModelProperty("学生班级")
    private String classname;
}

TeacherVo.java

package com.seawaterbt.ssm.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
@ApiModel("老师vo")
public class TeacherVo {

    @ApiModelProperty("老师姓名")
    private String name;

    @ApiModelProperty("老师年龄")
    private Integer age;

    @ApiModelProperty("老师教的学科")
    private String subject;
}

5. Controller

 

package com.seawaterbt.ssm.controller;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.seawaterbt.ssm.entity.Student;
import com.seawaterbt.ssm.service.StudentService;
import com.seawaterbt.ssm.vo.StudentVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Api("对学生表CRUD")
@RestController
@RequestMapping("/student")
public class StudentController {

    @Autowired
    private StudentService studentService;

    @ApiOperation("添加学生")
    @PostMapping("/add")
    public String add(@RequestBody StudentVo student){
        Student stu = new Student();
        stu.setName(student.getName());
        stu.setAge(student.getAge());
        stu.setClassname(student.getClassname());
        return studentService.insert(stu)?"添加成功":"添加失败";
    }

    @ApiOperation("删除学生")
    @DeleteMapping("/delete/{id}")
    public String delete(@ApiParam("学生的主键id")@PathVariable(value = "id") Integer id){
        return studentService.deleteById(id)?"删除成功":"删除失败";
    }

    @ApiOperation("修改学生")
    @PostMapping("/update")
    public String update(@RequestBody Student student){
        return studentService.updateById(student)?"修改成功":"修改失败";
    }

    @ApiOperation(value = "查询学生")
    @GetMapping("/list")
    public List<Student> list(){
        Wrapper<Student> wrapper = new EntityWrapper<>();
        return studentService.selectList(wrapper);
    }
}

 

TeacherController.java

package com.seawaterbt.ssm.controller;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.seawaterbt.ssm.entity.Teacher;
import com.seawaterbt.ssm.service.TeacherService;
import com.seawaterbt.ssm.vo.TeacherVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Api("对老师表CRUD")
@RestController
@RequestMapping("/teacher")
public class TeacherController {

    @Autowired
    private TeacherService teacherService;

    @ApiOperation(value = "添加老师")
    @PostMapping("/add")
    public String add(@RequestBody TeacherVo teacher){
        Teacher tea = new Teacher();
        tea.setName(teacher.getName());
        tea.setAge(teacher.getAge());
        tea.setSubject(teacher.getSubject());
        return teacherService.insert(tea)?"添加成功":"添加失败";
    }

    @ApiOperation("删除老师")
    @DeleteMapping("/delete/{id}")
    public String delete(@ApiParam("老师的主键id")@PathVariable(value = "id") Integer id){
        return teacherService.deleteById(id)?"删除成功":"删除失败";
    }

    @ApiOperation("修改老师")
    @PostMapping("/update")
    public String update(@RequestBody Teacher teacher){
        return teacherService.updateById(teacher)?"修改成功":"修改失败";
    }

    @ApiOperation(value = "查询老师")
    @GetMapping("/list")
    public List<Teacher> list(){
        Wrapper<Teacher> wrapper = new EntityWrapper<>();
        return teacherService.selectList(wrapper);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot2整合mybatis-plus+swagger+druid 的相关文章

  • RAM IP core(2)

    例化5种RAM IP core 1 单端口RAM Single port RAM RAM参数设置如上图所示 输入输出位宽都为8位 深度为16 采用一级输出寄存器 读写模式为no change 用COE文件对RAM进行初始化 关于COE文件的
  • BurpSuit在不同浏览器中配置代理

    BurpSuit配置代理 一 BurpSuit代理基础知识 通常情况下 用户通过浏览器浏览网页 通过浏览器 客户端 与服务器进行交互 既相互进行通信 若要想分析客户端和服务器交互的具体信息 就需要一个人当个中介 中间人 可以拦截两个人的信息
  • HTML5基础知识总结

    文章目录 01 HTML5基础 了解HTML5 新语义标签 网页布局结构标签及兼容处理 多媒体标签及属性介绍 新表单元素及属性 智能表单控件 表单属性 HTMl5中的API 获取页面元素及类名操作和自定义属性 文件读取 获取网络状态 获取地
  • sql union 列的字段不一样的时候

    转载于 https www cnblogs com shenzhichipingguo p 8916705 html
  • 69-Sqrt(x)

    题目 Implement int sqrt int x Compute and return the square root of x 分析 这个题里面是有许多陷阱的 首先确定用二分法处理这个问题 然而0 x之间的num的平方有可能会溢出
  • Apifox接口测试教程(一)接口测试的原理与工具

    前言 掌握了http协议 就掌握了接口测试 笔者在网络上看过不少接口测试教程 一上来就开始讲怎么操作工具 而不告诉读者为什么要这么操作 读者可能照猫画虎成功了 也可能操作失败了但不知为何出错 因此 本文作为接口测试的入门第一课首先会给大家了
  • 静态代码分析工具(一)—Scitools Understand

    一 概述 Understand是一个用来进行静态的软件分析 软件度量 软件可视化的工具 二 软件使用 1 安装 安装的是Understand 5 1 安装及另起可用网上很多资源 2 新建工程 创建工程名称 路径 选择语言 注意 在C C 后
  • (cLion、RubyMine、PyCharm、WebStorm、PhpStorm、Appcode、Clion、Idea) 万能破解,获取自己的注冊码...

    听说cLion的ide编写c c 很的棒 今天下载了一个仅仅有30天的使用时间 作为程序猿破解它 下载破解文件 点击下载 password 7biu 解压压缩包 然后打开命令行 cd 到解压文件夹 运行例如以下命令 java jar bui
  • HTTP协议初探

    发现网络协议的知识对后台开发人员来说 还是非常重要的 所以特地去了解了以下 并作学习笔记 方便自己查阅 HTTP协议详解 HTTP就是一个基于应用层的通信规范 双方要进行通信 大家都要遵守一个规范 HTTP协议 HTTP协议从WWW服务器传
  • 数值计算 --- 三次样条函数插值(Cubic spline function interpolation)

    三次样条函数插值 Cubic spline function interpolation Part I 插值 预备知识 什么是插值 已知部分离散的数据 但不知道满足这些数据的函数表达式 插值 和拟合 都是为了找到对应的函数表达式 区别在于
  • Python 积累总结

    for i j in DataFrame 遇到的问题 for i j in new data groupby by embryo id company id if j shape 0 2 relationshipdata relations
  • Android中Log信息的输出方法

    共两篇文章 第一篇讲述了如何在程序中输出Log信息 第二篇详细的分析了Log信息的输出机制 下面是第一篇 转自 http blog 163 com binghaitao 126 blog static 3383532520099309366
  • Angular 4/5 form表单select初始化选中(简单string和复杂对象)

    1 问题场景 管理员增删改查中的 改 操作 管理员有性别 sex 和岗位 position 属性 其中 性别在后端为枚举类型 position为类 要求进入管理员修改页时 自动选择性别 通过接口获取所有岗位 并自动选中当前管理员的岗位 2
  • live555构建流媒体服务器(1)

    读test 264码流文件 客户端可以通过ffplay exe rtsp xxx播放出来 直接使用编译好的库 改自testOnDemandRTSPServer cpp include liveMedia hh include BasicUs
  • 【maven】论 maven settings 文件 mirrors 对 IDEA 的影响

    文章目录 1 概述 1 概述 事情是这样的 我们要升级flink 1 9 1 升级到 1 12 4 然后因为在内网 所以我拷贝了大量的jar包 然后先放在本地 然后再放入内网的私服上 结果 我的代码需要大量的显示引入包 才能因为依赖 不然到
  • 如何用ChatGPT制作xmind

    第一步 向ChatGPT提问内容Q 去旅游要分几个步骤 第二步 输出格式Q 转换markdown格式点击右上角 copy code注意 如果结果不是代码形式 补充一句提问 请用代码形式呈现 第三步 复制到text 改后缀 1 复制到text
  • Coverity 代码静态安全检测

    转自 http blog csdn net yasi xi article details 8349985 最近公司在推行代码Security检查 使用了Coverity代码静态检测工具 功能很强大 超乎我的期望 主要功能如下 列出不会被执
  • inline在c语言作用,[转载]C语言标准C99 内联函数(inline)总结

    1 定义 它们看起来象函数 运作起来象函数 比宏 macro 要好得多 使用时还不需要承担函数调用的开销 当内联一个函数时 编译器可以对函数体执行特定环境下的优化工作 这样的优化对 正常 的函数调用是不可能的 2 规则 inline关键字必
  • 【java】JDBC链接

    文章目录 一 JDBC API 二 JDBC加载 三 JDBC连接 MySQL8 MySQL5 四 API常用方法 Statement ResultSet 五 PreparedStatement 1 为什么要使用PreparedStatem
  • 英区智齿发炎自救 -- 牙周炎,抗菌治疗+止疼治疗+中医药辩证治疗

    英区智齿发炎自救 periodontitis 左下角半包半露的智齿又发炎了 这次来势凶猛 前阵子发炎我用Corsodyl漱口水 饭后盐水漱口就足够把他压下去 这次用了两天牙龈还是肿上天 严重的话超级有效的组合是阿莫西林 奥 甲硝唑 配合Co

随机推荐

  • open函数返回值为0

    open函数是我们开发中经常会遇到的 这个函数是对文件设备的打开操作 这个函数会返回一个句柄fd 我们通过这个句柄fd对设备文件读写操作 我们在对这个fd作判断的时候 经常会用到 fd open filename O RDONLY If f
  • [游戏开发]俄罗斯方块实现

    0 前言 整理一下 游戏开发的入坑作 俄罗斯方块 这里包含了 c 实现的俄罗斯方块处理 控制台 有界面 以及后续用 unity 做的版本 项目的代码太多 就都放在链接了 可以直接下载好了 就放百度云好了 也不会污染代码库 挠头 项目链接如下
  • 魔术师猜数

    在一种室内互动游戏中 魔术师要每位观众心里想一个三位数abc a b c分别是百位 十位和个位数字 然后魔术师让观众心中记下acb bac bca cab cba五个数以及这5个数的和值 只要观众说出这个和是多少 则魔术师一定能猜出观众心里
  • docker容器中elasticsearch配置跨域访问(elasticsearch-head插件访问不到es集群)

    问题 docker容器中elasticsearch配置跨域访问 elasticsearch head插件访问不到es集群 原因 elasticsearch head插件访问不到es集群 是因为调用过程中出现了跨域问题 解决方法 docker
  • 基于宝塔面板成功配置网站SSL安全证书(支持https访问)

    前提条件 你熟悉宝塔面板搭建网站 我这个建站老鸟都在用宝塔面板建站 主要就是图它的节省时间和精力 大家有不熟悉宝塔面板使用的 可以查看文章 宝塔面板添加WordPress站点详细图文教程 之后你就完全可以入门了 你拥有一台云服务器和一个万网
  • 服务器基准测试

    https bp aliyun com detail 189 Version 5 1 3 Based on the Byte Magazine Unix Benchmark Multi CPU vers
  • 每天Leetcode 刷题 初级算法篇-缺失数字

    题目要求 缺失数字 力扣题解 代码 import java util Arrays program mydemo description 缺失数字 author Mr zeng create 2021 03 03 09 49 public
  • 【ChatGPT】原生JS实现ChatGPT小型Demo

    初入前端的小白也可以尝尝鲜 无需科学上网 调用API2D的接口进行连接 也可以换成官方API 均有免费额度 第一步 注册API2D https api2d com r 187255 使用GitHub或邮箱进行注册登录 通过 GitHub 注
  • MySql详解(一)--架构篇

    MySQL架构篇 逻辑架构 Connectors 连接器 指的是不同语言中与SQL的交互 ManagementServeices Utilities 系统管理和控制工具 ConnectionPool 连接池 管理缓冲用户连接 线程处理等需要
  • no node folder is found in data folder(s), node has not been started yet?]

    报错 no node folder is found in data folder s node has not been started yet ES 角色调整后报该错误 过程 把 Master DataNode 节点 切换为纯 Mast
  • Linux 下ELF 文件理解及C/C++代码实现

    ELF 就是 Executable and Linkable Format 它定义了可重定位文件 可执行文件和 共享目标文件的结构 这种格式能让操作系统正确解释文件中的机器指令 理解ELF文件 目标文件 格式主要三种结构 可重定向文件 Re
  • perl实现,匹配并打印一个段落

    有一个应用场景 实现后 觉得还是记录下来 以后还会遇到的 举例 根据 这样的行 匹配并打印该段落范围的所有行 另外一点 打印出的内容 只允许存在max最大值和min最小值 sdsdfsdf 1123123 1sdfs 2saas max 0
  • 最浅显易懂的Django系列教程(49)-redis教程

    redis教程 概述 redis是一种nosql数据库 他的数据是保存在内存中 同时redis可以定时把内存数据同步到磁盘 即可以将数据持久化 并且他比memcached支持更多的数据结构 string list列表 队列和栈 set 集合
  • 数据分析基础理论

    什么是数据分析 收集大量数据 研究和概括总结 提取有用的信息形成概 帮助做出判断 以便采取适当行动 数据分析是指用适当的统计分析方法对收集来的大量数据进行分析 将他们加以汇总和理解 以求最大化的开发数据功能 发挥数据的作用 数据分析的价值
  • CentOS7网络配置

    本文是我从另外三个文章中整合而来 用于自存 如有侵权请联系我删除 CentOS 7教程 二 网络设置 知乎 zhihu com VMware安装 Linux下CentOS7的配置及网络环境的配置 最新版特别全 centos7 配置 Cong
  • GET和POST的区别、Promise的两个方法及POST请求常见的参数类型

    GET和POST的区别 可能有纰漏 区别 GET POST 参数的位置不同 GET把请求参数直接暴露在URL上 因此GET比POST更不安全 不能用来传递敏感信息 GET请求发送的参数会被完整的保留在浏览器历史记录里 POST把请求参数放在
  • springBoot的配置文件

    目录 配置文件的格式 1 配置项的分类和中文支持 2 properties 配置文件 读取配置文件 优缺点分析 3 yml 配置文件 读取配置文件 优缺点分析 4 多个配置文件 5 properties 和 yml 的对比 在 spring
  • 2.1/2.2 系统目录结构 2.3 ls命令 2.4 文件类型 2.5 alias命令

    这个是同学提供的 2 1 2 2 系统目录结构 系统的目录 tree命令 yum install y tree 以树形结构显示文件目录 显示如下特别注意一下目录 root boot dev etc home bin srv usr loca
  • S11、反射系数、回损、VSWR之间的换算

    文章目录 1 S参数 2 反射系数 3 电压驻波比 VSWR 4 回损 RL 5 换算表 6 反射功率系数 7 传输功率系数 8 统一转换 参考 在学习天线设计过程中 遇到许多经常出现的参数 总结一下避免以后每次都去查找资料 1 S参数 S
  • Springboot2整合mybatis-plus+swagger+druid

    一 简介 1 版本 springboot版本为2 0 5 RELEASE mybatisplus版本为2 1 9 2 项目地址 https gitee com wbsxch ssm git 3 留个记录 方便查找 开发步骤 1 新建spri