1.springboot整合swagger2
1.1 swagger2 简介
Swagger是为了解决企业中接口(api)中定义统一标准规范的文档生成工具。方便各大后端小基友的懒问题,但是写注解也是妥妥的麻烦,但是如果版本迭代快或者人员的流动性大,会导致很多问题。所以很多企业中都会有统一的规范文档,来定义接口标准。
1.2 swagger2的 优点
swagger2的优点自然不言而喻,它最大的优点是能实时同步api与文档,减轻开发人员的工作量与保证接口文档与后端代码的一致性,另外可以不需第三方工具在线测试。通过 Swagger 页面,我们可以直接进行接口调用,降低了项目开发的调试成本。
1.3 使用接口文档swagger2
1.2.1 导入依赖
<!--swagger2依赖-->
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
<version>1.9.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.7.8</version>
</dependency>
1.2.2 创建一个配置类-swagger2
/**
* @program: mybatis_plus
* @author: ♥丁新华
* @create: 2023-04-12 19:25
**/
@Configuration
@EnableSwagger2//开启swagger注解驱动
public class SwaggerConfig {
@Bean //把方法返回的数据对象 交于spring容器管理
public Docket docket(){
Docket docket = new Docket(DocumentationType.SWAGGER_2).groupName("QY163")
.apiInfo(getInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.dxh.controller")) //只为com.dxh.controller包下的类生成接口文档
.build();
return docket;
}
private ApiInfo getInfo(){
Contact DEFAULT_CONTACT = new Contact("邢傲林", "http://www.baidu.com", "110@qq.com");
ApiInfo apiInfo=new ApiInfo("班级学生表CRUD", "班级学生表CRUD", "1.1.0", "http://www.jd.com",
DEFAULT_CONTACT, "AAA科技", "http://www.aaa.com", new ArrayList<VendorExtension> ());
return apiInfo;
}
}
1.2.3 访问swagger在线文档
(1) http://ip:port/swagger-ui.html路径
(2) http://ip:port/doc.html 路径
(建议使用第二种方法)
1.4 使用接口文档swagger2
1.4.1 swagger中常用的注解
@Api:修饰整个类,描述Controller的作用
@ApiOperation:描述一个类的一个方法,或者说一个接口
@ApiParam:单个参数描述
@ApiModel:用对象来接收参数
@ApiModelProperty:用对象接收参数时,描述对象的一个字段
@ApiImplicitParam:一个请求参数
@ApiImplicitParams:多个请求参数
2.springboot 整合定时器-quartz
什么是quartz
Quartz
是Java
定时任务领域一个非常优秀的框架,由OpenSymphony
(一个开源组织)开发,这个框架进行了优良地解耦设计,整个模块可以分为三大部分:
Job
:顾名思义,指待定时执行的具体工作内容;Trigger
:触发器,指定运行参数,包括运行次数、运行开始时间和技术时间、运行时长等;Scheduler
:调度器,将Job
和Trigger
组装起来,使定时任务被真正执行;
quartz 特点
具有强大的调度功能,与Spring容易集成,形成灵活的调度功能。
调度环境的持久化机制:可以保存并恢复调度现场,即使系统因为故障关闭,任务调度现场的数据并不会丢失。
灵活的应用方式:可以灵活的定义触发器调度时间表,并可对触发器与任务进行关联映射(通过Name和Group形式为一个的JobKey),分布式与集群能力
在线Cron表达式生成器Cron表达式在线生成器,方便的在线生成各类Cron表达式,并可以将Cron表达式的可视化双向解析和生成.https://www.pppet.net/
2.1 引入quartz依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2.2 配置定时器任务
@Component
public class QuarzConfig {
@Resource
private StudentMapper studentMapper;
//定时器
@Scheduled(cron = "0/5 * * * * ?")
public void test(){
Student student = studentMapper.selectById (2);
System.out.println (student);
System.out.println ("********");
System.out.println ("*******");
System.out.println ("*****");
System.out.println ("***");
}
}
2.3 开启定时器注解驱动
@SpringBootApplication
@MapperScan(basePackages ="com.dxh.mapper")
//@ComponentScan 人为指定扫描的包
@EnableScheduling //开启定时器
public class Spring03Application {
public static void main(String[] args) {
SpringApplication.run (Spring03Application.class, args);
}
}
2.4 测试
3. springboot整合mp整合swagger2完成crud
3.1 导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</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>3.5.3.1</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<!--mybatis和springboot整合的依赖 启动依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
</dependency>
<!--swagger2依赖-->
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
<version>1.9.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.7.8</version>
</dependency>
<!--定时器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
</dependencies>
3.2 创建实体类
/**
* 学生表
* @TableName student
*/
@ApiModel(value = "学生表") //表 明 该 类 为 实 体 类
@TableName(value = "student") //关联表 以防 表明和实体类名不一致
public class Student {
/**
* 学生ID
*/
@ApiModelProperty("学生ID")// 实 体 类 的 属 性 名
@TableId(type = IdType.AUTO) //表 明 主 键 自 增
private Integer sid;
/**
* 学生姓名
*/
@ApiModelProperty("学生姓名")
private String sname;
/**
* 年龄
*/
@ApiModelProperty("年龄")
private Integer age;
/**
* 班级名
*/
@ApiModelProperty("班级名")
private Integer cid;
@TableField(exist = false) //表示这个列在表中不存在
private Class01 c1;
public Student() {
}
public Student(String sname, Integer age, Integer cid) {
this.sname = sname;
this.age = age;
this.cid = cid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
private Class01 getC1() {
return c1;
}
private void setC1(Class01 c1) {
this.c1 = c1;
}
@Override
public String toString() {
return "Student{" +
"sid=" + sid +
", sname='" + sname + '\'' +
", age=" + age +
", cid=" + cid +
", c1=" + c1 +
'}';
}
}
/**
* 班级表
* @TableName class01
*/
@ApiModel(value = "班级表")//表明该类为 实体类
@TableName(value = "class01")
public class Class01 {
/**
* 班级ID
*/
@ApiModelProperty("班级ID") //实体类的属性名
private Integer cid;
/**
* 班级名
*/
@ApiModelProperty("班级名")
private String cname;
/**
* 班级ID
*/
private void setCid(Integer cid){
this.cid = cid;
}
/**
* 班级名
*/
private void setCname(String cname){
this.cname = cname;
}
/**
* 班级ID
*/
private Integer getCid(){
return this.cid;
}
/**
* 班级名
*/
private String getCname(){
return this.cname;
}
@Override
public String toString() {
return "Class01{" +
"cid=" + cid +
", cname='" + cname + '\'' +
'}';
}
}
3.2 创建对应mapper映射文件
<?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.dxh.mapper.StudentMapper">
<resultMap id="BaseResultMap" type="com.dxh.pojo.entity.Student">
<id property="sid" column="sid" jdbcType="INTEGER"/>
<result property="sname" column="sname" jdbcType="VARCHAR"/>
<result property="age" column="age" jdbcType="INTEGER"/>
<result property="cid" column="cid" jdbcType="INTEGER"/>
<association property="c1" javaType="com.dxh.pojo.entity.Class01" autoMapping="true">
<id property="cid" column="cid"/>
</association>
</resultMap>
<sql id="Base_Column_List">
sid,sname,age,
s.cid,c.cname
</sql>
<select id="findByPage" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/> from student s join class01 c on s.cid = c.cid
<if test="ew != null and ew.sqlSegment != ''">
<where>
and ${ew.sqlSegment}
</where>
</if>
</select>
</mapper>
3.3 创建 service 服务层
/**
* @program: mybatis_plus
* @author: ♥丁新华
* @create: 2023-04-12 19:28
**/
public interface StudentService extends IService<Student> {
/**
* 分 页
* @param current
* @param pageSize
* @param studentVo
* @return
*/
public Result findByPage(Integer current, Integer pageSize, StudentVo studentVo);
/**
* 增加数据
* @return
*/
public Result InsertStu(Student s);
/**
* 删除数据
*/
public Result deleteBySid(Integer sid);
/**
* 修改数据
*/
public Result updateStu(Student s);
/**
* 查询数据
*/
public Result queryAll();
/**
* 根据ID查询数据
*/
public Result queryById(Integer sid);
}
3.4 创建 impl 实现 层
/**
* @program: mybatis_plus
* @author: ♥丁新华
* @create: 2023-04-12 19:40
**/
@Service
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student>
implements StudentService{
@Resource
private StudentMapper studentMapper;
/**
* 分 页 查 询
* @param current
* @param pageSize
* @param studentVo
* @return
*/
@Override
public Result findByPage(Integer current, Integer pageSize, StudentVo studentVo) {
//Mybatis-plus使用iPage分页
IPage<Student> iPage = new Page<> (current,pageSize);
// 条件构造器
QueryWrapper<Student> wrapper = new QueryWrapper<> ();
//判 断
if (StringUtils.hasText (studentVo.getSname ())){
wrapper.like ("sname",studentVo.getSname ());
}if (Objects.nonNull (studentVo.getMinAge ())){
wrapper.gt ("age",studentVo.getMinAge ());
}if (Objects.nonNull (studentVo.getMaxAge ())){
wrapper.lt ("age",studentVo.getMaxAge ());
}
IPage<Student> byPage = studentMapper.findByPage (iPage, wrapper);
return new Result (200,"成功",byPage);
}
/**
* 增 加 数 据
* @param s
* @return
*/
@Override
public Result InsertStu(Student s) {
//Student student = new Student ("ss",15,2);
int insert = studentMapper.insert (new Student (s.getSname (),s.getAge (),s.getCid ()));
return new Result (200,"添加学生信息成功",insert);
}
/**
* 根 据 ID 删 除
* @param sid
* @return
*/
@Override
public Result deleteBySid(Integer sid) {
int i = studentMapper.deleteById (sid);
System.out.println (i);
return new Result (200,"删除学生信息成功",i);
}
/**
* 修 改 数 据
* @param s
* @return
*/
@Override
public Result updateStu(Student s) {
int i = studentMapper.updateById (s);
return new Result (200,"修改学生信息成功",i);
}
/**
* 查 询 全 部
* @return
*/
@Override
public Result queryAll() {
QueryWrapper<Student> wrapper = new QueryWrapper<> ();
List<Student> students = studentMapper.selectList (wrapper);
for (Student student : students) {
System.out.println (student);
}
return new Result (200,"查询学生信息成功",students);
}
/**
* 根 据 ID 查 询
* @param sid
* @return
*/
@Override
public Result queryById(Integer sid) {
Student student = studentMapper.selectById (sid);
return new Result (200,"查询学生ID成功",student);
}
}
3.5 创建 控制层
/**
* @program: spring03
* @author: ♥丁新华
* @create: 2023-04-12 20:01
**/
@Api(tags = "学生接口")
@RestController
@RequestMapping
public class StudentController {
@Autowired
private StudentService studentService;
@PostMapping("list/{current}/{pageSize}")
//接口方法加以说明
@ApiOperation (value = "根据条件查询学生信息")
public Result findByPage(
@ApiParam(value = "当前页面",name = "current",required = true,defaultValue = "1")
//映射url绑定的占位符
@PathVariable Integer current,
@ApiParam(value = "每页显示条数",name = "pageSize",required = true,defaultValue = "3")
@PathVariable Integer pageSize,
//用来接收前端传递给后端的json字符串中的数据
@RequestBody StudentVo studentVo
){
return studentService.findByPage (current, pageSize, studentVo);
}
/**
* 增加数据
*/
@ApiOperation (value = "添加学生信息")
@PostMapping("InsertStu")
public Result InsertStu(@RequestBody Student s){
return studentService.InsertStu (s);
}
/**
* 删除数据
*/
@ApiOperation (value = "删除学生信息")
@DeleteMapping("deleteBySid/{sid}")
public Result deleteBySid(@PathVariable Integer sid){
return studentService.deleteBySid (sid);
}
/**
* 修改数据
*/
@ApiOperation (value = "修改学生信息")
@PutMapping("updateStu")
public Result updateStu(@RequestBody Student s){
return studentService.updateStu (s);
}
/**
* 查询所有数据
*/
@ApiOperation (value = "查询所有学生信息")
@GetMapping("queryAll")
public Result queryAll(){
return studentService.queryAll ();
}
/**
* 根据ID查询数据
*/
@ApiOperation (value = "根据ID查询所有学生信息")
@GetMapping("queryById/{sid}")
public Result queryById(@PathVariable Integer sid){
return studentService.queryById (sid);
}
}