Skip to content

2024年2月随笔

queryWrapper.select 用法

queryWrapper.select用于选择查询的列,它可以用于QueryBuilder或LambdaQueryWrapper中。

在QueryBuilder中,我们可以这样使用查询Wrapper的select方法:

java
QueryWrapper<User> queryWrapper = new QueryWrapper<>(); 
queryWrapper.select("id", "username", "password").eq("status", 1);

在LambdaQueryWrapper中,我们可以这样使用:

java
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.select(User::getId, User::getUsername, User::getPassword).eq(User::getStatus, 1);

这个查询Wrapper的select方法将返回一个新的查询Wrapper,其中只包含指定的列,可以使用链式方法继续操作。

Centos挂载未使用的硬盘并扩容

详细扩容步骤可参考以下地址:

原文链接:https://www.cnblogs.com/zy09/p/14273832.html

转载声明:本文转载是为了个人学习使用,无商业用途

sync使用ssh验证传输数据

bash
rsync -avz --rsh=ssh source_directory/ user@remote_host:/destination_directory/

mybatis-plus如何使用注解自定义sql语句

java
@Select("SELECT * FROM OM_DEVICE_MONITOR WHERE DEVICE_CODE = #{deviceCode}")
DeviceMoni getOneDeviceMoni(@Param("deviceCode") int deviceCode);

mybatis-plus查询排除指定字段

在Mybatis-Plus中,你可以使用select方法或者@TableField注解来排除查询中的某些字段。以下是两种方法的示例:

  1. 使用select方法:
java
QueryWrapper<UserDO> wrapper = new QueryWrapper<>();
// 添加你的查询条件
wrapper.select(UserDO.class, user -> !user.getColumn().equals("你想排除的字段名"));
return userMapper.selectPage(Page.div(pageNo, limit, UserDO.class), wrapper);

这段代码会生成一个SQL语句,其中不包含你想排除的字段。

  1. 使用@TableField注解³⁴:
java
@TableField(exist = false)
private String fieldName;

在你的实体类中,对你想排除的字段使用@TableField(exist = false)注解,这表示当前属性不是数据库的字段,但在项目中必须使用。这样,在使用bean进行新增等操作时,Mybatis-Plus会忽略这个字段。

如何查看mysql和达梦数据库是否锁表,以及如何查看mysql和达梦数据库表是否有事务未提交。

查看MySQL是否锁表: 你可以使用以下命令来查看MySQL中哪些表被锁定

sql
SHOW OPEN TABLES WHERE in_use > 0;

查看达梦数据库是否锁表: 在达梦数据库中,你可以使用以下命令来查看锁的状态

sql
SELECT * FROM V$LOCK;

查看MySQL是否有未提交的事务: 你可以使用以下命令来查看MySQL中已经提交的事务

sql
SELECT * FROM information_schema.innodb_trx WHERE trx_state = 'committed';

查看达梦数据库是否有未提交的事务: 在达梦数据库中,你可以使用以下命令来查看等待事件的具体信息

sql
SELECT * FROM V$WAIT_HISTORY;

SpringBoot如何使用URLConnection并指定请求头下载网络图片资源

java
import java.io.BufferedInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.net.HttpURLConnection;  
import java.net.URL;  
  
public class ImageDownloader {  
  
    public static void downloadImage(String imageUrl, String destinationPath) throws IOException {  
        URL url = new URL(imageUrl);  
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();  
        connection.setRequestMethod("GET");  
        // 这里你可以设置请求头,例如:  
        // connection.setRequestProperty("HeaderName", "HeaderValue");  
  
        int responseCode = connection.getResponseCode();  
        if (responseCode == HttpURLConnection.HTTP_OK) { // success  
            InputStream is = new BufferedInputStream(connection.getInputStream());  
            FileOutputStream fos = new FileOutputStream(destinationPath);  
            byte[] buffer = new byte[1024];  
            int bytesRead;  
            while ((bytesRead = is.read(buffer)) != -1) {  
                fos.write(buffer, 0, bytesRead);  
            }  
            fos.close();  
            is.close();  
        } else {  
            throw new IOException("Failed to download image from URL: " + imageUrl);  
        }  
    }  
}

达梦数据库新增表字段时设置默认值

1、创建表时设置默认值

例如,创建一个名为 users 的表,其中包含一个名为 age 的字段,默认值为 18:

sql
CREATE TABLE users (  
    id INT PRIMARY KEY,  
    name VARCHAR(50),  
    age INT DEFAULT 18  
);

2、修改表时添加默认值 例如,为 users 表中的 age 字段添加默认值 18:

sql
ALTER TABLE users MODIFY age INT DEFAULT 18;

或者,你也可以使用 ADD COLUMN 子句来为表添加一个新字段,并设置默认值:

