SpringBoot知识02

news2024/12/24 3:08:35

1、快速生成mapper和service

(自动生成简单的单表sql)

2、springboot配置swagger(路径不用加/api)

(1)主pom导包(子pom要引用,可选依赖)

<!--            swagger3用-->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-boot-starter</artifactId>
                <version>3.0.0</version>
            </dependency>
            <dependency>
                <groupId>com.github.xiaoymin</groupId>
                <artifactId>knife4j-spring-boot-starter</artifactId>
                <version>3.0.3</version>
            </dependency>

(2)配置swagger和mvc

server:
  port: 8081


spring:
#  swagger使用
  mvc:
    path-match:
      matching-strategy: ant_path_matcher
  datasource:
    # 指定连接池的类型
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      url: "jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai"
      username: "root"
      password: "lht660036"
      max-active: 20
      # ???
      # wall  ??druid ???
      # stat  ??druid?????
      filters: "wall,slf4j,stat"
      web-stat-filter:
        enabled: true
        url-pattern: /*
        # ??????????
        exclusions: "/druid,*.png"
        # ???????
      stat-view-servlet:
        enabled: true
        url-pattern: "/druid/*"
        reset-enable: true
        login-username: admin
        login-password: admin


mybatis:


  # ??mapper.xml
  mapper-locations: "classpath*:mapper/**/*.xml"
  #  ???
  type-aliases-package: "com.lht.project.data.mybatis.entity"


swagger:
  base-package: "com.lht.project.data.mybatis.controller"
  title: "京东商城在线Api文档"
  group-name: "订单商城"
  description: "出现bug,请熟读该文档"

  name: "刘惠棠帅哥"
  url: "https://www.baidu.com"
  email: "11111@163.com"
  version: "1.0.0"


(3)定义swaggerProperties

package com.lht.project.data.mybatis.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties("swagger")
@Data
public class SwaggerProperties {
    private String title;
    private String basePackage;
    private String groupName;
    private String description;

    private String name;
    private String url;
    private String email;

    private String version;

}

(4)定义swaggerConfig

package com.lht.project.data.mybatis.config;

import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import javax.annotation.Resource;

@Configuration
@EnableOpenApi
public class SwaggerConfig {

    @Resource
    private SwaggerProperties swaggerProperties;

    @Bean
    public Docket docket(ApiInfo apiInfo){
        return new Docket(DocumentationType.OAS_30).apiInfo(apiInfo)
                .groupName(swaggerProperties.getGroupName())
                .select()
                .apis(RequestHandlerSelectors.basePackage(swaggerProperties.getBasePackage()))
                .paths(PathSelectors.any())
                .build();
    }

    @Bean
    public ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title(swaggerProperties.getTitle())
                .description(swaggerProperties.getDescription())
                .version(swaggerProperties.getVersion())
                .contact(new Contact(swaggerProperties.getName(), swaggerProperties.getUrl(), swaggerProperties.getEmail()))
                .build();
    }
}

(5)controller调用

3、配置junit5、日志(springboot自带)

4、日志的级别

info(正常信息)、debug、error(异常信息)

5、mybatisplus用了之后mybatis取别名就用不了了

6、目前导包都是写在父工程dependencyManagement里面,然后子类去调用的

7、springboot整合mybatisplus(自动有很多sql单表)

(1)父pom导入依赖(子也要引用)

<!--            mybatisplus-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.5.2</version>
            </dependency>

(2)mapper里面继承basemapper

public interface BrandMapper extends BaseMapper<Brand> {
}

(3)在实体类上映射好数据库表名与类名、属性名和字段名

package com.lht.project.data.mybatis.entity;

import java.util.Date;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

@Data
@TableName("sys_brand")
public class Brand {
    /**
     * 主键
     */
    @TableId(value = "brand_id",type = IdType.ASSIGN_ID)
    private Integer brandId;

    /**
     * 中文名
     */
    @TableField("chinese_name")
    private String chineseName;

    /**
     * 英文名
     */
    @TableField("english_name")
    private String englishName;

    /**
     * 产地id
     */
    @TableField("producer_id")
    private Integer producerId;

    /**
     * 备注
     */
    @TableField("notes")
    private String notes;

