当前位置: 首页 > news >正文

jdbc实现跨库分页查询demo

jdbc实现跨库分页查询demo在这里插入图片描述

数据库表结构及示例数据

创建数据库和表

-- 数据库A
CREATE DATABASE a;
USE a;CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL,age INT,create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);-- 数据库B
CREATE DATABASE b;
USE b;CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL,age INT,create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

插入示例数据(各10条)

-- 数据库A的数据
USE a;
INSERT INTO users (username, age) VALUES ('Alice_A', 25);
INSERT INTO users (username, age) VALUES ('Bob_A', 30);
INSERT INTO users (username, age) VALUES ('Charlie_A', 22);
INSERT INTO users (username, age) VALUES ('David_A', 28);
INSERT INTO users (username, age) VALUES ('Eve_A', 35);
INSERT INTO users (username, age) VALUES ('Frank_A', 40);
INSERT INTO users (username, age) VALUES ('Grace_A', 27);
INSERT INTO users (username, age) VALUES ('Henry_A', 33);
INSERT INTO users (username, age) VALUES ('Ivy_A', 29);
INSERT INTO users (username, age) VALUES ('Jack_A', 31);-- 数据库B的数据
USE b;
INSERT INTO users (username, age) VALUES ('Alice_B', 26);
INSERT INTO users (username, age) VALUES ('Bob_B', 32);
INSERT INTO users (username, age) VALUES ('Charlie_B', 23);
INSERT INTO users (username, age) VALUES ('David_B', 29);
INSERT INTO users (username, age) VALUES ('Eve_B', 36);
INSERT INTO users (username, age) VALUES ('Frank_B', 41);
INSERT INTO users (username, age) VALUES ('Grace_B', 28);
INSERT INTO users (username, age) VALUES ('Henry_B', 34);
INSERT INTO users (username, age) VALUES ('Ivy_B', 30);
INSERT INTO users (username, age) VALUES ('Jack_B', 32);

代码

import lombok.Data;import java.sql.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;public class CrossDatabasePagination {// 数据库连接信息private static final String DB_URL_A = "jdbc:mysql:///:3306/a";private static final String DB_URL_B = "jdbc:mysql:///:3306/b";private static final String USER = "root";private static final String PASS = "cnmsb";public static void main(String[] args) {int page = 2;  // 第2页int pageSize = 5;  // 每页5条List<User> combinedResults = getCrossDatabaseUsers(page, pageSize);System.out.println("跨库分页查询结果(第" + page + "页, 每页" + pageSize + "条):");combinedResults.forEach(System.out::println);}public static List<User> getCrossDatabaseUsers(int page, int pageSize) {List<User> allUsers = new ArrayList<>();// 从数据库A查询,标记来源为"a"allUsers.addAll(getUsersFromDatabase(DB_URL_A, page, pageSize, "a"));// 从数据库B查询,标记来源为"b"allUsers.addAll(getUsersFromDatabase(DB_URL_B, page, pageSize, "b"));// 内存中合并、排序和分页return allUsers.stream().sorted(Comparator.comparing(User::getId)).skip((page - 1) * pageSize).limit(pageSize).collect(Collectors.toList());}private static List<User> getUsersFromDatabase(String dbUrl, int page, int pageSize, String sourceDb) {List<User> users = new ArrayList<>();// 计算每个库应该查询的数据量int limit = pageSize;int offset = (page - 1) * pageSize;String sql = "SELECT id, username, age, create_time FROM users ORDER BY id LIMIT ? OFFSET ?";try (Connection conn = DriverManager.getConnection(dbUrl, USER, PASS);PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setInt(1, limit);pstmt.setInt(2, offset);ResultSet rs = pstmt.executeQuery();while (rs.next()) {User user = new User();user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setAge(rs.getInt("age"));user.setCreateTime(rs.getTimestamp("create_time"));user.setSourceDb(sourceDb);  // 设置数据来源users.add(user);}} catch (SQLException e) {System.err.println("查询数据库出错: " + dbUrl);e.printStackTrace();}return users;}@Datastatic class User {private int id;private String username;private int age;private Timestamp createTime;private String sourceDb;  // 新增字段,标识数据来源@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", age=" + age +", createTime=" + createTime +", sourceDb='" + sourceDb + '\'' +'}';}}
}
http://www.lqws.cn/news/529885.html

相关文章:

  • 人力资源管理系统
  • Spring Cloud Config动态刷新实战指南
  • 用户统计-01.需求分析和设计
  • GNSS位移监测站在大坝安全中的用处
  • 渗透实战:使用隐式转换覆盖toString的反射型xss
  • Day43 复习日 图像数据集——CNN
  • 【PX4-AutoPilot教程-TIPS】PX4系统命令行控制台ConsolesShells常用命令(持续更新)
  • ES文件管理器v4.4.3(ES文件浏览器)
  • 鸿蒙 FoldSplitContainer 解析:折叠屏布局适配与状态管理
  • MySQL之存储函数与触发器详解
  • 多相机人脸扫描设备如何助力高效打造数字教育孪生体?
  • ethers.js express vue2 定时任务每天凌晨2点监听合约地址数据同步到Mysql整理
  • ASIO 避坑指南:高效、安全与稳健的异步网络编程
  • 微服务架构下面临的安全、合规审计挑战
  • Python打卡:Day37
  • 使用 Python 自动化文件获取:从 FTP 到 API 的全面指南
  • 【Bluedroid】蓝牙启动之 btm_acl_device_down 流程源码解析
  • 稳定币技术全解:从货币锚定机制到区块链金融基础设施
  • Java底层原理:深入理解线程与并发机制
  • GEO生成式引擎优化发展迅猛:热点数智化传播是GEO最佳路径
  • 人大金仓Kingbase数据库KSQL 常用命令指南
  • 【论文】云原生事件驱动架构在智能风控系统中的实践与思考
  • 小孙学变频学习笔记(八)变频器的输入电流(下)
  • RPC(Remote Procedure Call)技术解析
  • 计算机网络 网络层:控制平面(二)
  • WPF中Converter基础用法
  • 正则表达式,`[]`(字符类)和`|`(或操作符)
  • MFC制作动态波形图( ChartCtrl)
  • 【AI News | 20250626】每日AI进展
  • ​​Deepoc大模型在光电研发中的核心技术突破与应用​