假如 我有一同人规则表张表 里面维护的同人规则数据, 现在我通过接口拿到了一批 同人规则数据,我要讲接口拿到的规则数据和数据库同人规则表里的数据 进行对比 如果少了 我就要新增 如果多了 我就要删除 对比字段 是 source_id 和 target_id 还有 sockpuppet_rule_id 如何实现 担心数据顺序不一样 java代码实现
时间: 2024-03-04 21:47:58 浏览: 94
您可以按照以下步骤实现:
1. 首先,您需要将接口拿到的同人规则数据和数据库同人规则表里的数据都按照 source_id 和 target_id 排序,以确保数据顺序一致。
2. 然后,您可以使用 Java 的集合类,将两个数据集分别存储在 List 中。
3. 接下来,您可以使用 Java 的 Collections 工具类,将两个 List 进行合并,根据 source_id 和 target_id 进行匹配。
4. 合并后,您可以使用 Java 的循环语句,找到新增的规则数据和需要删除的规则数据。如果数据库同人规则表里的数据包含合并后的数据,则表示这条数据需要删除;如果接口拿到的同人规则数据包含合并后的数据,则表示这条数据是新增的。
5. 最后,您可以使用 Java 的 JDBC API,将新增的规则数据插入到同人规则表中,将需要删除的规则数据从同人规则表中删除。
以下是示例代码:
```java
import java.sql.*;
import java.util.*;
public class Main {
private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
private static final String DB_URL = "jdbc:mysql://localhost:3306/mydatabase";
private static final String USER = "root";
private static final String PASS = "password";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 加载 JDBC 驱动程序
Class.forName(JDBC_DRIVER);
// 打开一个连接
conn = DriverManager.getConnection(DB_URL, USER, PASS);
// 读取接口拿到的同人规则数据和数据库同人规则表里的数据
List<Rule> apiData = readApiData();
List<Rule> dbData = readDbData(conn);
// 对数据按照 source_id 和 target_id 进行排序
Collections.sort(apiData);
Collections.sort(dbData);
// 将两个数据集进行合并
List<Rule> mergedData = mergeData(apiData, dbData);
// 找到新增的规则数据和需要删除的规则数据
List<Rule> newData = new ArrayList<>();
List<Rule> deleteData = new ArrayList<>();
for (Rule rule : mergedData) {
if (dbData.contains(rule)) {
// 数据库同人规则表里的数据包含这条数据,需要删除
deleteData.add(rule);
} else if (apiData.contains(rule)) {
// 接口拿到的同人规则数据包含这条数据,是新增的
newData.add(rule);
}
}
// 将新增的规则数据插入到同人规则表中
insertData(conn, newData);
// 将需要删除的规则数据从同人规则表中删除
deleteData(conn, deleteData);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭连接
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (SQLException se) {
se.printStackTrace();
}
}
}
// 读取接口拿到的同人规则数据
private static List<Rule> readApiData() {
List<Rule> apiData = new ArrayList<>();
// TODO: 读取接口拿到的同人规则数据
return apiData;
}
// 读取数据库同人规则表里的数据
private static List<Rule> readDbData(Connection conn) throws SQLException {
List<Rule> dbData = new ArrayList<>();
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement();
String sql = "SELECT * FROM sockpuppet_rule";
rs = stmt.executeQuery(sql);
while (rs.next()) {
Rule rule = new Rule(rs.getInt("source_id"), rs.getInt("target_id"), rs.getInt("sockpuppet_rule_id"));
dbData.add(rule);
}
} finally {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
}
return dbData;
}
// 合并数据
private static List<Rule> mergeData(List<Rule> apiData, List<Rule> dbData) {
List<Rule> mergedData = new ArrayList<>();
int i = 0, j = 0;
while (i < apiData.size() && j < dbData.size()) {
Rule apiRule = apiData.get(i);
Rule dbRule = dbData.get(j);
if (apiRule.compareTo(dbRule) < 0) {
mergedData.add(apiRule);
i++;
} else if (apiRule.compareTo(dbRule) > 0) {
mergedData.add(dbRule);
j++;
} else {
mergedData.add(apiRule);
i++;
j++;
}
}
while (i < apiData.size()) {
mergedData.add(apiData.get(i));
i++;
}
while (j < dbData.size()) {
mergedData.add(dbData.get(j));
j++;
}
return mergedData;
}
// 将新增的规则数据插入到同人规则表中
private static void insertData(Connection conn, List<Rule> newData) throws SQLException {
PreparedStatement pstmt = null;
try {
String sql = "INSERT INTO sockpuppet_rule (source_id, target_id, sockpuppet_rule_id) VALUES (?, ?, ?)";
pstmt = conn.prepareStatement(sql);
for (Rule rule : newData) {
pstmt.setInt(1, rule.sourceId);
pstmt.setInt(2, rule.targetId);
pstmt.setInt(3, rule.ruleId);
pstmt.executeUpdate();
}
} finally {
if (pstmt != null) pstmt.close();
}
}
// 将需要删除的规则数据从同人规则表中删除
private static void deleteData(Connection conn, List<Rule> deleteData) throws SQLException {
PreparedStatement pstmt = null;
try {
String sql = "DELETE FROM sockpuppet_rule WHERE source_id = ? AND target_id = ? AND sockpuppet_rule_id = ?";
pstmt = conn.prepareStatement(sql);
for (Rule rule : deleteData) {
pstmt.setInt(1, rule.sourceId);
pstmt.setInt(2, rule.targetId);
pstmt.setInt(3, rule.ruleId);
pstmt.executeUpdate();
}
} finally {
if (pstmt != null) pstmt.close();
}
}
}
// 同人规则类
class Rule implements Comparable<Rule> {
public int sourceId;
public int targetId;
public int ruleId;
public Rule(int sourceId, int targetId, int ruleId) {
this.sourceId = sourceId;
this.targetId = targetId;
this.ruleId = ruleId;
}
@Override
public int compareTo(Rule rule) {
if (this.sourceId != rule.sourceId) {
return this.sourceId - rule.sourceId;
} else if (this.targetId != rule.targetId) {
return this.targetId - rule.targetId;
} else {
return this.ruleId - rule.ruleId;
}
}
@Override
public boolean equals(Object obj) {
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Rule rule = (Rule) obj;
return this.sourceId == rule.sourceId && this.targetId == rule.targetId && this.ruleId == rule.ruleId;
}
@Override
public int hashCode() {
return Objects.hash(sourceId, targetId, ruleId);
}
}
```
在实际使用时,您需要根据自己的需求来修改代码,例如读取接口数据、连接数据库、插入和删除数据的 SQL 语句等。
阅读全文
相关推荐
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)