Bootstrap

SPring Boot整合第三方框架

springboot整合第三方框架

1. 整合mybatis

1.1引入依赖——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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>sbAndMybatis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>sbAndMybatis</name>
    <description>sbAndMybatis</description>

    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <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>
        <!--mysql依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--mybatis和springboot的整合的依赖-->
        <dependency>
            <groupId>repMaven.org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>repMaven.org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>3.2.5</version>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

spring-boot-starter-parent的版本为2.3.12,因为jdk版本为8,只有17及以上版本的jdk才可以用3.0以上的

mybatis-spring-boot-starter的版本依赖于上述的版本,为3.0的话会出现兼容问题,采用2.1.4

spring-boot-maven-plugin自动生成的会飘红,改为使用本地仓库的插件

1.2 配置文件

spring.application.name=sbAndMybatis
#数据源的信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/zmq?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456


#配置mybatis映射文件的路径
mybatis.mapper-locations=classpath:mapper/*.xml

在该文件中可以配置关于数据库的相关信息,也可以指定端口号和上下文路径

1.3 在entiry包下生成实体类User

@Data
public class User {
    private Integer id;
    private String username;
    private String password;
}

1.4 在dao包下生成接口UserDao

@Repository
public interface UserDao {
    //添加
    public int insert(User user);
    //删除
    public int del(Integer id);
    //修改
    public int update(User user);
    //查询全部
    public List<User> selectAll();
    //根据id查询
    public User selectById(Integer id);
}

1.5 在resources目录下生成mapper

在该文件下生成UserMapper.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.zmq.dao.UserDao">
    <!--resultMap映射-->
    <resultMap id="myMap" type="com.zmq.entity.User" autoMapping="true">
        <id property="id" column="id"/>
        <result property="username" column="u_name"/>
    </resultMap>
    <!--添加新用户-->
    <insert id="add">
        insert into user values (null,#{username},#{password})
    </insert>
    <insert id="insert">
        insert into user values (null,#{username},#{password})
    </insert>
    <update id="update">
        update user set u_name=#{username},password=#{password} where id=#{id}
    </update>
    <delete id="del">
        delete from user where id=#{id}
    </delete>
    <!--根据姓名和密码查询-->
    <select id="getByOthers" resultMap="myMap">
        select * from user where u_name=#{username} and password=#{password}
    </select>
    <select id="selectAll" resultMap="myMap">
        select * from user
    </select>
    <select id="selectById" resultMap="myMap">
        select * from user where id=#{id}
    </select>
</mapper>

1.6 在vo包下生成R类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class R {
    private Integer code;
    private String msg;
    private Object object;
}

该类用于统一返回信息的类型

1.7 在service包下生成UserService业务接口

public interface UserService {
    public  R insert(User user);
    public R del(Integer id);
    public R update(User user);
    public R selectAll();
    public R selectById(Integer id);
}

1.8 在service包下生成impl包

在该包下生成UserServiceImpl类,并实现UserService接口

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

    @Override
    public R insert(User user) {
        int insert = userDao.insert(user);
        if(insert>0){
            return new R(200,"添加成功!",null);
        }else {
            return new R(500,"添加失败!",null);
        }
    }

    @Override
    public R del(Integer id) {
        int del = userDao.del(id);
        if(del>0) {
            return new R(200,"删除成功!",null);
        }else {
            return new R(500,"删除失败!",null);
        }
    }

    @Override
    public R update(User user) {
        int update = userDao.update(user);
        if(update>0){
            return new R(200,"修改成功!",null);
        }else {
            return new R(500,"修改失败!",null);
        }
    }

    @Override
    public R selectAll() {
        List<User> list = userDao.selectAll();
        if(list!=null){
            return new R(200,"查询成功!",list);
        }else {
            return new R(500,"查询失败",null);
        }
    }

    @Override
    public R selectById(Integer id) {
        User user = userDao.selectById(id);
        if(user!=null){
            return new R(200,"查询成功",user);
        }else {
            return new R(500,"查询失败!",null);
        }
    }
}

1.9 在controller层生成UerController类

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    //添加
    @PostMapping("/insert")
    public R insert(@RequestBody User user){
       return userService.insert(user);
    }
    //删除
    @DeleteMapping("/delete")
    public R delete(Integer id){
        return userService.del(id);
    }
    //修改
    @PutMapping("/update")
    public R update(@RequestBody User user){
        return userService.update(user);
    }
    //查询全部
    @GetMapping("/selectAll")
    public R selectAll(){
        return userService.selectAll();
    }
    //根据id查询
    @GetMapping("/selectById")
    public R selectById(Integer id){
        return userService.selectById(id);
    }
}

1.10 在主类上添加注入dao层的注解

@SpringBootApplication
//为指定的dao生成代理实现类
@MapperScan(basePackages = "com.zmq.dao")
public class SbAndMybatisApplication {

    public static void main(String[] args) {
        SpringApplication.run(SbAndMybatisApplication.class, args);
    }

}

1.11 报错

  • 报错1

在这里插入图片描述

没有为dao生成代理实现类

在这里插入图片描述

  • 报错2

在这里插入图片描述

mybatis和springboot整合的版本太高

2. 整合swagger2

2.1 什么是swagger2

swagger2就是在线生成接口文档的,而且还可以对接口进行测试

Swagger2是一个规范和完整的框架,用于生成、描述、调用和可视化Restful风格的web服务,现在我们使用spring boot整合,作用:
1. 在线生成接口文档
2. 接口的功能测试

Restful风格:在controller层的注解使用:

添加:@PostMapping

删除:@DeleteMapping

修改:@PutMapping

查询:@GetMapping

2.2 为什么需要使用swagger2

因为项目为前后端分离,靠接口调用连接,就需要为每个接口生成接口文档,而手写word文档实时性差

在这里插入图片描述

2.3 如何使用

  • 引入依赖
<!--引入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.9.6</version>
        </dependency>

考虑版本不兼容问题

  • 创建swagger2配置类
@Configuration
public class Swagger2Config {
    //创建swagger实例
    @Bean
    public Docket docket() {
        Docket docket=
                new Docket(DocumentationType.SWAGGER_2)
                        .apiInfo(getInfo())//设置接口文档的信息
                        .select()
                        .apis(RequestHandlerSelectors.basePackage("com.zmq.controller")) //指定为那些路径下得到类生成接口文档
                        .build()
                ;

        return docket;
    }

    private ApiInfo getInfo(){
        Contact DEFAULT_CONTACT = new Contact("ldw", "http://www.ldw.com", "[email protected]");
        ApiInfo DEFAULT = new ApiInfo("用户管理系统API", "该系统中的接口专门操作用户的", "v1.0", "http://www.baidu.com",
                DEFAULT_CONTACT, "dong", "http://www.jd.com", new ArrayList<VendorExtension>());
        return DEFAULT;
    }
}

@Configuration:Spring注解:声明该类为配置类

@Bean注解:用在方法上,必须用在配置类里面,将当前方法的返回值对象存入容器中

Docket对象说明:

  • 构造方法:需要一个DocumentationType类对象,这里选择SWAGGER_2

在这里插入图片描述

在这里插入图片描述

Docket对象说明:

  • apiInfo():用于配置swagger 信息,设置接口文档的信息

这个类对象仅有如下属性,且只有一个构造方法。

  • 在主类上开启swagger的注解驱动
@SpringBootApplication
@MapperScan(basePackages = "com.zmq.dao")
//开启文档注解
@EnableSwagger2
public class SbAndMybatisWorkApplication {

    public static void main(String[] args) {
        SpringApplication.run(SbAndMybatisWorkApplication.class, args);
    }

}

@EnableSwagger2:开启swagger2的注解驱动

  • 访问swagger接口文档

第一种:http://localhost:8080/swagger-ui.html

第二种:http://localhost:8080/doc.html

2.4 swagger2常用注解

  • 对controller层的三个注解

@Api(tags=“”):使用在接口类上,对接口类的说明

@ApiOperation(value=“”):接口方法上,对接口方法的说明

@ApiImplicitParams(

@ApiImplicitParam(name=“参数名”,value=“参数说明”,required=“是否必写”,dataType=“数据类型”)

):接口方法所有参数的概述

@RestController
@RequestMapping("/user")
@Api(tags = "用户管理")
public class UserController {
    @Autowired
    private UserService userService;
    
    @PostMapping("/insert")
    @ApiOperation(value = "添加用户")
    @ApiImplicitParams(
            @ApiImplicitParam(name = "user" ,value="用户对象",required = true,dataType = "User")
    )
    public R insert(@RequestBody User user){
        return userService.isnert(user);
    }
    @GetMapping("/selectAll")
    public R selectAll(){
        return userService.selectAll();
    }
}
  • 对实体类的两个注解

@ApiModel(value=“”):使用在实体类上,对实体类的说明

@ApiModelProperty(value=“”):使用在实体类属性上,对属性的说明

@Data
@ApiModel(value = "用户实体类")
public class User {
    private Integer id;
    @ApiModelProperty(value = "用户姓名")
    private String username;
    @ApiModelProperty(value = "用户密码")
    private String password;
}

3. 整合定时器

在指定的时间执行相应的业务代码。场景:oss修改照片时,存在一个冗余照片。定时删除冗余照片

比如:下单,30分钟未支付就取消订单

  • 引入定时器依赖
  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
  • 创建一个定时业务类
@Configuration
public class QuartzConfig {
    //定时业务代码
    //定义定时规则
    @Scheduled(cron = "0/5 * * * * ?")
    public void show(){
        System.out.println("*******************");
         //发生短信 或者删除oss冗余文件  或者取消订单
    }
}

cron:表达式

  • 在主类上开启定时器注解驱动
@SpringBootApplication
@MapperScan(basePackages = "com.zmq.dao")
//开启文档注解
@EnableSwagger2
//开启定时器注解
@EnableScheduling
public class SbAndMybatisWorkApplication {

    public static void main(String[] args) {
        SpringApplication.run(SbAndMybatisWorkApplication.class, args);
    }
}

@EnableScheduling:开启定时器注解驱动

在线生成cron表达式:https://cron.ciding.cc/

4. 整合mybatis-plus

4.1 概述

MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强,不做改变,为简化开发、提高效率而生

4.2 特点

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作。
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询。
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

4.3 使用

  • 引入依赖
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.7</version>
</dependency>

若因为MyBatis-Plus和MyBatis的依赖版本问题而报错,可以将MyBatis的依赖删除,因为MyBatis-Plus中包含MyBatis的依赖,且保证了版本的一致性

  • 配置文件
spring.application.name=sbAndMP

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/zmq1?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456


#??mybatis???????
mybatis.mapper-locations=classpath:mapper/*.xml

#配置日志--sql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
  • 实体类
@TableName(value ="user")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
    /**
     * 主键ID
     */
    @TableId
    private Long id;

    /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 邮箱
     */
    private String email;

    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
  • mapper层
