依赖:除一下两个还有mybatisplus、MySQL、lombok
<!-- 此依赖为监听MySQL的数据变化-->
<dependency>
<groupId>com.zendesk</groupId>
<artifactId>mysql-binlog-connector-java</artifactId>
<version>0.27.1</version> <!--2022.09.17版的-->
</dependency>
<!-- 创建SpringBoot项目加入redis的starter依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
实现思路:需要把同步的数据库的所有数据读取出来
- 先查询某个数据库中的所有表名以及主键
- 根据表名去查询表中所有的数据(因为需要字段名对应的值,所有存储到map中)
- 把封装好的数据存入中间件(我这里用的Redis)
代码实现:
- 实体类:表名称、表主键、表数据(字段名、值)
-
@Data public class TableDataAndKey { String tableName; String key; List<Map<String,Object>> data; }
-
- 读取数据库数据(第一个查询传入数据库名称,查询到所有的表名以及主键。第二个查询传入表名称,查询到表的所有数据存放到map中)
-
<mapper namespace="com.lcx.mapper.MapperDb"> <select id="allTableName" resultType="com.lcx.entity.TableDataAndKey"> select a.TABLE_NAME 'tableName',a.column_name 'key' from information_schema.Columns a where TABLE_SCHEMA=#{dbName} AND COLUMN_KEY='PRI' </select> <select id="selectList" resultType="java.util.Map" parameterType="java.lang.String"> select * from ${tableName} </select> </mapper>
@Autowired MapperDb mapperDb; //存放表数据(pojo:表名称、主键、map<字段名,值>) public static List<TableDataAndKey> tableData; public void tableNameAll(String name){ //读取zy数据库中所有表名以及主键 List<TableDataAndKey> tableName = mapperDb.allTableName(name); for (TableDataAndKey list : tableName) { //根据表名称查询到表中的数据,并存放在map中 List<Map<String, Object>> maps = mapperDb.selectList(list.getTableName()); list.setData(maps); } tableData=tableName; }
这样数据库所有表的数据已经存进实体类中了,然后定义了一个静态list变量存放进去。我这里实现了ApplicationRunner接口,重写run方法。当项目启动的时候调用tableNameAll()方法传入数据库名称就可以。这样静态list变量就有数据了
-
- 把数据存放进中间件(我这里用的Redis用kafka等等都可以)
-
@Component @Order(2)//规定执行顺序 public class DataToRedis implements ApplicationRunner { private static final String PRODUCT_LIST_KEY = "key_测试"; @Autowired RedisTemplate redisTemplate; @Override public void run (ApplicationArguments args) throws Exception
-