springboot整合第三方框架

1. 整合mybatis

引入依赖

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--mysql的驱动依赖 3.-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--mybatis和springboot整合的jar.-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.3.1</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>
    </dependencies>

配置文件

spring.application.name=qy174-springboot-mybatis

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

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

实体类

@Data
public class User {
    private Integer userid;
    private String username;
    private String sex;
    private Integer age;
}

dao

public interface UserDao {
    int insert(User user);
    int delete(Integer id);
    int update(User user);
    User select(Integer id);
    List<User> selectAll();
}

映射文件

<?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.ykq.dao.UserDao">

    <insert id="insert">
        insert into user(username,age,sex) values(#{username},#{age},#{sex})
    </insert>
    <update id="update">
        update user set username=#{username},age=#{age},sex=#{sex} where userid=#{userid}
    </update>
    <delete id="delete">
        delete from user where userid=#{id}
    </delete>
    <select id="selectById" resultType="com.ykq.entity.User">
        select * from user where userid=#{id}
    </select>
    <select id="selectAll" resultType="com.ykq.entity.User">
        select * from user
    </select>

</mapper>

service

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
    @Override
    public R selectAll() {
        List<User> users = userDao.selectAll();
        return new R(200,"查询成功",users);
    }

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

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

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

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

controller代码

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    @GetMapping("/list")
    public R list() {
        return userService.selectAll();
    }

    @GetMapping("/getById")
    public R getById(Integer id) {
        return userService.selectById(id);
    }

    @DeleteMapping("/deleteById")
    public R deleteById(Integer id) {
        return userService.delete(id);
    }

    @PostMapping("/insert")
    public R insert(@RequestBody User user) {
        return userService.insert(user);
    }

    @PutMapping("/update")
    public R update(@RequestBody User user) {
        return userService.update(user);
    }
}

常见错误

没有为dao生成代理实现类

请添加图片描述

解决: 生成代理实现类

请添加图片描述

mybatis和springboot整合的版本太高

请添加图片描述

2. springboot整合swagger2

2.1 什么是swagger2

Swagger2 是一个规范和完整的框架,用于生成、描述、调用和可视化Restful风格的web服务,现在我们使用spring boot 整合它。

作用:

  • 接口的文档在线自动生成;
  • 功能测试;

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

2.2 为什么需要使用swagger2

Swagger2是一个流行的工具,它通过自动从代码中提取注解来生成易于理解的API文档。这些文档不仅清晰展示了API的功能、如何使用它们以及可能的响应,还允许用户直接在网页上测试这些API。

​ Swagger2提供了一个统一和标准化的方式来描述API,所以它帮助开发者无论在团队协作还是个人学习时都能快速掌握API的使用,同时提高了开发效率和API的可用性。简而言之,Swagger2就像一个智能的API说明书,让复杂的技术细节变得简单易懂。

2.3 如何使用swagger2

<!--引入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 SwaggerConfig {

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

        return docket;
    }

    private ApiInfo getInfo(){
        Contact DEFAULT_CONTACT = new Contact("lcy", "http://www.lcy.com", "110@qq.com");
        ApiInfo DEFAULT = new ApiInfo("用户管理系统API", "该系统中的接口专门操作用户的", "v1.0", "http://www.baidu.com",
                DEFAULT_CONTACT, "漫动者", "http://www.aaa.com", new ArrayList<VendorExtension>());
        return DEFAULT;
    }
}

开启swagger的注解驱动

请添加图片描述

访问swagger接口文档

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

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

2.4 swagger2常用注解

1. @Api(tags=“”): 使用在接口类上,对接口类的说明
2. @ApiOperation(value=""):接口方法上,对接口方法的说明
3. @ApiImplicitParams(
           @ApiImplicitParam(name=“参数名”,value="参数说明",require="是否必写",dataType="数据类型") 
    ) : 接口方法所有参数的概述
    
4. @ApiModel(value=""): 使用在实体类上,对实体类的说明
5. @ApiModelProperty(value=""):使用在实体类属性上,对属性的说明

3. springboot整合定时器

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

比如: 下单。30分钟未支付取消订单。 比如: 新用户注册成功后,7天发送问候语。

引入定时器依赖

  <!--引入 定时器 依赖-->
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

创建一个定时业务类

@Configuration
public class MyQuartzConfig {

    //定时业务代码
    //定义定时规则  cron="定时器规则"
    @Scheduled(cron = "0/5 * * * * ?")
    public void show(){
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        //发生短信 或者删除oss冗余文件  或者取消订单
    }
}

开启定时器注解驱动

请添加图片描述

cron:表达式

生成cron表达式的网站:https://cron.ciding.cc/

