2024-09-02



import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;
 
import java.sql.Connection;
import java.util.Properties;
 
@Intercepts({
    @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
})
public class MyInterceptor implements Interceptor {
 
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 获取被拦截的对象
        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
        // 获取查询语句
        String sql = statementHandler.getBoundSql().getSql();
        // 在这里可以对sql进行任何你想要的处理
        System.out.println("Original SQL: " + sql);
        // 执行原始查询
        return invocation.proceed();
    }
 
    @Override
    public Object plugin(Object target) {
        // 为目标对象创建代理
        return Plugin.wrap(target, this);
    }
 
    @Override
    public void setProperties(Properties properties) {
        // 可以接收配置文件中的属性
    }
}

这段代码定义了一个简单的MyBatis拦截器,用于拦截StatementHandler的prepare方法。在拦截方法中,它打印出原始的SQL语句,并且可以对其进行修改。最后,它通过invocation.proceed()方法执行原始的查询。这个例子展示了如何使用MyBatis提供的Interceptor接口来增加自定义的拦截逻辑。

2024-09-02

Redis 提供了 8 种基本的淘汰策略:

  1. noeviction: 不进行淘汰,如果内存不足会返回错误。
  2. allkeys-lru: 根据最少最近使用算法(LRU),在所有键中淘汰不常使用的键。
  3. allkeys-random: 在所有键中随机淘汰。
  4. volatile-lru: 只对设置了过期时间的键进行 LRU 算法淘汰。
  5. volatile-random: 在设置了过期时间的键中随机淘汰。
  6. volatile-ttl: 淘汰即将过期的键,优先淘汰 TTL 较短的键。
  7. volatile-lfu: 只对设置了过期时间的键进行最少频率使用(LFU)算法淘汰。
  8. allkeys-lfu: 根据最少频率使用(LFU)算法,在所有键中淘汰不常使用的键。

优点和缺点:

  • allkeys-lruvolatile-lru:优点是能根据访问情况进行有效的淘汰,缺点是可能淘汰较新或较常用的键。
  • allkeys-randomvolatile-random:优点是简单,没有统计数据偏误,缺点是可能导致任意键被淘汰。
  • volatile-ttl:优点是能够优先淘汰即将过期的键,避免长期占用内存。
  • volatile-lfuallkeys-lfu:适合有大量热点数据和冷数据的应用,能够在全局范围内保持数据的访问频率,从而更加准确地淘汰不常使用的数据。

设置淘汰策略的命令:




redis-cli config set maxmemory-policy <policy>

示例:




redis-cli config set maxmemory-policy allkeys-lru
2024-09-02

在Spring Cloud中,服务接口调用通常使用Feign客户端。以下是使用Feign客户端调用服务接口的基本步骤和示例代码:

  1. 添加依赖:确保你的项目中包含了Spring Cloud Feign的依赖。



<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 启用Feign客户端:在Spring Boot应用的启动类或者配置类上添加@EnableFeignClients注解。



@SpringBootApplication
@EnableFeignClients
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  1. 创建Feign客户端接口:定义一个接口,并使用@FeignClient注解指定服务名称。



@FeignClient(name = "service-provider") // 服务提供者名称
public interface ServiceProviderClient {
    @GetMapping("/api/data")
    String getData();
}
  1. 使用Feign客户端:在需要的地方注入Feign客户端接口并调用方法。



@RestController
public class ConsumerController {
 
    @Autowired
    private ServiceProviderClient serviceProviderClient;
 
    @GetMapping("/consume")
    public String consumeService() {
        return serviceProviderClient.getData();
    }
}

确保你的服务注册中心(如Eureka, Consul)可用,并且服务提供者(service-provider)已注册。这样,Feign客户端就可以通过服务名称动态找到并调用对应的服务接口。

2024-09-02

创建Oracle Data Guard环境涉及多个步骤,包括配置主数据库(Primary Database)和备数据库(Standby Database)。以下是一个简化的步骤和示例配置,用于创建Data Guard配置。

  1. 确保主数据库和备数据库的网络连接正常。
  2. 在主数据库上创建备用日志文件(如果尚不存在)。
  3. 配置主数据库以允许备数据库复制。
  4. 在备数据库上配置接受和应用主数据库的变更。