    /**
     * 图案(string)代替
     */
    @TableField("logo")
    @TableLogic(value = "1",delval = "0")
    private String logo;

    /**
     * 创建时间
     */
    @TableField("create_date")
    private Date createDate;


//动态select去除列用
    public  static final String COL_CHINESE_NAME="chinese_name";

    public  static final String COL_STATUS="status";


}

8、分页查询

9、 QueryWrapper条件构造器

 QueryWrapper<Brand> queryWrapper = new QueryWrapper<>();
        queryWrapper.select().eq().gt()

queryWrapper​​​​​​​相当于where

select()过滤列
eq()=
ne()!=
allEq()检查所有参数是否相等
gt()>
ge()>=
lt<
le<=
between()范围
notBetween()非范围
like模糊查询
notLike不进行模糊匹配查询的条件
likeLeft%k
likeRightk%
in多条件

(1)用法

        1)实体类写固定值

2)写构造器

package com.lht.project.data.mybatis.mapper;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.lht.project.data.mybatis.entity.Brand;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
@Slf4j
public class BrandMapperTest {

    @Resource
    private BrandMapper brandMapper;
    @Test
    void selectOne() {
        //条件构造器
        QueryWrapper<Object> qw = new QueryWrapper<>();
        qw.eq(Brand.COL_CHINESE_NAME,"张三").or().eq(Brand.COL_STATUS,"1");

    }
}

12、选中之后control+shirt+U强转为大写

13、like索引必失效

14、创建全文索引(索引就不会失效了)

CREATE FULLTEXT INDEX idx_product_name 0N pms_product (product_name);

15、数据库表,主表增删改,用InnoDB(有事务,查询慢所以不用),从表查询,用MyISAM(不支持事务,查询效率高)

16、排序,分组,过滤列

17、条件函数一般与groupBy配合使用

18、测试list里面存放map

 @Test
    void selectMaps() {
        QueryWrapper<Brand> qw = new QueryWrapper<>();

        qw.select("COUNT(*) product_count","AVG(product_price) product_avg")
                .groupBy("producer_id");
        List<Map<String, Object>> maps = brandMapper.selectMaps(qw);
        log.info("测试分组函数");

    }

19、封装分页

(1)添加配置类

package com.lht.project.data.mybatis.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
//注册所有的mapper接口
@MapperScan("com.lht.**.mapper")
public class MybatisPlusConfig {

    /**
     * 乐观锁
     * @param paginationInnerInterceptor
     * @return
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(PaginationInnerInterceptor paginationInnerInterceptor){
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
        return mybatisPlusInterceptor;
    }


    /**
     * 分页插件注册
     * @return
     */
    @Bean
    public PaginationInnerInterceptor paginationInnerInterceptor(){
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        paginationInnerInterceptor.setOverflow(true);
        paginationInnerInterceptor.setMaxLimit(500L);
        return paginationInnerInterceptor;
    }



}

(2)调用执行

  void selectPage(){
        Page<Brand> brandPage = brandMapper.selectPage(new Page<>(1, 10), null);
        log.info("总页数===>{}: 测试占位符{}",brandPage.getPages(),"1111");
        log.info("核心数据{}",brandPage.getRecords());
        log.info("总条数{}",brandPage.getTotal());

    }

20、" "那里如果反方向的话就会判断多次

21、typeId的类型

22、配置全局雪花id+逻辑删除

(1)全局(不推荐)

(2)局部

23、配置逻辑删除(都要加注解)

(1)全局

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为0)

(2)局部 (就是写value)

(3)作用:自动加状态码(都要查的时候不适用)

24、乐观锁与悲观锁

        1.悲观锁是当线程拿到资源时,就对资源上锁,并在提交后,才释放锁资源,其他线程才能使用资源。
        2.乐观锁是当线程拿到资源时,上乐观锁,在提交之前,其他的锁也可以操作这个资源,当有冲突的时候,并发机制会保留前一个提交,打回后一个提交,让后一个线程重新获取资源后,再操作,然后提交。和git上传代码一样,两个线程都不是直接获取资源本身,而是先获取资源的两个copy版本,然后在这两个copy版本上修改。