4. springboot整合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 准备条件

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user`
(
    id BIGINT NOT NULL COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (id)
);
DELETE FROM `user`;

INSERT INTO `user` (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

4.4 使用Mp

<!--加入mybatis-plus的依赖   不用在加入mybatis的依赖,mybatis-plus包含-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.7</version>
</dependency>

配置文件

spring.application.name=qy174-springboot-mp

#数据库
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mp?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root

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

#配置日志--sql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

实体类

@Data
public class User {
    @TableId(value="id")
    private Integer id;
    private String name;
    private Integer age;
    private String email;
}

mapper

public interface UserMapper extends BaseMapper<User> {
}

为mapper生成代理实现类

请添加图片描述

4.5 测试

4.5.1 根据id查询

@SpringBootTest
class Qy174SpringbootMpApplicationTests {
    @Autowired
    private UserMapper userMapper;

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

4.5.2 添加

 @Test
    void testInsert(){
        //添加一条记录
//        User user=new User(null,"刘帅鹏",19,"123@qq.com");
//        //添加--把生成的主键也会赋值给对象中主键属性
//        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,"李硕",18,"123@qq.com"));
//        list.add(new User(null,"李梦朝",19,"223@qq.com"));
//        list.add(new User(null,"秦桂祥",19,"323@qq.com"));
//        list.add(new User(null,"刘瑞",17,"323@qq.com"));
//        List<BatchResult> insert = userMapper.insert(list);

        //如果有id则修改 没有则添加
        User user=new User(2,"刘帅鹏",19,"123@qq.com");
        userMapper.insertOrUpdate(user);
        
    }

4.5.3 删除

    @Test
    public void testDelete(){
        //根据主键删除
//        int i = userMapper.deleteById(1);
//        System.out.println(i);
        //批量删除
//        int i = userMapper.deleteByIds(Arrays.asList(1, 2, 3));
//        System.out.println(i);

        //根据条件删除
//        Wrapper:条件类对象. 每个条件被封装成对应的方法
        UpdateWrapper<User> wrapper=new UpdateWrapper<>();
//        wrapper.like("uname","刘"); //小于
//        wrapper.le("age",19);
//        wrapper.in("uname","jone","Tom");
//        wrapper.ne("age",19);
//        wrapper.between("age",19,35);
        wrapper.like("uname","六").or().gt("age",19);
        userMapper.delete(wrapper);

    }

4.5.4 更新

@Test
    public void testUpdate(){
        //根据主键更新一条数据
//        User user=new User(1,"刘帅鹏",19,"123@qq.com");
//        int i = userMapper.updateById(user);
//        System.out.println(i);
        //批量更新
//        List<User> users=new ArrayList<>();
//        Collections.addAll(users,
//                new User(1,"张学友",19,"118"),
//                new User(2,"闫克起",17,"120"),
//                new User(3,"刘德华",110,"130"));
//        userMapper.updateById(users);

        //根据其他条件更新
        User user=new User();
        user.setAge(110);
        userMapper.update(user,new UpdateWrapper<User>().eq("uname","刘德华"));
    }

4.5.5 查询

 @Test
    public void testSelect(){
        UserVo userVo =new UserVo();
        userVo.setName("李");
        userVo.setMin(9);
        QueryWrapper<User> wrapper=new QueryWrapper<>();
        //指定查询的列
        if(StringUtils.isNotBlank(userVo.getName())){
             wrapper.like("uname",userVo.getName());
        }
        if(userVo.getMin()!=null){
            wrapper.ge("age",userVo.getMin());
        }

        if(Objects.nonNull(userVo.getMax())){
            wrapper.le("age",userVo.getMax());
        }

        List<User> users = userMapper.selectList(wrapper);
        users.stream().forEach(System.out::println);
    }

4.5.6 分页查询

   //你没有使用mp的分页拦截器
    @Test
    public void testSelectPage(){
        //分页对象
        Page<User> page=new Page<>(2,2);
        //查询条件对象
        Page<User> userPage = userMapper.selectPage(page, null);

        System.out.println("总页数:"+userPage.getPages());
        System.out.println("当前页的记录:"+userPage.getRecords());
        System.out.println("总条数:"+userPage.getTotal());
    }
@Configuration
public class MybatisPlusConfig {

    /**
     * 添加分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

分页都使用mp的分页插件 不要在使用pageHelper 存在bug.

4.5.7 连表分页条件查询

mp 它只能用于单表的CRUD操作,不能用于链表操作。 但是我想连表时使用mp的分页插件,以及条件对象

查询用户信息包含班级信息

dao

@Repository
public interface UserDao extends BaseMapper<User> {
    IPage<User> selectByPage(IPage<User> page, @Param("ew") Wrapper<User> queryWrapper);
}

映射文件

<?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.example.qy174springbootmp.mapper.UserMapper">

    <resultMap id="BaseMapping" type="com.example.qy174springbootmp.entity.User">
        <id property="id" column="id" javaType="java.lang.Integer"/>
        <result property="name" column="uname" javaType="java.lang.String"/>
        <result property="age" column="age" javaType="java.lang.Integer"/>
        <result property="email" column="email" javaType="java.lang.String"/>
        <!--多对一的标签-->
        <association property="clazz" javaType="com.example.qy174springbootmp.entity.Clazz">
            <id property="cid" column="cid" javaType="java.lang.Integer"/>
            <result property="cname" column="cname" javaType="java.lang.String"/>
        </association>
    </resultMap>

    <select id="selectByPage" resultMap="BaseMapping">
       select * from tbl_user u join tbl_clazz c on u.class_id=c.cid
       ${ew.customSqlSegment}
    </select>
</mapper>

测试

@Test
    public void testSelectByPage(){
        Page<User> page=new Page<>(1,2);
        QueryWrapper<User> wrapper=new QueryWrapper<>();
//        wrapper.like("uname","张");
        IPage<User> userPage = userMapper.selectByPage(page, wrapper);
        System.out.println("总页数:"+userPage.getPages());
        System.out.println("当前页的记录:"+userPage.getRecords());
        System.out.println("总条数:"+userPage.getTotal());
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值