以下是相关的示例配置脚本,这些脚本应在SQL*Plus或类似的Oracle数据库客户端中执行。

在主数据库上:




-- 1. 创建备用日志文件
ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/u01/oradata/primary/redo04.log') SIZE 50M;
-- 重复此命令为每个额外的日志组增加日志文件
 
-- 2. 配置主数据库参数
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1=... SCOPE=BOTH; -- 配置归档日志的目的地,例如磁盘目录或 tape
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2=... SCOPE=BOTH; -- 配置备用日志传送目的地
ALTER SYSTEM SET FAL_SERVER='standby' SCOPE=BOTH; -- 指定备用服务器
ALTER SYSTEM SET FAL_CLIENT='primary' SCOPE=BOTH; -- 指定主服务器

在备数据库上:




-- 3. 配置备数据库以接收和应用主数据库的变更
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
 
-- 可能需要的辅助参数配置
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2=... SCOPE=BOTH; -- 配置备用日志接收的位置
ALTER SYSTEM SET FAL_SERVER='primary' SCOPE=BOTH; -- 指定主服务器
ALTER SYSTEM SET FAL_CLIENT='standby' SCOPE=BOTH; -- 指定备用服务器

这些步骤和示例配置为创建Oracle Data Guard提供了基础。在实际部署中,还需要考虑其他因素,如网络配置、权限设置、存储配置等。

2024-09-02

Navicat 是一款数据库管理工具,可以用于管理 SQL Server。以下是一些基本的 SQL 语句,这些语句可以在 SQL Server 中执行,用以创建数据库、表以及执行基本的数据操作。

  1. 创建数据库:



CREATE DATABASE TestDB;
  1. 选择数据库:



USE TestDB;
  1. 创建表:



CREATE TABLE Employees (
    ID INT PRIMARY KEY,
    Name NVARCHAR(100),
    Age INT,
    Salary DECIMAL(10, 2)
);
  1. 插入数据:



INSERT INTO Employees (ID, Name, Age, Salary) VALUES (1, 'John Doe', 30, 75000.00);
  1. 查询数据:



SELECT * FROM Employees;
  1. 更新数据:



UPDATE Employees SET Salary = Salary * 1.10 WHERE ID = 1;
  1. 删除数据:



DELETE FROM Employees WHERE ID = 1;
  1. 删除表:



DROP TABLE Employees;
  1. 删除数据库:



DROP DATABASE TestDB;

以上 SQL 语句可以在 Navicat 的查询编辑器中执行,也可以在 SQL Server Management Studio 中执行。

2024-09-02

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。在Spring Boot项目中使用Swagger,可以帮助开发者简化REST API的文档、测试和共享。

以下是Swagger 3/2与Spring Boot结合使用的一些关键点和示例:

  1. 引入Swagger依赖:



<!-- Swagger 3 -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>
  1. 配置Swagger:



@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build();
    }
}
  1. 在Controller中使用Swagger注解:



@Api(value = "用户管理", tags = "用户管理接口")
@RestController
@RequestMapping("/users")
public class UserController {
 
    @ApiOperation(value = "获取用户列表", notes = "获取用户列表")
    @GetMapping("/")
    public ResponseEntity<List<User>> getUserList() {
        // ...
    }
 
    @ApiOperation(value = "创建用户", notes = "创建用户")
    @PostMapping("/")
    public ResponseEntity<User> createUser(@RequestBody User user) {
        // ...
    }
 
    // ...
}
  1. 访问Swagger UI:

启动Spring Boot应用后,可以通过访问 http://<host>:<port>/swagger-ui/index.html 来查看Swagger生成的API文档。

  1. 自定义Swagger配置:
  • 添加API分组
  • 设置API文档的全局参数、响应消息等
  • 应用安全设置,如Basic Auth、Bearer Token等
  1. 确保生产环境安全:
  • 禁用Swagger或限制访问
  • 使用Swagger的权限控制功能
  1. 更新Swagger依赖:



<!-- Swagger 3 依赖更新 -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>
  1. 升级Spring Boot和Swagger版本时,确保兼容性。

总结:

在Spring Boot项目中使用Swagger,首先需要引入Swagger依赖,然后配置Swagger。在Controller类和方法上使用Swagger注解描述API。启动应用后可以通过Swagger UI访问API文档。在生产环境中,确保Swagger的使用是安全的,不暴露敏感信息。定期更新Swagger依赖,保证与Spring Boot的兼容性。

2024-09-02

在MyBatis-Plus中,QueryWrapper 用于构造查询条件。当你需要使用OR条件时,可以使用or 方法或者直接使用Lambda表达式。

以下是使用QueryWrapper构造OR条件的两种方法:

  1. 使用or 方法链:



QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三").or().eq("email", "zhangsan@example.com");
  1. 使用Lambda表达式:



QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(User::getName, "张三").or().eq(User::getEmail, "zhangsan@example.com");

在这两个例子中,我们构造了一个查询条件,要求name 等于"张三" 或者 email 等于"zhangsan@example.com"。使用Lambda表达式的方式更加类型安全,并且可以利用IDE的自动完成来减少出错的可能。

2024-09-02



import de.codecentric.boot.admin.server.config.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@EnableAdminServer
@SpringBootApplication
public class SpringBootAdminServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootAdminServerApplication.class, args);
    }
}

这段代码展示了如何在Spring Boot应用中启用Spring Boot Admin服务器端。通过@EnableAdminServer注解启用Spring Boot Admin的服务器功能,并且通过@SpringBootApplication注解启用Spring Boot的自动配置功能。这是创建管理和监控Spring Boot应用的服务端的简单例子。

2024-09-02



import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
 
@Service
public class CachingService {
 
    private final Cache<String, String> cache;
 
    public CachingService() {
        this.cache = Caffeine.newBuilder()
                .expireAfterWrite(10, TimeUnit.MINUTES) // 缓存写入后10分钟过期
                .maximumSize(100) // 最大缓存数目
                .build();
    }
 
    public void putInCache(String key, String value) {
        cache.put(key, value);
    }
 
    public String getFromCache(String key) {
        return cache.getIfPresent(key); // 如果缓存存在,返回缓存值,否则返回null
    }
}

这段代码展示了如何在Spring Boot应用中使用Caffeine作为本地缓存。首先,我们创建了一个Cache实例,并设置了缓存的过期时间和最大容量。然后,我们提供了putInCache方法将数据存入缓存,以及getFromCache方法从缓存中获取数据。如果缓存中不存在数据,则返回null。这个例子简单易懂,并且展示了Caffeine的基本用法。

2024-09-02



# 安装Docker和Jenkins
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
 
# 启动Docker和Jenkins服务
sudo systemctl start docker
sudo systemctl start jenkins
 
# Jenkins配置:全局工具配置
# Docker 配置
# 在 Jenkins “管理 Jenkins” -> “全局工具配置”中设置 Docker 工具,并配置 Docker 的路径。
 
# Jenkins 项目配置
# 创建一个新的 Jenkins 项目,并在构建环节中添加以下步骤:
```bash
# 编写一个简单的 Jenkinsfile 脚本
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'mvn clean package'
            }
        }
        stage('Test') {
            steps {
                sh 'mvn test'
            }
        }
        stage('Build Docker Image') {
            steps {
                sh 'docker build -t my-springboot-app .'
            }
        }
        stage('Deploy') {
            steps {
                sh 'docker run -d -p 8080:8080 my-springboot-app'
            }
        }
    }
}

以上 Jenkinsfile 脚本定义了一个简单的 CI/CD 流水线,用于构建、测试 SpringBoot 应用,并且生成 Docker 镜像,最后将应用部署到 Docker 容器中。这个流程是精简的,并且展示了如何结合 Jenkins 和 Docker 自动化部署 SpringBoot 应用。