3.悲观锁和乐观锁在并发量低的时候,性能差不多,但是在并发量高的时候,乐观锁的性能远远优于悲观锁
全文们常用的synchronized是悲观锁,lock是乐观锁

25、配置乐观锁

(1)配置类

package com.lht.project.data.mybatis.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
//注册所有的mapper接口
@MapperScan("com.lht.**.mapper")
public class MybatisPlusConfig {

    /**
     * 乐观锁
     * @param paginationInnerInterceptor
     * @return
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(PaginationInnerInterceptor paginationInnerInterceptor){
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
        return mybatisPlusInterceptor;
    }


    /**
     * 分页插件注册
     * @return
     */
    @Bean
    public PaginationInnerInterceptor paginationInnerInterceptor(){
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        paginationInnerInterceptor.setOverflow(true);
        paginationInnerInterceptor.setMaxLimit(500L);
        return paginationInnerInterceptor;
    }


}

(2)在实体类的字段上加上@Version注解(只能是时间和数字)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1375832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git提交记录全部删除

目录 问题描述 解决方案 结果 问题描述 新复制的项目具有特比多的提交记录我想给他清除&#xff0c;因为不清楚过多历史也就导致包特别大下载和提交等方面都不是很快 解决方案 查看代码clone网址&#xff1b; 打开远程仓库&#xff0c;选择要去除历史记代码分支&#xff08…

C2855 命令行选项“/Zc:referenceBinding“与预编译头不一致和C2855 命令行选项“/Zc:__cplusplus“与预编译头不一致

在VS2019和Qt5.12.12环境下&#xff0c;笔记本上编译这个工程没有问题&#xff0c;把工程拷贝到台式机上&#xff0c;一样的配置&#xff0c;但是报如下错误&#xff1a; 打开项目的命令行配置如下&#xff1a; 解决办法&#xff1a;在编译选项"/Zc:referenceBinding"…

大模型LLM Agent在 Text2SQL 应用上的实践

1.前言 在上篇文章中「如何通过Prompt优化Text2SQL的效果」介绍了基于Prompt Engineering来优化Text2SQL效果的实践&#xff0c;除此之外我们还可以使用Agent来优化大模型应用的效果。 本文将从以下4个方面探讨通过AI Agent来优化LLM的Text2SQL转换效果。 1 Agent概述2 Lang…

内网穿透的应用-使用Docker部署开源建站工具—Halo,并实现个人博客公网访问

文章目录 1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可参考已安装Docker步骤&#xff1a;1.2 在Docker中部署Halo 2. Linux安装Cpolar2.1 打开服务器防火墙2.2 安装cpolar内网穿透 3. 配置Halo个人博客公网地址4. 固定Halo公网地址 本篇文章介绍如何在CentOS下使用D…

2023年北邮渣硕的暑期秋招总结

背景 实验室一般是在研究生二年级的时候会放实习&#xff0c;在以后的日子就是自己完成毕业工作要求&#xff0c;基本上不再涉及实验室的活了&#xff0c;目前是一月份也是开始准备暑期实习的好时间。实验室每年这个时候都会有学长学姐组织暑期实习经验分享&#xff0c;本着不…

Nginx配置反向代理实例二

Mac 安装Nginx教程 Nginx配置反向代理实例一 提醒一下&#xff1a;下面实例讲解是在Mac系统演示的&#xff1b; 反向代理实例二实现的效果 使用nginx 反向代理&#xff0c;根据访问的地址跳转到不同端口的服务中 nginx 监听端口为81&#xff1b; 访问地址1&#xff1a;http:/…

ptaR7-6/zzuli2106 有去有回

题目 输入n个整数&#xff0c;第一趟按从左到右间隔k个数取数据&#xff0c;然后第二趟再从右到左间隔k-1个数取余下的数&#xff0c;如果数据没有取完&#xff0c;下一趟再间隔k-2个从左到右取数据&#xff0c;如此反复&#xff0c;直到所有的数据取完为止。注意&#xff1a;…

API设计:从基础到优秀实践

