用java写一个工具类,在多个oracle数据源的情况下采用数据源切换的方式DynamicDataSourceContextHolder.setDataSourceType,实现把一个库中的表数据,在未知字段名的情况下,采用批量插入的方式同步到另一个库的表中,可以采用表名作为入参调用改工具类实现数据同步
时间: 2023-12-06 20:44:34 浏览: 202
JAVA数据库工具类
4星 · 用户满意度95%
好的,以下是一个简单的工具类示例:
```java
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
public class OracleDataSync {
private DataSource sourceDataSource; // 数据源1
private DataSource targetDataSource; // 数据源2
public OracleDataSync(DataSource source, DataSource target) {
this.sourceDataSource = source;
this.targetDataSource = target;
}
// 获取源数据库中指定表的数据
public List<List<Object>> getSourceTableData(String tableName) throws SQLException {
List<List<Object>> data = new ArrayList<>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = sourceDataSource.getConnection();
String sql = "SELECT * FROM " + tableName;
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
List<Object> rowData = new ArrayList<>();
int columnCount = rs.getMetaData().getColumnCount();
for (int i = 1; i <= columnCount; i++) {
rowData.add(rs.getObject(i));
}
data.add(rowData);
}
} finally {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
}
return data;
}
// 同步数据到目标数据库中指定表
public void syncDataToTargetTable(String tableName, List<List<Object>> data) throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = targetDataSource.getConnection();
conn.setAutoCommit(false); // 关闭自动提交事务
String sql = "INSERT INTO " + tableName + " VALUES (";
int columnCount = data.get(0).size();
for (int i = 0; i < columnCount; i++) {
if (i == columnCount - 1) {
sql += "?)";
} else {
sql += "?,";
}
}
ps = conn.prepareStatement(sql);
for (List<Object> rowData : data) {
for (int i = 1; i <= columnCount; i++) {
ps.setObject(i, rowData.get(i - 1));
}
ps.addBatch(); // 加入批处理
}
ps.executeBatch(); // 执行批处理
conn.commit(); // 提交事务
} catch (SQLException e) {
conn.rollback(); // 回滚事务
throw e;
} finally {
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
}
}
}
```
使用示例:
```java
DataSource sourceDataSource = ...; // 初始化源数据源
DataSource targetDataSource = ...; // 初始化目标数据源
OracleDataSync sync = new OracleDataSync(sourceDataSource, targetDataSource);
String sourceTableName = "source_table_name";
String targetTableName = "target_table_name";
List<List<Object>> data = sync.getSourceTableData(sourceTableName);
sync.syncDataToTargetTable(targetTableName, data);
```
需要注意的是,如果源和目标数据库有表结构不同的情况,需要对数据进行适当的转换或者忽略某些字段。同时,推荐使用连接池管理数据源以提高性能。
阅读全文