springboot项目问题

目录标题

  • 问题
    • 后端
      • 1.[mybatis报错Parameter 'start' not found. Available parameters are [1, 0, param1, param2]](https://www.cnblogs.com/josephcnblog/articles/7077244.html)
    • 知识
    • 后端
      • 1. [@Select 数据表的字段与实体类的属性值](https://www.cnblogs.com/yanguobin/p/11919042.html)
      • 2.[@Select标签内的大于小于判断符号](https://blog.csdn.net/qq_42811766/article/details/127283062)
      • 3.[MetaObjectHandler](https://blog.csdn.net/weixin_72979483/article/details/130952080)
      • 4. [MybatisPlus中@TableLogic逻辑删除](http://www.mobange.com/nav/java/90162.html)
      • 5.[lombok里的Builder注解](http://fendou.net.cn/index.php/a/369)
      • 6. [mybatis-plus IEnum转化](https://blog.csdn.net/cfv3246/article/details/115523168)
      • 7.[曲线拟合](https://blog.csdn.net/wufeiwua/article/details/109004452)
      • 8. 根据国家城市名称获取经纬度
      • 9. 获取接口信息的接口
      • 10.springboot引入Apache spark(达梦数据库)gradle
        • 常用接口实例

问题

后端

1.mybatis报错Parameter ‘start’ not found. Available parameters are [1, 0, param1, param2]

知识

后端

1. @Select 数据表的字段与实体类的属性值

2.@Select标签内的大于小于判断符号

3.MetaObjectHandler

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        if (metaObject.hasGetter("createTime")) {
            this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
        }
        if (metaObject.hasGetter("updateTime")) {
            this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
        }
        if (metaObject.hasGetter("lastModifyTime")) {
            this.strictInsertFill(metaObject, "lastModifyTime", Date.class, new Date());
        }
    }
 
    @Override
    public void updateFill(MetaObject metaObject) {
        if (metaObject.hasGetter("updateTime")) {
            this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
        }
        if (metaObject.hasGetter("lastModifyTime")) {
            this.strictInsertFill(metaObject, "lastModifyTime", Date.class, new Date());
        }
    }
}

4. MybatisPlus中@TableLogic逻辑删除

参考

  @TableLogic(value = "1", delval = "0")

5.lombok里的Builder注解

6. mybatis-plus IEnum转化

定义枚举时需要使用mybaties plus的枚举转换:
枚举类需要继承IEnum
application-dev.properties文件配置mybatis-plus.configuration.default-enum-type-handler=com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

7.曲线拟合

8. 根据国家城市名称获取经纬度

参考
在Java中使用离线API获取国家城市的经纬度,一个常用的选择是使用Geonames数据库。Geonames是一个开源的地理数据库,包含了世界范围内的地理位置信息,包括国家、城市、地点等。
以下是在Java中使用Geonames离线API获取国家城市的经纬度的简单示例:
1.下载数据库文件:访问Geonames的官方网站(https://www.geonames.org/export/)并下载适用于您的需求的数据库文件。您可以下载包含国家和城市信息的数据库文件,例如"cities15000.txt"。
2.导入依赖:将下载的数据库文件放在项目中,并导入相关的Java类库。
在代码中使用库:使用Java读取和查询Geonames数据库文件,根据国家或城市名称获取对应的经纬度信息。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class OfflineGeolocation {
    public static void main(String[] args) {
        try {
            // 加载数据库文件
            String databaseFile = "/path/to/cities15000.txt";
            Map<String, String> geonamesData = loadGeonamesData(databaseFile);

            // 查询国家或城市的经纬度
            String country = "China";
            String city = "Beijing";
            double latitude = getLatitude(geonamesData, country, city);
            double longitude = getLongitude(geonamesData, country, city);

            System.out.println("经度: " + longitude);
            System.out.println("纬度: " + latitude);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static Map<String, String> loadGeonamesData(String databaseFile) throws IOException {
        Map<String, String> geonamesData = new HashMap<>();
        BufferedReader reader = new BufferedReader(new FileReader(databaseFile));
        String line;
        while ((line = reader.readLine()) != null) {
            String[] parts = line.split("\t");
            if (parts.length > 1) {
                String geoname = parts[1];
                double latitude = Double.parseDouble(parts[4]);
                double longitude = Double.parseDouble(parts[5]);
                geonamesData.put(geoname, latitude + "," + longitude);
            }
        }
        reader.close();
        return geonamesData;
    }

    private static double getLatitude(Map<String, String> geonamesData, String country, String city) {
        String key = city + ", " + country;
        String value = geonamesData.get(key);
        if (value != null) {
            String[] latLng = value.split(",");
            return Double.parseDouble(latLng[0]);
        }
        return 0.0;
    }

    private static double getLongitude(Map<String, String> geonamesData, String country, String city) {
        String key = city + ", " + country;
        String value = geonamesData.get(key);
        if (value != null) {
            String[] latLng = value.split(",");
            return Double.parseDouble(latLng[1]);
        }
        return 0.0;
    }
}

9. 获取接口信息的接口

要实现一个可以获取所有接口信息的接口,你可以使用 Spring Boot 的 Actuator 模块和 Reflections 库来实现。
首先,确保已将 Spring Boot Actuator 添加到 Maven 或 Gradle 依赖中:
Maven 依赖配置:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Gradle 依赖配置:

implementation group: 'org.springframework.boot', name: 'spring-boot-starter-actuator'

然后,在你的 Spring Boot 应用中创建一个新的 REST Controller 类,用于暴露获取接口信息的接口:

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.reflections.Reflections;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.boot.actuate.endpoint.web.annotation.RestControllerEndpoint;
import org.springframework.core.env.Environment;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

@RestController
@RequestMapping("/api-info")
public class ApiInfoController {

    @Autowired
    private Environment environment;

    @GetMapping
    @ApiOperation("获取所有接口信息")
    public ResponseEntity<List<ApiInfo>> getAllApiInfo() {
        String basePackage = environment.getProperty("spring.application.base-package");

        List<ApiInfo> apiInfos = new ArrayList<>();

        Reflections reflections = new Reflections(basePackage);
        Set<Class<?>> classes = reflections.getTypesAnnotatedWith(Api.class);
        for (Class<?> clazz : classes) {
            Api apiAnnotation = clazz.getAnnotation(Api.class);
            if (apiAnnotation != null) {
                String apiName = apiAnnotation.value();
                String apiDescription = apiAnnotation.description();

                Method[] methods = clazz.getMethods();
                for (Method method : methods) {
                    ApiOperation apiOperation = method.getAnnotation(ApiOperation.class);
                    if (apiOperation != null) {
                        String operationPath = getOperationPath(clazz, method);
                        String operationSummary = apiOperation.value();
                        apiInfos.add(new ApiInfo(apiName, apiDescription, operationPath, operationSummary));
                    }
                }
            }
        }

        return ResponseEntity.ok(apiInfos);
    }

    private String getOperationPath(Class<?> clazz, Method method) {
        RequestMapping classRequestMapping = clazz.getAnnotation(RequestMapping.class);
        RequestMapping methodRequestMapping = method.getAnnotation(RequestMapping.class);

        StringBuilder pathBuilder = new StringBuilder();

        if (classRequestMapping != null && classRequestMapping.value().length > 0) {
            pathBuilder.append(classRequestMapping.value()[0]);
        }

        if (methodRequestMapping != null && methodRequestMapping.value().length > 0) {
            pathBuilder.append(methodRequestMapping.value()[0]);
        }

        return pathBuilder.toString();
    }

    @Endpoint(id = "api-info")
    public static class ApiInfoEndpoint {

        private final ApiInfoController apiInfoController;

        public ApiInfoEndpoint(ApiInfoController apiInfoController) {
            this.apiInfoController = apiInfoController;
        }

        @ReadOperation
        public List<ApiInfo> getAllApiInfo() {
            return apiInfoController.getAllApiInfo().getBody();
        }
    }

    @RestControllerEndpoint(id = "api-info")
    public static class ApiInfoRestControllerEndpoint {

        private final ApiInfoController apiInfoController;

        public ApiInfoRestControllerEndpoint(ApiInfoController apiInfoController) {
            this.apiInfoController = apiInfoController;
        }

        @GetMapping
        public ResponseEntity<List<ApiInfo>> getAllApiInfo() {
            return apiInfoController.getAllApiInfo();
        }
    }

    public static class ApiInfo {

        private String apiName;
        private String apiDescription;
        private String operationPath;
        private String operationSummary;

        public ApiInfo(String apiName, String apiDescription, String operationPath, String operationSummary) {
            this.apiName = apiName;
            this.apiDescription = apiDescription;
            this.operationPath = operationPath;
            this.operationSummary = operationSummary;
        }

        // Getters and setters
    }
}

上述代码创建了一个获取所有接口信息的 REST Controller,通过扫描指定的基础包中带有 @Api 注解的类,获取其下带有 @ApiOperation 注解的方法信息,并返回给调用方。

在这个 Controller 中,我们还使用了 Actuator 的 @Endpoint 和 @RestControllerEndpoint 注解,分别创建了一个自定义的 Endpoint 和 RestControllerEndpoint,以便将接口信息暴露在 Actuator 端点中。这样,你可以通过访问 /actuator/api-info 或 /api-info 端点来获取所有接口信息列表。

确保在应用的配置文件(例如 application.properties)中设置了 spring.application.base-package 属性,该属性指定需要扫描的基础包路径。

运行应用后,你可以访问 http://localhost:8080/api-info 来获取所有接口信息的列表。

10.springboot引入Apache spark(达梦数据库)gradle

引入依赖

    implementation 'org.apache.spark:spark-sql_2.12:3.1.2'
    implementation ('org.apache.spark:spark-core_2.12:3.1.2')
        {
            exclude group: 'org.codehaus.janino', module: 'janino'
        }
    implementation ('org.codehaus.janino:janino:3.0.16')
        //implementation 'org.apache.spark:spark-jdbc_2.12:3.1.2'
  //  implementation 'org.codehaus.janino:commons-compiler:3.1.6'

确保 Spark SQL 和 Janino 版本的兼容性

创建一个Spring Boot的配置类或启动类,用于创建SparkSession和连接到数据库:

package com.iscas.biz.config;

import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
public class SparkConfig {

    @Bean
    public SparkSession sparkSession() {
        return SparkSession.builder()
                .appName("DataQualityAnalysis")
                .master("local[*]") // 指定Spark的运行模式
                .getOrCreate();
    }

        @Bean
        public DataSource mysqlDataSource() {
            BasicDataSource dataSource = new BasicDataSource();
            dataSource.setDriverClassName("dm.jdbc.driver.DmDriver");
            dataSource.setUrl("jdbc:dm://192.168.101.121:5236/POLITICS_WORK?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8");
            dataSource.addConnectionProperty("user", "SYSDBA");
            dataSource.addConnectionProperty("password", "SYSDBA001");
            return dataSource;
        }

    @Bean
    public Properties connectionProperties() {
        Properties connectionProperties = new Properties();
        connectionProperties.put("user", "SYSDBA");
        connectionProperties.put("password", "SYSDBA");
        connectionProperties.put( "driver","dm.jdbc.driver.DmDriver");
        return connectionProperties;
    }

    @Bean
    public Dataset<Row> loadDataFromMySQL(SparkSession sparkSession,Properties connectionProperties) {
/*      return sparkSession.read().format("jdbc").option("driver","dm.jdbc.driver.DmDriver")
                .option("url", "jdbc:dm://192.168.101.121:5236/POLITICS_WORK?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8")
                .option("dbtable", "POLITICS_WORK.COGNIT_NEWS")
                .option("user", "SYSDBA")
                .option("password", "SYSDBA")
                .load();*/
        return sparkSession.read()
                .jdbc("jdbc:dm://192.168.101.121:5236/POLITICS_WORK?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8", "POLITICS_WORK.COGNIT_NEWS",connectionProperties);//达梦数据库要指定模式名.表名 其他数据库有的只需指定表名
    }
}

接下来,创建一个用于数据质量分析的服务类:

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class DataQualityAnalysisService {

    @Autowired
    private Dataset<Row> data;

    public void performDataQualityAnalysis() {
        // 在这里进行数据质量分析的操作,可以使用Spark SQL或其他Spark API进行查询、聚合、过滤等操作
        long totalRows = data.count();
        long missingValues = data.filter("col1 IS NULL OR col2 IS NULL").count();
        double missingPercentage = (missingValues * 100.0) / totalRows;

        System.out.println("Total rows: " + totalRows);
        System.out.println("Missing values: " + missingValues);
        System.out.println("Missing percentage: " + missingPercentage);
    }
}

常用接口实例

SparkSession类全部函数说明并代码举例
在这里插入图片描述
Dataset类全部函数说明并代码举例
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
apache spark RDD类的全部函数及代码举例
在这里插入图片描述
在这里插入图片描述
总结:
Apache Spark 在 Java 中的接口文档的基本结构:
SparkSession:SparkSession 是 Spark 2.0 引入的主要入口点,用于创建 Spark 应用程序。它可以通过 SparkSession.Builder 类来构建,提供了各种配置选项和方法用于创建 DataFrame、执行 SQL 查询等。

Dataset 和 DataFrame(已过期):Dataset 和 DataFrame 是 Spark 中用于处理结构化数据的核心 API。Dataset 是类型安全的分布式数据集合,DataFrame 是 Dataset 的一种特殊类型,可以看作是一张表格。你可以在 Dataset 和 DataFrame 上进行各种数据操作和转换,如过滤、映射、聚合等。

RDD(Resilient Distributed Datasets):RDD 是 Spark 中的一个基本抽象概念,代表一个可分区、可并行计算的数据集合。虽然 Spark 推荐使用 Dataset 和 DataFrame,但如果需要更底层的控制,仍然可以使用 RDD。

Transformations(转换操作):Spark 提供了许多用于对数据进行转换的操作,如 map、filter、join、groupBy 等。这些操作可以应用到 Dataset、DataFrame 或 RDD 上,通常会生成一个新的 Dataset、DataFrame 或 RDD。

Actions(动作操作):Actions 是触发实际计算并返回结果的操作。这些操作会将计算图转换为执行计划,并将最终结果返回给驱动程序或写入外部系统,如 collect、count、save 等。

容错性和数据分片:Spark 提供了容错性和数据分片机制,可以确保在节点故障时能够自动恢复和保证数据一致性。

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

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

相关文章

【SpringBoot学习笔记】04. Thymeleaf模板引擎

模板引擎 templates下的只能通过Controller来跳转&#xff0c;templates前后端分离&#xff0c;需要模板引擎thymeleaf支持 模板引擎的作用就是我们来写一个页面模板&#xff0c;比如有些值呢&#xff0c;是动态的&#xff0c;我们写一些表达式。而这些值&#xff0c;从哪来呢…

【JavaWeb】MySQL基础操作

1 通用语法规则 SQL语句可以单行或者多行书写&#xff0c;以分号结尾SQL语句不区分大小写&#xff0c;关键字建议使用大写单行注释 --注释内容&#xff08;通用&#xff09; # 注释内容&#xff08;MySQL独有&#xff09;多行注释 /* 注释内容 */ 2 语句 数据库 -- 查…

【uniapp】uniapp使用微信开发者工具制作骨架屏:

文章目录 一、效果&#xff1a;二、过程&#xff1a; 一、效果&#xff1a; 二、过程&#xff1a; 【1】微信开发者工具打开项目&#xff0c;生成骨架屏&#xff0c;将wxml改造为vue页面组件&#xff0c;并放入样式 【2】页面使用骨架屏组件 【3】改造骨架屏&#xff08;去除…

微信小程序开发价格

小程序开发费用 小程序的开发费用是很多企业和个人在规划项目时需要重点考虑的一个方面。本文将从微信认证费、域名、服务器、程序开发费用、微信支付费率以及维护费用等多个角度为大家分析小程序开发费用的组成。 1. 微信认证费&#xff1a;作为小程序的一种信任凭证&#xf…

【Spring】实现FactoryBean接口

FactoryBean FactoryBean是一个接口&#xff0c;需要创建一个类来实现该接口&#xff0c;该接口中有三个方法&#xff0c;通过重写其中的两个方法&#xff0c;获得一个对象&#xff0c;三个方法分别是&#xff1a; 1.getObject():通过一个对象交给IOC容器管理2.getObjectType(…

ArcGIS在洪水灾害普查、风险评估及淹没制图中应用教程

详情点击链接&#xff1a;ArcGIS在洪水灾害普查、风险评估及淹没制图中应用教程 一&#xff1a;洪水普查技术规范 1.1 全国水旱灾害风险普查实施方案 1.2 洪水风险区划及防治区划编制技术要求 1.3 山丘区中小河流洪水淹没图编制技术要求 二&#xff1a;ArcGIS及数据管理 …

REDIS主从配置

目录 前言 一、概述 二、作用 三、缺点 四、redis主从复制的流程 五、搭建redis主从复制 总结 前言 Redis的主从配置是指在Redis集群中&#xff0c;将一个Redis节点配置为主节点&#xff08;master&#xff09;&#xff0c;其他节点配置为从节点&#xff08;slave&#xff09;…

用友移动管理系统 任意文件上传漏洞复现(HW0day)

0x01 产品简介 用友移动系统管理是用友公司推出的一款移动办公解决方案&#xff0c;旨在帮助企业实现移动办公、提高管理效率和员工工作灵活性。它提供了一系列功能和工具&#xff0c;方便用户在移动设备上管理和处理企业的系统和业务。 0x02 漏洞概述 用友移动管理系统 uploa…

【学会动态规划】买卖股票的最佳时机 III(17)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后&#xff1a; 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟我…

【ARM64 常见汇编指令学习 15 -- ARM 标志位的学习】

文章目录 ARM 标志位介绍Zero Condition flag(零标志位)零标志位判断实例 上篇文章&#xff1a;ARM64 常见汇编指令学习 14 – ARM 汇编 .balign,.balignw,.balign 伪指令学习 下篇文章&#xff1a;ARM64 常见汇编指令学习 16 – ARM64 SMC 指令 ARM 标志位介绍 在ARM架构中&am…

JavaWeb-Servlet服务连接器(二)

目录 Request&#xff08;获取请求信息&#xff09; 1.获取请求行内容 2.解决乱码问题 3.获取请求头部分 4.获取请求体 5.其他功能 Request&#xff08;获取请求信息&#xff09; 工作流程&#xff1a; 1.通过请求的url的资源路径&#xff0c;tomcat会生成相应的Servlet实…

Mysql:Access denied for user ‘root‘@‘localhost‘ (using password:YES)解决方案

最近在配置Maven以及Mybatis时&#xff0c;连接localhost数据库时出现无法连接&#xff0c;用cmd测试时报错&#xff1a;Access denied for user ‘ODBC’‘localhost’ (using password: NO)&#xff0c;这个意思就是不允许远程访问&#xff0c;一开始笔者进入mysql试了一下是…

由于找不到d3dx9_42.dll,无法继续执行代码。重新安装程序可能会解决此问题

d3dx9_42.dll是一个动态链接库文件&#xff0c;它是Microsoft DirectX 9的一部分。这个文件包含了DirectX 9的一些函数和资源&#xff0c;用于支持计算机上运行基于DirectX 9的应用程序和游戏。它通常用于提供图形、音频和输入设备的支持&#xff0c;以及其他与图形和游戏相关的…

Playable 动画系统

Playable 基本用法 Playable意思是可播放的&#xff0c;可运行的。Playable整体是树形结构&#xff0c;PlayableGraph相当于一个容器&#xff0c;所有元素都被包含在里面&#xff0c;图中的每个节点都是Playable&#xff0c;叶子节点的Playable包裹原始数据&#xff0c;相当于输…

Vue+SpringBoot后台管理系统:Vue3+TypeScript项目搭建(一)

写在开始:一个搬砖程序员的随缘记录文章目录 一、Node安装二、Vue CLI安装三、相关的版本四、创建Vue3TypeScript项目五、Vue项目初始化六、项目启动 一、Node安装 查看Note版本 node -v查看npm版本 npm -v然后将npm升级至最新版本 npm -g install npm将npm下载源换至http:…

RS-232标准

目录 1、概述2、RS-232接口的特点3、RS-232接口协议【仿真】 1、概述 RS-232接口是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换…

C语言 二级指针和多级指针

什么是二级指针&#xff1f; 假设&#xff1a; int a 10;int * p &a;如上&#xff0c;p是指针变量&#xff0c;寄存的是a的地址&#xff0c;指向的是元素a 那么&#xff0c;指针变量p有地址吗&#xff1f;指针变量p的指针指向的是&#xff1f; int * * pp &p; …

【Spring Boot 源码学习】自动装配流程源码解析(上)

自动装配流程源码解析&#xff08;上&#xff09; 引言往期内容主要内容1. 自动配置开关2. 加载自动配置组件3. 自动配置组件去重 总结 引言 上篇博文&#xff0c;笔者带大家从整体上了解了AutoConfigurationImportSelector 自动装配逻辑的核心功能及流程&#xff0c;由于篇幅…

Visual Studio 2022安装教程(英文版)

文章目录 1.下载安装 1.下载 官网地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/vs/ 选择第一个社区版本&#xff1a;Community 2022 安装 1.将下载好的文件保存到桌面&#xff0c;双击点开 2.等待visual studio installer配置好 3.点击安装后会来到配件选…

KeePass CVE-2023-32784:进程内存转储检测

KeePass CVE-2023-32784&#xff1a;进程内存转储检测 KeePass 是一种流行的开源密码管理器&#xff0c;可以在 Windows、Mac 或 Linux 上运行。该漏洞允许从正在运行的进程的内存中以明文形式提取主密钥。主密钥将允许攻击者访问所有存储的凭据 强烈建议更新到KeePass 2.54以…