在这次深入探讨中&#xff0c;我们将深入了解API设计&#xff0c;从基础知识开始&#xff0c;逐步进阶到定义出色API的最佳实践。 作为开发者&#xff0c;你可能对许多这些概念很熟悉&#xff0c;但我将提供详细的解释&#xff0c;以加深你的理解。 API设计&#xff1a;电子商…

2024年 最新 iPhone手机 历代机型、屏幕尺寸、纵横比、分辨率 整理

&#x1f3ac; 博客主页&#xff1a;https://xiaoy.blog.csdn.net &#x1f3a5; 本文由 呆呆敲代码的小Y 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;Unity系统学习专栏 &#x1f332; 游戏制作专栏推荐&#xff1a;游戏制作 &…

css3边框与圆角

css3边框与圆角 前言边框的三要素边框的三要素小属性 四个方向的边框四个方向边框的三要素小属性 去掉边框利用边框制作三角形圆角 border-radius单独设置四个圆角小属性百分比为单位 盒子阴影阴影延展内阴影多阴影 结语 前言 在网页设计中&#xff0c;边框与圆角不仅仅是简单…

强化学习求解TSP(七):Qlearning求解旅行商问题TSP(提供Python代码)

一、Qlearning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于奖励的决策问题。它是一种无模型的学习方法&#xff0c;通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策&#xff0c;该函数表示在给定状态下采取某个动作所获…

对git中tag, branch的重新理解

1. 问题背景 项目中之前一个tag&#xff08;v1.0&#xff09;打错了&#xff0c;想删除它&#xff0c;但我们从此tag v1.0中迁出新建分支Branch_v1.0,在此分支下修复了bug&#xff0c;想重新打一个tag v1.0&#xff0c;原来的tag v1.0可以删除掉吗&#xff1f; 错误的理解&am…

SQL-分组查询

目录 DQL-分组查询 分组查询注意事项&#xff1a; DQL- 排序查询 &#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &…

RT-Thread入门笔记4-跑马灯线程实例

RT-Thread操作系统是基于线程调度的多任务系统。 线程状态切换 调度过程是一种完全抢占式的基于优先级的调度算法。 支持8/32/256优先级&#xff0c;其中0表示最高&#xff0c;7/31/255表示最低。最低优先级7/31/255优先级用于空闲线程。 支持以相同优先级运行的线程。 共享时…

【AI视野·今日NLP 自然语言处理论文速览 第七十二期】Mon, 8 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 8 Jan 2024 Totally 17 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers DeepSeek LLM: Scaling Open-Source Language Models with Longtermism Authors DeepSeek AI Xiao Bi, Deli Ch…

jupyter notebook 配置conda 虚拟环境python

conda创建python环境 conda create -n openvoice python3.9 激活环境 source activate openvoice 在虚拟环境中安装ipykernel pip install ipykernel 添加虚拟环境进到 jupyter notebook python -m ipykernel install --user --name openvoice --display-name openvoice …

修改idea或者pycharm或者android studio的快捷键,快速跳转到行尾

ctrl enter这个快捷键是idea默认配置的&#xff0c;就是将光标所在的行切一刀&#xff0c;并且换到下一行。但是在我的开发习惯里面不怎么使用ctrl enter这个快捷键&#xff0c; 反而开发java或者flutter软件需要快速跳转到行尾添加分号 ; &#xff0c;但是使用end键脱离了我…

C++进阶(三)多态

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、多态的概念1、概念 二、多态的定义及实现1、多态的构成条件2、虚函数3、虚函数的重写4、C…

groovy XmlParser 递归遍历 xml 文件,修改并保存

使用 groovy.util.XmlParser 解析 xml 文件&#xff0c;对文件进行修改&#xff08;新增标签&#xff09;&#xff0c;然后保存。 是不是 XmlParser 没有提供方法遍历每个节点&#xff0c;难道要自己写&#xff1f; 什么是递归&#xff1f; 不用说&#xff0c;想必都懂得~ …

ERROR in Plugin “react“ was conflicted .... 天坑留念-turborepo、eslint plugin

前两天项目代码拉下来&#xff0c;装完依赖启动的时候直接报错&#xff1a; [eslint] Plugin "react" was conflicted between ".eslintrc.js eslint-config-custom eslint-config-alloy/react" and "BaseConfig D:\pan\erp\test\business-servic…