Skip to content
On this page

业务代码编写示例

源码启动

父pom引入

xml
  <parent>
        <groupId>com.cpbf</groupId>
        <artifactId>boot</artifactId>
        <version>2.1.3</version>
    </parent>

业务代码编写示例

controller 层

java
/**
 * @Classname DemoController
 * @Description TODO
 * @Date 2021/12/21 9:44
 * @Created by evolsun
 */
@RestController
@Api(tags = "示例")
public class DemoController {
    @Resource
    private DemoService demoService;
    /**
     * 示例方法
     *
     * @Date 2021/12/21 13:44
     * @Created by evolsun
     */
    @ApiOperation(value = "示例方法")
    @GetMapping(name = "示例方法", path = "/json/success")
    public ResponseData renderSuccess() {
        demoService.demoService();
        StpUtil.login(10001);
        StpUtil.checkLogin();
        return new SuccessResponseData();
    }
}

service层

java
/**
 * 演示服务
 *
 * @author evolsun
 * @Classname DemoService
 * @Description TODO
 * @Date 2021/12/21 9:55
 * @Created by evolsun
 */
public interface DemoService {

    /**
     * 演示服务
     */
    public void demoService();
}

service实现层

java
/**
 * 演示服务impl
 *
 * @author evolsun
 * @Classname DemoServiceImpl
 * @Description TODO
 * @Date 2021/12/21 9:57
 * @Created by evolsun
 */
@Service
public class DemoServiceImpl extends ServiceImpl<DemoMapper, Demo> implements DemoService, DemoServiceApi {

    @Resource
    DemoMapper demoMapper;
    /**
     * 演示服务
     */
    @Override
    public void demoService() {
//        demoMapper.selectById(1);
        System.out.println("这是一个demo方法");
    }
}

mapper层

java
/**
 * @Classname DemoMapper
 * @Description TODO
 * @Date 2021/12/21 10:12
 * @Created by evolsun
 */
@Mapper
public interface DemoMapper  extends BaseMapper<Demo> {
}

mapper xml文件

java
<?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.chinapost.cpitboot.service.business.mapper.DemoMapper">
    <select id="exist" resultType="boolean">
        select count(1) from demo
    </select>
</mapper>

Mybatis-plus

核心功能

CURD接口

  • 通用 Service CRUD 封装IService (opens new window)接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,
  • 泛型 T 为任意实体对象
  • 建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类
  • 对象 Wrapper 为 条件构造器

Save

java
// 插入一条记录(选择字段,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection<T> entityList);
// 插入(批量)
boolean saveBatch(Collection<T> entityList, int batchSize);

参数说明

类型参数名描述
Tentity实体对象
intbatchSize插入批次数量
Collection<T>entityList实体对象集合

SaveOrUpdate

java
// 插入一条记录(选择字段,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection<T> entityList);
// 插入(批量)
boolean saveBatch(Collection<T> entityList, int batchSize);

参数说明

类型参数名描述
Tentity实体对象
intbatchSize插入批次数量
Collection<T>entityList实体对象集合
Wrapper<T>updateWrapperupdateWrapper

Remove

java
// 插入一条记录(选择字段,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection<T> entityList);
// 插入(批量)
boolean saveBatch(Collection<T> entityList, int batchSize);

参数说明

类型参数名描述
Wrapper<T>queryWrapper实体包装类 QueryWrapper
Serializableid主键ID
Map<String, Object>columnMap表字段 map 对象
Collection<? extends Serializable>idList主键ID列表

Update

java
// 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
boolean update(Wrapper<T> updateWrapper);
// 根据 whereWrapper 条件,更新记录
boolean update(T updateEntity, Wrapper<T> whereWrapper);
// 根据 ID 选择修改
boolean updateById(T entity);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList, int batchSize);

参数说明

类型参数名描述
Wrapper<T>updateWrapper实体对象封装操作类 UpdateWrapper
Tentity实体对象
Map<String, Object>columnMap表字段 map 对象
Collection<? extends Serializable>idList主键ID列表

插件

插件主体

MybatisPlusInterceptor

该插件是核心插件,目前代理了Executor#query和Executor#update和StatementHandler#prepare方法。我们提供的插件都将基于此接口来实现功能,目前已有的功能:

  • 自动分页: PaginationInnerInterceptor
  • 乐观锁: OptimisticLockerInnerInterceptor

Swagger

关于Swagger

