定时任务实时抓取数据将查询的数据实时更新进表里,对于表里有的数据现在查询的数据还有那就更新,如果之前没有现在有数据那就插入,如果之前有现在没有那就删除,使用java语言使用tk-mybatis使用postgresql
时间: 2024-02-21 21:00:10 浏览: 72
你可以使用tk-mybatis的Mapper接口和注解来实现这个功能,具体步骤如下:
1. 定义一个实体类,用于存储要更新的数据。示例代码如下:
```
public class DataEntity {
private Long id;
private String col1;
private String col2;
// 省略getter和setter方法
}
```
2. 在Mapper接口中定义三个方法,分别用于插入、更新和删除数据。示例代码如下:
```
public interface DataMapper extends Mapper<DataEntity> {
@InsertProvider(type = DataSqlProvider.class, method = "insertBatch")
void insertBatch(List<DataEntity> dataList);
@UpdateProvider(type = DataSqlProvider.class, method = "updateBatch")
void updateBatch(List<DataEntity> dataList);
@DeleteProvider(type = DataSqlProvider.class, method = "deleteBatch")
void deleteBatch(List<Long> idList);
}
```
3. 在DataSqlProvider类中编写动态SQL语句,根据数据是否存在进行相应的操作。示例代码如下:
```
public class DataSqlProvider {
public String insertBatch(Map<String, Object> paramMap) {
List<DataEntity> dataList = (List<DataEntity>) paramMap.get("list");
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.append("INSERT INTO table_name (id, col1, col2) VALUES ");
for (DataEntity data : dataList) {
sqlBuilder.append("(")
.append(data.getId()).append(", ")
.append("'").append(data.getCol1()).append("', ")
.append("'").append(data.getCol2()).append("'),");
}
sqlBuilder.deleteCharAt(sqlBuilder.length() - 1);
return sqlBuilder.toString();
}
public String updateBatch(Map<String, Object> paramMap) {
List<DataEntity> dataList = (List<DataEntity>) paramMap.get("list");
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.append("<foreach collection=\"list\" item=\"data\" separator=\";\">")
.append("UPDATE table_name SET ")
.append("col1 = #{data.col1}, ")
.append("col2 = #{data.col2} ")
.append("WHERE id = #{data.id}")
.append("</foreach>");
return sqlBuilder.toString();
}
public String deleteBatch(Map<String, Object> paramMap) {
List<Long> idList = (List<Long>) paramMap.get("list");
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.append("DELETE FROM table_name WHERE id NOT IN (")
.append("<foreach collection=\"list\" item=\"id\" separator=\",\">")
.append("#{id}")
.append("</foreach>")
.append(")");
return sqlBuilder.toString();
}
}
```
4. 在Java代码中调用Mapper接口的方法,将List传入Mapper中执行即可。示例代码如下:
```
@Autowired
private DataMapper dataMapper;
public void updateData(List<DataEntity> dataList) {
List<Long> idList = dataList.stream().map(DataEntity::getId).collect(Collectors.toList());
List<DataEntity> existingDataList = dataMapper.selectByIdList(idList);
List<DataEntity> newDataList = new ArrayList<>();
for (DataEntity data : dataList) {
boolean exists = false;
for (DataEntity existingData : existingDataList) {
if (existingData.getId().equals(data.getId())) {
exists = true;
if (!existingData.equals(data)) {
dataMapper.updateByPrimaryKeySelective(data);
}
break;
}
}
if (!exists) {
newDataList.add(data);
}
}
dataMapper.insertBatch(newDataList);
dataMapper.deleteBatch(idList);
}
```
注意事项:
- 实体类、Mapper接口和SQL语句需要根据实际情况进行修改,如有多个字段需要更新或插入,需要在实体类、Mapper接口和SQL语句中添加相应的字段。
- 插入操作使用的是批量插入,可以提高插入效率。
- 更新操作使用的是selectByIdList方法查询表中已有的数据,如果数据量很大可能会影响查询效率。
- 删除操作使用的是NOT IN语句,将id不在dataList中的数据删除。
阅读全文