sql
ALTER TABLE users ADD COLUMN birthdate DATE DEFAULT SYSDATE;

ES查询优化策略

  • 使用filter代替terms:

当您只需要过滤文档而不需要为过滤的匹配文档提供评分时,使用filter比terms查询更有效率。 因为filter不需要评分,所以它可以更快速地执行。

  • 批量查询:

考虑将1800个device_id分成多个批次,并为每个批次执行单独的查询。然后,您可以在应用程序中合并这些查询的结果。 这可以减少每个查询中terms的数量,从而提高查询性能。

  • 考虑数据结构:

如果device_id经常用于查询,并且其数量非常大,您可能需要重新考虑您的数据结构。 例如,您可以考虑使用nested或parent/child关系,或者将device_id存储在一个单独的索引中,并使用join字段关联它们。

  • 使用wildcard或regexp查询:

如果device_id有某种模式或规律,您可以尝试使用wildcard或regexp查询来减少查询中的terms数量。 但请注意,这两种查询类型通常比terms查询更慢,因为它们需要扫描更多的倒排索引条目。

  • 索引优化:

确保您的Elasticsearch集群已经进行了适当的配置和优化,例如增加节点、优化分片数量等。 也可以考虑对result.device_id.keyword字段使用更合适的索引类型或设置。

  • 使用should代替must:

如果device_id之间的匹配是可选的(即,只要满足其他条件,就不需要匹配所有device_id),您可以将terms查询从must子句移动到should子句。 这将使查询更加灵活,并可能提高性能。 综上所述,选择哪种优化策略取决于您的具体需求和Elasticsearch集群的配置。您可能需要进行一些实验来确定哪种策略最适合您的场景。

如何使用nohup挂载进程

基本用法:

bash
nohup ./my_script.sh > output.log 2>&1 &

使用 jobs -l 命令来获取这些作业的进程ID:

bash
jobs -l

可能会出现如下信息:

[1]  12345 Running                 top  
[2]+ 12346 Stopped                 vim example.txt

接着使用ps查询进程的PID,然后使用kill杀死进程

bash
ps -ef | grep test.sh

kill -9 PId

服务端渲染为什么利于SEO

服务端渲染(Server-Side Rendering,SSR)之所以利于SEO,主要是因为以下几个原因:

搜索引擎友好:搜索引擎(如Google)的爬虫通常只能理解并抓取静态的HTML内容。在客户端渲染(Client-Side Rendering,CSR)的应用中,页面内容往往是通过JavaScript动态生成的,这对于搜索引擎爬虫来说是不可见的。而在服务端渲染的应用中,页面内容在服务器上就已经被渲染成静态的HTML,因此能够被搜索引擎爬虫直接抓取并索引。 内容完整性:服务端渲染能够确保搜索引擎爬虫获取到完整的页面内容,包括那些由JavaScript动态生成的部分。这有助于搜索引擎更好地理解页面的主题和内容,从而提高网站的搜索排名。 加载速度:服务端渲染通常能够更快地加载页面内容,因为服务器可以直接发送已经渲染好的HTML给客户端,而不需要等待JavaScript文件下载和执行。这对于搜索引擎来说是一个重要的因素,因为搜索引擎通常更倾向于推荐加载速度快的网站。 URL管理:服务端渲染能够更好地管理URL,因为URL可以直接反映页面的内容和结构。这有助于搜索引擎理解网站的结构和层次关系,提高网站的可发现性和可索引性。

SpringBoot上传文件报错

报错信息:

nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.impl.IOFileUploadException: Processing of multipart/form-data request failed. No space left on device

解决此问题的方法有几种:

  • 清理磁盘空间:检查你的服务器或设备的硬盘空间,并删除不需要的文件或程序,以释放更多的空间。

  • 增加磁盘空间:如果可能的话,可以考虑增加磁盘空间或升级到一个更大的硬盘。

  • 检查Tomcat的工作目录:Tomcat通常会在其工作目录(通常是$CATALINA_HOME/temp)中存储临时文件。确保这个目录有足够的空间。

  • 配置Tomcat使用外部存储:你可以配置Tomcat使用外部存储或网络存储(如NFS)来存储临时文件。

  • 检查文件上传大小限制:确保你的应用程序或Tomcat配置没有设置过低的文件上传大小限制。这可以在web.xml或Tomcat的server.xml中配置。

  • 检查操作系统的文件描述符限制:在某些情况下,操作系统的文件描述符限制可能太低,导致无法处理大量并发上传。你可以考虑增加这个限制。

  • 重启Tomcat:有时候,简单地重启Tomcat服务器也可以解决一些临时问题。

