在若依框架的动态数据源切换的基础上application.yml中配置两个数据源,实现一个java工具类,把一个数据源表中的数据在未知字段名的情况下,采用批量插入的方式同步到另一个数据源表的中,以表名作为入参调用该工具类实现数据同步
时间: 2023-12-10 18:42:26 浏览: 112
数据同步java
5星 · 资源好评率100%
首先,需要在application.yml中配置两个数据源,例如:
```yaml
spring:
datasource:
primary:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/primary_db?serverTimezone=Asia/Shanghai
username: root
password: 123456
secondary:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/secondary_db?serverTimezone=Asia/Shanghai
username: root
password: 123456
```
然后,在若依框架的动态数据源切换的基础上,创建一个工具类,实现数据同步功能。代码如下:
```java
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Component
public class DataSyncUtil {
@Autowired
private JdbcTemplate primaryJdbcTemplate;
@Autowired
private JdbcTemplate secondaryJdbcTemplate;
public void syncData(String tableName) {
List<Map<String, Object>> dataList = primaryJdbcTemplate.queryForList("SELECT * FROM " + tableName);
List<String> columnList = new ArrayList<>();
for (Map.Entry<String, Object> entry : dataList.get(0).entrySet()) {
columnList.add(entry.getKey());
}
StringBuilder sql = new StringBuilder("INSERT INTO " + tableName + "(");
for (String column : columnList) {
sql.append(column).append(",");
}
sql.deleteCharAt(sql.length() - 1);
sql.append(") VALUES(");
for (int i = 0; i < columnList.size(); i++) {
sql.append("?,");
}
sql.deleteCharAt(sql.length() - 1);
sql.append(")");
List<Object[]> batchArgs = new ArrayList<>();
for (Map<String, Object> data : dataList) {
List<Object> args = new ArrayList<>();
for (String column : columnList) {
args.add(data.get(column));
}
batchArgs.add(args.toArray());
}
secondaryJdbcTemplate.batchUpdate(sql.toString(), batchArgs);
}
}
```
该工具类的作用是,根据传入的表名,从主数据源中查询出该表的所有数据,并将其批量插入到从数据源中。其中,由于不知道主数据源中表的字段名,因此需要先查询出字段名,然后动态构建SQL语句和参数数组。
使用该工具类的示例如下:
```
@Autowired
private DataSyncUtil dataSyncUtil;
public void syncData(String tableName) {
dataSyncUtil.syncData(tableName);
}
```
在业务代码中调用该方法即可实现数据同步。
阅读全文