SpringBoot知识02

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注解(只能是时间和数字)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

慢 SQL 的优化思路

分析慢 SQL 如何定位慢 SQL 呢&#xff1f; 可以通过 slow log 来查看慢SQL&#xff0c;默认的情况下&#xff0c;MySQL 数据库是不开启慢查询日志&#xff08;slow query log&#xff09;。所以我们需要手动把它打开。 查看下慢查询日志配置&#xff0c;我们可以使用 show …

网络市场中的品牌推广:面向新一代数字原住民的挑战与机遇

随着科技的迅速发展和互联网的普及&#xff0c;我们正处在一个网络成熟期&#xff0c;一个以数字化和网络化为特征的新时代。在这个时代&#xff0c;新一代的数字原住民经营者正在崛起&#xff0c;他们依赖网络寻找商机&#xff0c;建立自己的事业。对于企业来说&#xff0c;如…

易安联参与制定的《面向云计算的零信任体系》行业标准即将实施

中华人民共和国工业和信息化部公告2023年第38号文件正式发布行业标准&#xff1a;YD/T 4598.2-2023《面向云计算的零信任体系 第2部分&#xff1a;关键能力要求》及YD/T 4598.3-2023《面向云计算的零信任体系 第3部分&#xff1a;安全访问服务边缘能力要求》&#xff0c;并于20…

YOLOv8-Seg改进:UNetv2多层次特征融合模块结合DualConv、GSConv

🚀🚀🚀本文改进:多层次特征融合(SDI)结合DualConv、GSConv模块等实现二次创新 🚀🚀🚀SDI 亲测在多个数据集能够实现涨点,同样适用于小目标检测 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定…

怎么做微信秒杀链接_开启用户的购物新体验

微信秒杀&#xff1a;开启你的购物新体验 在繁忙的生活节奏中&#xff0c;你是否厌倦了长时间排队等待购物&#xff0c;或者在电商平台上漫长而复杂的购物流程&#xff1f;今天&#xff0c;我要向你介绍一种全新的购物方式——微信秒杀。这不仅是一种全新的购物体验&#xff0…

YOLOv8改进 | 二次创新篇 | 在Dyhead检测头的基础上替换DCNv3 (全网独家首发)

一、本文介绍 本文给大家带来的改进机制是在DynamicHead上替换DCNv3模块,其中DynamicHead的核心为DCNv2,但是今年新更新了DCNv3其作为v2的升级版效果肯定是更好的,所以我将其中的核心机制替换为DCNv3给Dyhead相当于做了一个升级,效果也比之前的普通版本要好,这个机制我认…

如何使用CFImagehost结合内网穿透搭建私人图床并无公网ip远程访问

[TOC] 推荐一个人工智能学习网站点击跳转 1.前言 图片服务器也称作图床&#xff0c;可以说是互联网存储中最重要的应用之一&#xff0c;不仅网站需要图床提供的外链调取图片&#xff0c;个人或企业也用图床存储各种图片&#xff0c;方便随时访问查看。不过由于图床很不挣钱&a…

网络层详解

目录 前言 一、IP协议 1、IP协议报头 2、协议字段理解 &#xff08;1&#xff09;4位版本 &#xff08;2&#xff09;4位首部长度 &#xff08;3&#xff09;8位服务类型 &#xff08;4&#xff09;16位总长度 &#xff08;5&#xff09;标识、标志与片偏移 &#xf…

C#系列-手把手教你快速了解.NET Framework

.NET Framework .NET Framework是什么.NET Framework构成部分公共语言运行库&#xff08;CLR&#xff09;框架类库&#xff08;FCL&#xff09;核心语言&#xff08;WinForms、ASP.NET 和 ADO.NET&#xff09;其他模块&#xff08;WCF、WPF、WF、Card Space、LINQ、Entity Fram…

四、C++内存管理

1 C/C内存分布 在学习C的内存管理方式之前&#xff0c;我们先来看一道有关C/C内存分布的题目&#xff1a; 阅读下面的代码&#xff0c;回答相关问题&#xff1a; #include <iostream> using namespace std; int globalVar 1; static int staticGlobalVar 1; int main…