这里报错的原因是SpringBoot内置的Tomcat临时存储路径磁盘空间不够导致的,默认的地址是/tmp,这个路径通常是由 JVM 的系统属性 java.io.tmpdir 指定的。要修改 Tomcat 的默认文件存储路径,需要改变这个系统属性的值。Spring Boot 本身并不提供直接修改 Tomcat 临时文件存储路径的配置选项,因此需要通过 JVM 参数来设置。解决步骤:

  • 设置JVM参数 在启动 Spring Boot 应用程序时,通过命令行设置 -Djava.io.tmpdir 参数来指定新的临时文件存储路径。例如:
bash
java -Djava.io.tmpdir=/your/new/temp/directory -jar your-springboot-app.jar
  • 确保目录存在且可写:

确保你指定的新路径 /your/new/temp/directory 已经存在,并且 Spring Boot 应用程序有权限在这个目录下创建和写入文件。

  • 输出当前临时文件存储路径检查
java
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.core.env.Environment;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RestController;  

@RestController  
public class TempDirController {  

    @Autowired  
    private Environment environment;  

    @GetMapping("/temp-dir")  
    public String getTempDir() {  
        String tempDir = environment.getProperty("java.io.tmpdir");  
        return "Current temp directory is: " + tempDir;  
    }  
}

java实现fo循环的几种方式

  • 基本for循环:这是最常见的for循环形式,用于遍历一个固定次数的序列。
java
for (int i = 0; i < 10; i++) {  
    System.out.println(i);  
}
  • 增强型for循环(也称为"foreach"循环):这种循环主要用于遍历数组或集合中的元素。
java
int[] numbers = {1, 2, 3, 4, 5};  
for (int number : numbers) {  
    System.out.println(number);  
}

或者对于集合:

java
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");  
for (String name : names) {  
    System.out.println(name);  
}
  • 标签化for循环:在Java 7及更高版本中,你可以使用标签来标识循环,并在循环内部使用 break 或 continue 语句与标签一起控制循环。
java
outer: for (int i = 0; i < 5; i++) {  
    for (int j = 0; j < 5; j++) {  
        if (j == 2) {  
            break outer;  // 这将终止外部循环  
        }  
        System.out.println(i + ", " + j);  
    }  
}
  • 无限循环:这种循环没有明确的终止条件,通常与其他控制结构(如 break 语句)一起使用以在某个条件满足时终止循环。
java
while (true) {  
    // 循环体  
    if (someCondition) {  
        break;  // 当someCondition为真时,终止循环  
    }  
}

Java中拼接字符串的几种方式

  • 使用加号(+)操作符: 这是最简单的方法,但对于大量的字符串拼接,它可能不是最高效的。
java
String str1 = "Hello";  
String str2 = "World";  
String result = str1 + " " + str2; // "Hello World"
  • 使用StringBuilder类: StringBuilder是一个可变对象,适用于在循环中拼接大量字符串,因为它比使用加号操作符更有效率。
java
StringBuilder sb = new StringBuilder();  
sb.append("Hello");  
sb.append(" ");  
sb.append("World");  
String result = sb.toString(); // "Hello World"
  • 使用StringBuffer类: StringBuffer与StringBuilder类似,但它是线程安全的,因此适用于多线程环境。然而,由于同步的开销,它在单线程环境下通常比StringBuilder慢。
java
StringBuffer sb = new StringBuffer();  
sb.append("Hello");  
sb.append(" ");  
sb.append("World");  
String result = sb.toString(); // "Hello World"
  • 使用String.format()方法: 这是一个格式化字符串的方法,可以用来拼接带有格式化占位符的字符串。
java
String str1 = "Hello";  
String str2 = "World";  
String result = String.format("%s %s", str1, str2); // "Hello World"
  • 使用String.join()方法: 从Java 8开始,String类提供了一个静态方法join(),它可以使用指定的分隔符将元素连接成一个字符串。
java
String delimiter = " ";  
String[] words = {"Hello", "World"};  
String result = String.join(delimiter, words); // "Hello World"

SpringBoot实现一个定时器

java
import org.springframework.scheduling.annotation.Scheduled;  
import org.springframework.stereotype.Component;  
  
@Component  
public class MyScheduledTask {  
  
    @Scheduled(fixedRate = 10000) // 每10秒执行一次  
    public void executeEveryTenSeconds() {  
        // 在这里编写你的定时任务逻辑  
        System.out.println("执行定时任务: " + System.currentTimeMillis());  
    }  
}

或者使用cron表达式

java
import org.springframework.scheduling.annotation.Scheduled;  
import org.springframework.stereotype.Component;  
  
@Component  
public class MyCronScheduledTask {  
  
    // 使用cron语法来设置执行间隔,这里设置为每20秒执行一次  
    @Scheduled(cron = "0/20 * * * * ?")  
    public void executeEveryTwentySecondsWithCron() {  
        // 在这里编写你的定时任务逻辑  
        System.out.println("执行定时任务(使用Cron语法): " + System.currentTimeMillis());  
    }  
}

上次更新于: