前言:
现一个单体springboot项目已开发完成,需求同步db2数据库的数据。
思考:
原写好的代码不改动的情况下实现
解决方案:
1.配置多数据源
pass原因:
a.不会频繁同步,每天同步一两次,配置多数据源 db2数据源资源浪费
b.需要添加配置文件,指定主数据源,db2数据源配置
c.项目有用flyway数据库版本控制需要更改配置文件
改动较多--放弃
2.在同步触发时写原生数据库连接,在方法执行结束后关闭连接
采用:
a.不改动原代码
b.资源不浪费
实现步骤
1.封装公共数据库连接类
public class DataConnections {
/**
* 根据提供的SQL查询从数据库中检索数据。
*
* @param sql SQL查询语句
* @param url 数据库URL
* @param username 数据库用户名
* @param password 数据库密码
* @param rowMapper RowMapper接口的实现,用于将ResultSet映射到所需类型
* @param <T> 返回的数据类型
* @return 根据提供的SQL查询和RowMapper返回的数据列表
* @throws SQLException 如果发生数据库访问错误
*/
public <T> List<T> getData(String sql, String url, String username, String password,
RowMapper<T> rowMapper) throws SQLException {
List<T> dataList = new ArrayList<>();
try (
Connection connection = DriverManager.getConnection(url, username, password);
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
T data = rowMapper.mapRow(resultSet);
dataList.add(data);
}
} catch (SQLException e) {
// 异常处理
e.printStackTrace();
}
return dataList;
}
//注意这里没有进行 resultSet.close();preparedStatement.close();connection.close();
//原因:在 Java 7 引入的 try-with-resources 结构中,如果你将 ResultSet、PreparedStatement 和 Connection 作为资源在 try 语句中初始化,它 们会在 try 代码块结束时自动关闭,不需要显式调用 close 方法。
}
2.实现
@Component
public class ExamineHiddenRecordSync {
//获取数据url
@Value("${spring.datasource.vrs.url}")
private String url;
//用户名
@Value("${spring.datasource.vrs.username}")
private String username;
//密码
@Value("${spring.datasource.vrs.password}")
private String password;
DataConnections dataConnections;
public ExamineHiddenRecordSync() {
this.dataConnections = new DataConnections();
}
/**
* 同步方法
*/
public void sync() {
//查询sql
String sqlQuery = "SELECT * FROM t_visitor_apply";
try {
//获取数据
List<HiddenDangerRecord> data = dataConnections.getData(sqlQuery, url, username, password, this::convertEntity);
System.out.println("data = " + data);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 将ResultSet中的数据映射到Entity对象。
*
* @param resultSet ResultSet对象
*/
private Entity convertEntity(ResultSet resultSet) throws SQLException {
Entity entity = new Entity();
System.out.println("resultSet.getString(\"name\") = " + resultSet.getString("name"));
//想要拿到的值
entity.setBuildingName(resultSet.getString("name"));
return entity;
}
}
3.配置文件
spring:
datasource:
vrs:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.1.242:3314/fire_archives?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useAffectedRows=true
username: KF
password: Mango252!@#