Swagger是一组围绕 OpenAPI 规范构建的开源工具,可以帮助开发人员设计、构建、记录和使用 REST API。主要的 Swagger 工具包括:

  • Swagger Editor – 基于浏览器的编辑器,开发人员可以在其中编写 OpenAPI 规范;
  • Swagger UI – 将 OpenAPI 规范呈现为交互式 API 文档;
  • Swagger Codegen – 从 OpenAPI 规范生成服务器存根和客户端库;

Swagger集成

  • 服务端框架已经集成Swagger插件,可在application.yml/application.properties配置文件中指定使用Swagger 2.0或者3.0版本。例如在.yml文件中指定swaggerVersion:3.0。默认使用2.0版本
  • 单独集成需在POM文件中引入依赖
xml
  <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-boot-starter</artifactId>
      <version>3.0.0</version>
  </dependency>
  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.12.RELEASE</version>
  </dependency>

配置SwaggerConfig

java
@Configuration
public class SwaggerConfig implements WebMvcConfigurer {
    /**
     * 创建rest api
     *
     * @return {@link Docket}
     */
    @Bean
    public Docket createRestApi() {
        //使用swagger 3.0.0
        Docket docket = new Docket(DocumentationType.OAS_30);
        return docket
                .pathMapping("/")
                // 定义是否开启swagger,false为关闭,可以通过变量控制
                .enable(true)
                // 将api的元信息设置为包含在json ResourceListing响应中。
                .apiInfo(apiInfo())
                // 选择哪些接口作为swagger的doc发布
                .select()
                //扫描全局
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build()
                // 支持的通讯协议集合
                .protocols(Sets.newHashSet("http", "https"));
    }

    /**
     * api的信息 API 页面上半部分展示信息 @return {@link ApiInfo}
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title(" Api Doc")
                .version(
                        "Application Version: "
                                + "1.0.0"
                                + ", Spring Boot Version: "
                                + SpringBootVersion.getVersion())
                .build();
    }
}

  • 访问ip:port/swagger-ui/index.html#即可查看

Swagger使用

java
  * 控制类中的注解 
     * @Api 类注解,在控制类添加此注解,可以对控制器类进行功能说明
        * tags="说明该类的作用,可以在UI界面上看到的注解"
        * value="该参数没什么意义,可以不配置"
     * @ApiOperation 方法注解:说明接口方法的作用
        * value="说明方法的用途、作用"
        * notes="方法的备注说明"
     * @ApiImplicitParams和@ApiImplicitParam 方法注解,说明接口方法的参数
        * @ApiImplicitParam:用在@ApiImplicitParams注解中,指定一个请求参数的各个方面
          * name:参数名
          * value:参数的汉字说明、解释
          * required:参数是否必须传
          * paramType:参数放在哪个地方
             * · header --> 请求参数的获取:@RequestHeader
             * · query --> 请求参数的获取:@RequestParam
             * · path(用于restful接口)--> 请求参数的获取:@PathVariable
             * · div(不常用)
             * · form(不常用)
          * dataType:参数类型,默认String,其它值dataType="Integer"
          * defaultValue:参数的默认值
     * @ApiIgnore 方法注解,接口不会在ui文档中出现
     * @ApiResponses:用在请求的方法上,表示一组响应
        * @ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
           * code:数字,例如400
           * message:信息,例如"请求参数没填好"
           * response:抛出异常的类
java
      @RestController
      @RequestMapping("/user")
      @Api(value = "提供用户的登录和注册接口",tags = "用户管理")
      public class UserController {
      
          @Resource
          private UserService userService;
      
          @ApiOperation("用户登录接口")
          @ApiImplicitParams({
                  @ApiImplicitParam(dataType = "string",name = "username",value = "用户登录账号",required = true),
                  @ApiImplicitParam(dataType = "string",name = "password",value = "用户登录密码",required = false,defaultValue = "111111")
          })
          @GetMapping("/login")
          public ResultVO login(@RequestParam("username") String name,@RequestParam(value = "password",defaultValue = "111111") String pwd){
              return userService.checkLogin(name,pwd);
          }
      }
  • 返回实体类和参数实体类注解
    • @ApiModel 类注解,在返回和参数实体类添加此注解,可以对返回和参数实体类进行说明
    • @ApiModelProperty:用在属性上,描述响应类的属性
    java
        @ApiModel(value = "响应的VO对象",description = "封装接口返回给前端的数据")
        public class ResultVO {
          //响应给前端的状态码
          @ApiModelProperty(value = "响应状态码",dataType = "int")
          private int code;
          //响应给前端的信息
          @ApiModelProperty(value = "响应信息",dataType = "String")
          private String msg;
          //响应给前端的数据
          @ApiModelProperty(value = "响应数据",dataType = "Object")
          private Object data;
        }