• SPring Boot整合第三方框架


    springboot整合第三方框架

    1. 整合mybatis

    1.1引入依赖——pom.xml配置文件

     
    <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.0modelVersion>
        <parent>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>2.3.12.RELEASEversion>
            <relativePath/> 
        parent>
        <groupId>com.examplegroupId>
        <artifactId>sbAndMybatisartifactId>
        <version>0.0.1-SNAPSHOTversion>
        <name>sbAndMybatisname>
        <description>sbAndMybatisdescription>
    
        <properties>
            <java.version>8java.version>
        properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
                <optional>trueoptional>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
            dependency>
            
            <dependency>
                <groupId>mysqlgroupId>
                <artifactId>mysql-connector-javaartifactId>
            dependency>
            
            <dependency>
                <groupId>repMaven.org.mybatis.spring.bootgroupId>
                <artifactId>mybatis-spring-boot-starterartifactId>
                <version>2.1.4version>
            dependency>
        dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>repMaven.org.springframework.bootgroupId>
                    <artifactId>spring-boot-maven-pluginartifactId>
                    <version>3.2.5version>
                    <configuration>
                        <excludes>
                            <exclude>
                                <groupId>org.projectlombokgroupId>
                                <artifactId>lombokartifactId>
                            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文件

    
    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 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 如何使用

    • 引入依赖
    
            <dependency>
                <groupId>com.spring4allgroupId>
                <artifactId>swagger-spring-boot-starterartifactId>
                <version>1.9.1.RELEASEversion>
            dependency>
            
            <dependency>
                <groupId>com.github.xiaoymingroupId>
                <artifactId>swagger-bootstrap-uiartifactId>
                <version>1.9.6version>
            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", "110@qq.com");
            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.bootgroupId>
                <artifactId>spring-boot-starter-quartzartifactId>
            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.baomidougroupId>
        <artifactId>mybatis-plus-boot-starterartifactId>
        <version>3.5.7version>
    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,"123@qq.com");
    //        //添加--把生成的主键也会赋值给对象中主键属性
    //        System.out.println("填进去:"+user);
    //        int row = userMapper.insert(user);
    //        System.out.println(row);
    //        System.out.println("填进去后:"+user);
    
            //批量添加
    //        List list=new ArrayList<>();
    //        list.add(new User(null,"aa",18,"123@qq.com"));
    //        list.add(new User(null,"aaa",19,"223@qq.com"));
    //        list.add(new User(null,"vb",19,"323@qq.com"));
    //        list.add(new User(null,"bb",17,"323@qq.com"));
    //        List insert = userMapper.insert(list);
    
    
            //如果有id则修改 没有则添加
            User user=new User(2,"sss",19,"123@qq.com");
            userMapper.insertOrUpdate(user);
            
        }
    
  • 相关阅读:
    机器学习:过拟合、欠拟合、正则化之间的纸短情长~
    【仿真建模】第五课:AnyLogic入门基础课程 - 地铁车站仿真讲解
    Unity2023 Alpha新功能简介
    java RMI 协议通过zookeeper的实现
    excel打开只显示菜单栏内容却不显示改如何处理
    vue3后台管理系统之登录界面和业务的实现
    (vue)iView 表格点击编辑按钮后编辑当前行
    CSV intro
    Windows下Python安装FDFS-client错误问题
    Java项目:SSM的宠物医院管理系统
  • 原文地址:https://blog.csdn.net/qq_59099003/article/details/140388017