@Repository
public interface UserMapper extends BaseMapper<User> {
}
  • 在主类上为mapper生成代理实现类
//生成代理实现类
@MapperScan("com.zmq.mapper")
public class SbAndMpApplication {
    public static void main(String[] args) {        SpringApplication.run(SbAndMpApplication.class, args);
    }
}

测试:

  • 根据id查询
@SpringBootTest
class Qy174SpringbootMpApplicationTests {

    @Autowired
    private UserMapper userMapper;

    /**
     * 如果出现实体类和表名不一致。@TableName
     * 如果出现实体类属性名和字段名不一致。@TableField
     */
    @Test
    void testSelectById() {
        User user = userMapper.selectById(1);
        System.out.println(user);
    }

}
  • 添加
@Test
    void testInsert(){
        //添加一条记录
//        User user=new User(null,"qqq",19,"[email protected]");
//        //添加--把生成的主键也会赋值给对象中主键属性
//        System.out.println("填进去:"+user);
//        int row = userMapper.insert(user);
//        System.out.println(row);
//        System.out.println("填进去后:"+user);

        //批量添加
//        List<User> list=new ArrayList<>();
//        list.add(new User(null,"aa",18,"[email protected]"));
//        list.add(new User(null,"aaa",19,"[email protected]"));
//        list.add(new User(null,"vb",19,"[email protected]"));
//        list.add(new User(null,"bb",17,"[email protected]"));
//        List<BatchResult> insert = userMapper.insert(list);


        //如果有id则修改 没有则添加
        User user=new User(2,"sss",19,"[email protected]");
        userMapper.insertOrUpdate(user);
        
    }
;