EOCR电机保护器485通讯协议概念

Modbus是由Modicon&#xff08;现为施耐德电气公司的一个品牌&#xff09;在1979年发明的&#xff0c;是全球第一个真正用于工业现场的总线协议。为更好地普及和推动Modbus在基于以太网上的分布式应用&#xff0c;目前施耐德公司已将Modbus协议的所有权移交给IDA&#xff08;In…

性能测试分析案例-定位内核线程CPU利用率太高

环境准备 预先安装 docker、perf、hping3、curl 等工具&#xff0c;如 apt install docker.io linux-tools-common hping3 操作和分析 Linux 在启动过程中&#xff0c;有三个特殊的进程&#xff0c;也就是 PID 号最小的三个进程。 0 号进程为 idle 进程&#xff0c;这也是系…

2024年五款值得买的云服务器推荐,便宜又好用

作为多年站长使市面上大多数的云厂商的云服务器都使用过&#xff0c;很多特价云服务器都是新用户专享的&#xff0c;本文有老用户特价云服务器&#xff0c;阿腾云atengyun.com有多个网站、小程序等&#xff0c;国内头部云厂商阿里云、腾讯云、华为云、UCloud、京东云都有用过&a…

WPF真入门教程27--项目案例--设备数据实时监测

1、上图看效果 今天要做的一个案例是这样的效果&#xff0c;它能实时监测车间设备有关数据&#xff0c;并以表格和图形显示在界面上&#xff0c;这个比上个案例要复杂些&#xff0c;颜值也高些&#xff0c;通过这个来巩固wpf的技能&#xff0c;用到了命令绑定&#xff0c;样式…

探索PyTorch优化和剪枝技术相关的api函数

torch.nn子模块Utilities解析 clip_grad_norm_ torch.nn.utils.clip_grad_norm_ 是 PyTorch 深度学习框架中的一个函数&#xff0c;它主要用于控制神经网络训练过程中的梯度爆炸问题。这个函数通过裁剪梯度的范数来防止梯度过大&#xff0c;有助于稳定训练过程。 用途 防止…

用三层交换机连接不同的网络—SVI(VLAN,trunk)

1.为什么要使用SVI技术&#xff1a; 如图&#xff0c;举个栗子&#xff1a;我们把网络A和网络B具体化一些&#xff0c;假设网络A为销售部&#xff0c;网络B为研发部。随着销售部的人员不断的增加&#xff0c;销售部网络的交换机端口已经被占完&#xff0c;那么销售部新来的员工…

【qt】sdk写pro写法,cv,onnx,cudnn

我的sdk在OpenCV003项目里&#xff1a; pro中添加 CONFIG(release, debug|release) {LIBS -L$$PWD/sdk/onnxruntime-x64-gpu/lib/ -lonnxruntimeLIBS -L$$PWD/sdk/onnxruntime-x64-gpu/lib/ -lonnxruntime_providers_cudaLIBS -L$$PWD/sdk/onnxruntime-x64-gpu/lib/ -lon…

家政服务管理平台

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1选题的背景 现…

怎么做微信秒活动_掀起购物狂潮,引爆品牌影响力

微信秒杀活动&#xff1a;掀起购物狂潮&#xff0c;引爆品牌影响力 在数字化时代&#xff0c;微信已经成为人们日常生活中不可或缺的一部分。作为中国最大的社交媒体平台&#xff0c;微信不仅为人们提供了便捷的通讯方式&#xff0c;还为商家提供了一个广阔的营销舞台。其中&a…

为什么选择CRM系统时,在线演示很重要?

想要知道一款CRM管理系统是否满足企业的需求&#xff0c;操作是否简单&#xff0c;运行是否流畅&#xff0c;最直观的方式就是远程演示。否则&#xff0c;光凭厂商的销售人员介绍一下产品&#xff0c;企业就盲目下单&#xff0c;最后发现功能不匹配&#xff0c;还要赔钱赔时间重…