首页 文章 精选 留言 我的

精选列表

搜索[java],共10000篇文章
优秀的个人博客,低调大师

java 没有能打的 ORM?国产 ORM 框架 sqltoy-orm 5.6.4 发版

开源地址: github:https://github.com/sagframe/sagacity-sqltoy gitee:https://gitee.com/sagacity/sagacity-sqltoy idea 插件 (可直接在 idea 中检索安装):https://github.com/threefish/sqltoy-idea-plugins sqltoy 脚手架项目:https://gitee.com/momoljw/sss-rbac-admin sqltoy lambda 项目:https://gitee.com/gzghde/sqltoy-plus 更新内容 1、因存在count缓存、pageNo越界、查询count和查询记录的时间差等场景,导致totalCount跟pageNo、pageSize、rowSize的逻辑值差异,比如:totalCount=8,pageNo=2,rowSize=1,pageSize=10,应校正totalCount=11 感谢@ccc @俊华的反馈 JPA 部分 类似 JPA 的对象化 CRUD、对象级联加载和新增、更新 支持通过 POJO 生成 DDL 以及直接向数据库创建表 强化 update 操作,提供弹性字段修改能力,不同于 hibernate 先 load 后修改,而是一次数据库交互完成修改,确保了高并发场景下数据的准确性 改进了级联修改,提供了先删除或者先置无效,再覆盖的操作选项 增加了 updateFetch、updateSaveFetch 功能,强化针对强事务高并发场景的处理,类似库存台账、资金台账,实现一次数据库交互,完成锁查询、不存在则插入、存在则修改,并返回修改后的结果 增加了树结构封装,便于统一不同数据库树型结构数据的递归查询 支持分库分表、支持多种主键策略 (额外支持基于 redis 的产生特定规则的业务主键)、加密存储、数据版本校验 提供了公共属性赋值 (创建人、修改人、创建时间、修改时间、租户)、扩展类型处理等 提供了多租户统一过滤和赋值、提供了数据权限参数带入和越权校验 查询部分 极为直观的 sql 编写方式,便于从客户端 <--> 代码 双向快速迁移,便于后期变更维护 支持缓存翻译、反向缓存匹配 key 代替 like 模糊查询 提供了跨数据库支持能力:不同数据库的函数自动转换适配,多方言 sql 根据实际环境自动匹配、多数据库同步测试,大幅提升了产品化能力 提供了取 top 记录、随机记录等特殊场景的查询功能 提供了最强大的分页查询机制:1) 自动优化 count 语句;2) 提供基于缓存的分页优化,避免每次都执行 count 查询;3) 提供了独具特色的快速分页;4) 提供了并行分页 提供了分库分表能力 提供了在管理类项目中极为价值的:分组汇总计算、行列转换 (行转列、列转行)、同比环比、树形排序、树形汇总 相关算法自然集成 提供了基于查询的层次化数据结构封装 提供了大量辅助功能:数据脱敏、格式化、条件参数预处理等 支持多种数据库 常规的 mysql、oracle、db2、postgresql、 sqlserver、dm、kingbase、sqlite、h2、 oceanBase、polardb、guassdb、tidb 支持分布式 olap 数据库: clickhouse、StarRocks、greenplum、impala (kudu) 支持 elasticsearch、mongodb 所有基于 sql 和 jdbc 各类数据库查询 sqltoy 特点介绍: sqltoy 的核心构建思想 sqltoy 的对比 mybatis (plus) 的核心点:查询语句编写、可阅读性、可维护性 对象化 crud 是基础,但 sqltoy 有针对性的改进:update、updateSaveFetch、updateFetch 等 sqltoy 的缓存翻译,大幅减少表关联简化 sql,让你的查询性能成几何级提升 极致的分页,同样帮助你实现查询的性能大幅提升 快速分页:@fast () 实现先取单页数据然后再关联查询,极大提升速度 分页优化器:page-optimize 让分页查询由两次变成 1.3~1.5 次 (用缓存实现相同查询条件的总记录数量在一定周期内无需重复查询 sqltoy 的分页取总记录的过程不是简单的 select count (1) from (原始 sql);而是智能判断是否变成:select count (1) from 'from 后语句 ', 并自动剔除最外层的 order by sqltoy 支持并行查询:parallel="true",同时查询总记录数和单页数据,大幅提升性能 便利的跨数据库统计计算:数据旋转 便利的跨数据库统计计算:无限极分组统计 (含汇总求平均) 便利的跨数据库统计计算:同比环比 5、树形表排序汇总 6、扩展集成

优秀的个人博客,低调大师

Java 比较 ORM 框架操作数据】操作批量新增、分页查询(七)

orm框架使用性能比较 比较mybatis、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql操作数据 环境: idea jdk17 spring boot 3.0.7 mysql 8.0 测试条件常规对象 orm 框架 是否支持xml 是否支持 Lambda 对比版本 编码方式 mybatis ☑️ ☑️ 3.5.4 lambda +xml 优化 sqltoy ☑️ ☑️ 5.2.98 lambda lazy ✖️ ☑️ 1.2.4-JDK17-SNAPSHOT lambda mybatis-flex ☑️ ☑️ 1.8.0 lambda +xml 优化 easy-query ✖️ ☑️ 1.10.31 lambda mybatis-mp ☑️ ☑️ 1.4.1 xml 优化 jpa ☑️ ☑️ 3.0.7 ---------------------- dbvisitor ☑️ ☑️ 5.4.1 xml 优化 beetlsql 支持md ☑️ 3.26.0-RELEASE insert ignore into 优化 数据库表(含有唯一性索引s_u) CREATE TABLE `sys_user` ( `column_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '额外字段', `create_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', `is_deleted` tinyint(1) DEFAULT NULL COMMENT 'null', `password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码', `scope` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'null', `status` tinyint(1) DEFAULT NULL COMMENT '状态', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `username` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `s_u` (`scope`,`username`) ) ENGINE=InnoDB AUTO_INCREMENT=9223371632070323791 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; 比较方法:增加、修改、删除、分页查询(当前项目暂时只比较批量新增和分页) 项目设计 声明 ORMRepository 接口提供对应增删改查方法 声明 ORMComparisonRepository接口 继承 ORMRepository 下游由不同ORM实现 声明 SysUserRepository 接口 继承 ORMRepository 用于循环调用不同orm实现方法执行方法测试产生测试结果 声明抽象类 SysUserRepositoryAbstractRecord 继承 ORMComparisonRepository 并且提供对应的框架执行结果存储 不同ORM框架创建 ORMComparisonRepository 的实现 不同 ORM 操作数据的实现 测试条件 批量插入数据 10、100、1000、10000、100000 ,分页查询数据 10、100、1000、10000、100000 项目启动后使用浏览器打开 http://localhost:1003/sys/user/run-compare 测试条件(细节比较) 批量插入数据 1~10000,分页查询数据 1~10000 项目启动后使用浏览器打开 http://localhost:1003/sys/user/run-particulars-compare 测试执行过程 清空需要插入表中所有数据 通过三种ORM框架进行数据批量新增、而后进行分页查询,记录消耗时间,输出md文档 查看结果曲线图 测试结果(结果只提供参考) MYBATIS_FLEX(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 25毫秒 18毫秒 73毫秒 671毫秒 6653毫秒 MYBATIS(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 51毫秒 28毫秒 84毫秒 601毫秒 5963毫秒 LAZY(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 4毫秒 12毫秒 48毫秒 353毫秒 3512毫秒 MYBATIS_MP(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 8毫秒 16毫秒 66毫秒 589毫秒 6060毫秒 DB_VISITOR(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 67毫秒 155毫秒 897毫秒 8368毫秒 82348毫秒 JPA(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 67毫秒 64毫秒 952毫秒 8608毫秒 95946毫秒 EASY_QUERY(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 58毫秒 91毫秒 395毫秒 1608毫秒 15802毫秒 SQLTOY(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 35毫秒 36毫秒 173毫秒 1540毫秒 15167毫秒 BEETL_SQL(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 187毫秒 106毫秒 260毫秒 1713毫秒 16778毫秒 MYBATIS_FLEX(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 28毫秒 8毫秒 19毫秒 113毫秒 865毫秒 MYBATIS(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 26毫秒 7毫秒 20毫秒 98毫秒 732毫秒 LAZY(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 5毫秒 5毫秒 9毫秒 71毫秒 474毫秒 MYBATIS_MP(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 28毫秒 5毫秒 16毫秒 89毫秒 752毫秒 DB_VISITOR(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 14毫秒 4毫秒 9毫秒 50毫秒 424毫秒 JPA(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 85毫秒 11毫秒 49毫秒 117毫秒 805毫秒 EASY_QUERY(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 39毫秒 9毫秒 22毫秒 60毫秒 474毫秒 SQLTOY(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 23毫秒 4毫秒 10毫秒 45毫秒 249毫秒 BEETL_SQL(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 43毫秒 13毫秒 21毫秒 76毫秒 633毫秒 写在最后 细节数据对比(一万以内基本相差不大) 细节数据对比,数据属于并发行测试数据,如果测试总数是一百,那么会执行一百次batchStory,一百次findPage 每次执行的条数在之前数据的基础上+1 从形成的折线图看(具体趋势看排名与测试结果) 存储性能对比: lazy、mybatis-flex、mybatis-mp、mybatis、easy-query、sqltoy、beetlSql 更适合并发性数据存储。jpa、db_visitor 处理耗时较长 分页查询性能对比: lazy、mybatis-flex、mybatis-mp、mybatis、easy-query、sqltoy、db_visitor、beetlSql 都比较稳定。jpa 处理时间明显起伏 批量保存: 一万条数据以内 lazy、mybatis-flex、mybatis-mp、mybatis、easy-query、sqltoy、beetlSql、jpa、db_visitor 性能趋于一致 十万数据时,处理时间由快到慢依次是: lazy、mybatis-flex、mybatis-mp、mybatis、easy-query、sqltoy、beetlSql、db_visitor、jpa,其中 db_visitor、jpa 处理时间明显起伏 分页查询: 一万条数据以内 几款ORM均保持在200毫秒内 十万数据时,处理时间由快到慢依次是: sqltoy、db_visitor、easy-query、lazy、beetlSql、mybatis、mybatis-mp、jpa、mybatis-flex 快速数据对比(大数据曲线图) 当前项目地址 lazy-orm地址 mybatis地址 sqltoy地址 mybatis-flex地址 easy-query地址 mybatis-mp地址 dbvisitor地址 beetlsql地址

优秀的个人博客,低调大师

web-spring-boot 高度扩展组件 2.0.0 版本发布 Java web boot 工具

介绍 web Spring Boot低耦合集成的高度扩展组件 cors(跨域配置)、crypto(参数以及加解密)、csrf(csrf攻击)、dict(字典转义)、exception(通用异常)、i18n、 jdk8time 、 log(应用日志)、response(通用结果返回)、sensitive(数据脱敏) 、event消息推送 、 sqlInjection(SQL注入) apiversion(api 版本) 、threadpool(通用线程配置) 、validation(参数验证)、 xss(xss过滤) rest(调用)、 envencrypt(配置文件加密) tree(注解树构造)、strategy(策略模式)、logbackandlog4j2-sensitive sensitive(日志脱敏) 、 通用工具 spring boot 坐标 <dependency> <groupId>cn.xphsc.boot</groupId> <artifactId>web-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency>

优秀的个人博客,低调大师

国产 Java ORM:sqltoy-orm 5.2.95 发版

开源地址: github:https://github.com/sagframe/sagacity-sqltoy gitee:https://gitee.com/sagacity/sagacity-sqltoy idea 插件 (可直接在 idea 中检索安装):https://github.com/threefish/sqltoy-idea-plugins sqltoy 脚手架项目:https://gitee.com/momoljw/sss-rbac-admin sqltoy lambda 项目:https://gitee.com/gzghde/sqltoy-plus 更新内容 1、优化updateByQuery条件属性跟修改属性一致时值被条件属性值覆盖的缺陷 sqltoy-orm 是 JPA 和超强查询的融合体 JPA 部分 类似 JPA 的对象化 CRUD、对象级联加载和新增、更新 强化 update 操作,提供弹性字段修改能力,不同于 hibernate 先 load 后修改,而是一次数据库交互完成修改,确保了高并发场景下数据的准确性 改进了级联修改,提供了先删除或者先置无效,再覆盖的操作选项 增加了 updateFetch、updateSaveFetch 功能,强化针对强事务高并发场景的处理,类似库存台账、资金台账,实现一次数据库交互,完成锁查询、不存在则插入、存在则修改,并返回修改后的结果 增加了树结构封装,便于统一不同数据库树型结构数据的递归查询 支持分库分表、支持多种主键策略 (额外支持基于 redis 的产生特定规则的业务主键)、加密存储、数据版本校验 提供了公共属性赋值 (创建人、修改人、创建时间、修改时间、租户)、扩展类型处理等 提供了多租户统一过滤和赋值、提供了数据权限参数带入和越权校验 查询部分 极为直观的 sql 编写方式,便于从客户端 <--> 代码 双向快速迁移,便于后期变更维护 支持缓存翻译、反向缓存匹配 key 代替 like 模糊查询 提供了跨数据库支持能力:不同数据库的函数自动转换适配,多方言 sql 根据实际环境自动匹配、多数据库同步测试,大幅提升了产品化能力 提供了取 top 记录、随机记录等特殊场景的查询功能 提供了最强大的分页查询机制:1) 自动优化 count 语句;2) 提供基于缓存的分页优化,避免每次都执行 count 查询;3) 提供了独具特色的快速分页;4) 提供了并行分页 提供了分库分表能力 提供了在管理类项目中极为价值的:分组汇总计算、行列转换 (行转列、列转行)、同比环比、树形排序、树形汇总 相关算法自然集成 提供了基于查询的层次化数据结构封装 提供了大量辅助功能:数据脱敏、格式化、条件参数预处理等 支持多种数据库 常规的 mysql、oracle、db2、postgresql、 sqlserver、dm、kingbase、sqlite、h2、 oceanBase、polardb、guassdb、tidb 支持分布式 olap 数据库: clickhouse、StarRocks、greenplum、impala (kudu) 支持 elasticsearch、mongodb 所有基于 sql 和 jdbc 各类数据库查询 sqltoy 特点介绍: sqltoy 的核心构建思想 sqltoy 的对比 mybatis (plus) 的核心点:查询语句编写、可阅读性、可维护性 对象化 crud 是基础,但 sqltoy 有针对性的改进:update、updateSaveFetch、updateFetch 等 sqltoy 的缓存翻译,大幅减少表关联简化 sql,让你的查询性能成几何级提升 极致的分页,同样帮助你实现查询的性能大幅提升 快速分页:@fast () 实现先取单页数据然后再关联查询,极大提升速度 分页优化器:page-optimize 让分页查询由两次变成 1.3~1.5 次 (用缓存实现相同查询条件的总记录数量在一定周期内无需重复查询 sqltoy 的分页取总记录的过程不是简单的 select count (1) from (原始 sql);而是智能判断是否变成:select count (1) from 'from 后语句 ', 并自动剔除最外层的 order by sqltoy 支持并行查询:parallel="true",同时查询总记录数和单页数据,大幅提升性能 便利的跨数据库统计计算:数据旋转 便利的跨数据库统计计算:无限极分组统计 (含汇总求平均) 便利的跨数据库统计计算:同比环比 5、树形表排序汇总 6、扩展集成

优秀的个人博客,低调大师

国产 Java ORM:sqltoy-orm 5.2.92 发版

开源地址: github:https://github.com/sagframe/sagacity-sqltoy gitee:https://gitee.com/sagacity/sagacity-sqltoy idea 插件 (可直接在 idea 中检索安装):https://github.com/threefish/sqltoy-idea-plugins sqltoy 脚手架项目:https://gitee.com/momoljw/sss-rbac-admin sqltoy lambda 项目:https://gitee.com/gzghde/sqltoy-plus 更新内容 1、修复CTE(with as)中含@fast()快速分页且@fast包含union 的极端场景的缺陷 sqltoy-orm 是 JPA 和超强查询的融合体 JPA 部分 类似 JPA 的对象化 CRUD、对象级联加载和新增、更新 强化 update 操作,提供弹性字段修改能力,不同于 hibernate 先 load 后修改,而是一次数据库交互完成修改,确保了高并发场景下数据的准确性 改进了级联修改,提供了先删除或者先置无效,再覆盖的操作选项 增加了 updateFetch、updateSaveFetch 功能,强化针对强事务高并发场景的处理,类似库存台账、资金台账,实现一次数据库交互,完成锁查询、不存在则插入、存在则修改,并返回修改后的结果 增加了树结构封装,便于统一不同数据库树型结构数据的递归查询 支持分库分表、支持多种主键策略 (额外支持基于 redis 的产生特定规则的业务主键)、加密存储、数据版本校验 提供了公共属性赋值 (创建人、修改人、创建时间、修改时间、租户)、扩展类型处理等 提供了多租户统一过滤和赋值、提供了数据权限参数带入和越权校验 查询部分 极为直观的 sql 编写方式,便于从客户端 <--> 代码 双向快速迁移,便于后期变更维护 支持缓存翻译、反向缓存匹配 key 代替 like 模糊查询 提供了跨数据库支持能力:不同数据库的函数自动转换适配,多方言 sql 根据实际环境自动匹配、多数据库同步测试,大幅提升了产品化能力 提供了取 top 记录、随机记录等特殊场景的查询功能 提供了最强大的分页查询机制:1) 自动优化 count 语句;2) 提供基于缓存的分页优化,避免每次都执行 count 查询;3) 提供了独具特色的快速分页;4) 提供了并行分页 提供了分库分表能力 提供了在管理类项目中极为价值的:分组汇总计算、行列转换 (行转列、列转行)、同比环比、树形排序、树形汇总 相关算法自然集成 提供了基于查询的层次化数据结构封装 提供了大量辅助功能:数据脱敏、格式化、条件参数预处理等 支持多种数据库 常规的 mysql、oracle、db2、postgresql、 sqlserver、dm、kingbase、sqlite、h2、 oceanBase、polardb、guassdb、tidb 支持分布式 olap 数据库: clickhouse、StarRocks、greenplum、impala (kudu) 支持 elasticsearch、mongodb 所有基于 sql 和 jdbc 各类数据库查询 sqltoy 特点介绍: sqltoy 的核心构建思想 sqltoy 的对比 mybatis (plus) 的核心点:查询语句编写、可阅读性、可维护性 对象化 crud 是基础,但 sqltoy 有针对性的改进:update、updateSaveFetch、updateFetch 等 sqltoy 的缓存翻译,大幅减少表关联简化 sql,让你的查询性能成几何级提升 极致的分页,同样帮助你实现查询的性能大幅提升 快速分页:@fast () 实现先取单页数据然后再关联查询,极大提升速度 分页优化器:page-optimize 让分页查询由两次变成 1.3~1.5 次 (用缓存实现相同查询条件的总记录数量在一定周期内无需重复查询 sqltoy 的分页取总记录的过程不是简单的 select count (1) from (原始 sql);而是智能判断是否变成:select count (1) from 'from 后语句 ', 并自动剔除最外层的 order by sqltoy 支持并行查询:parallel="true",同时查询总记录数和单页数据,大幅提升性能 便利的跨数据库统计计算:数据旋转 便利的跨数据库统计计算:无限极分组统计 (含汇总求平均) 便利的跨数据库统计计算:同比环比 5、树形表排序汇总 6、扩展集成

优秀的个人博客,低调大师

binlog4j 1.9.0 发布,Java 轻量级 binary log 客户端

Binlog4j - 1.9.0 轻量级 Mysql Binlog 客户端, 提供宕机续读, 高可用集群等特性 更新日志 [新增] BinlogClient 对象 strict 属性,默认为 true,每次更新数据都会匹配最新的表结构。[新增] BinlogClienetConfig 对象新增 hikarConfig 属性,用于自定义数据源连接池配置。[修复] time-offset 属性不生效的问题。[调整] IBinlogEventHandler 接口 isHandle 入参为 database 和 table.[修复] Mysql 账户 perssmion 问题 项目特性 集群模式, 通过集群部署的方式,从而实现服务的高可用。 宕机续读, 避免宕机期间造成数据丢失, 保证数据一致性。 支持 传统项目 与 Spring Boot 项目集成, 同时兼容 Spring Boot 2.x 与 3.x 版本。 数据转换, 基于 IBinlogEventHandler 的泛型参数, 提供自动的数据转换。 下载安装 <dependency> <groupId>com.gitee.Jmysy</groupId> <artifactId>binlog4j-core</artifactId> <version>latest.version</version> </dependency> 或 implementation group: 'com.gitee.Jmysy', name: 'binlog4j-core', version: 'latest.version' 简单使用 通过 BinlogClient 创建 binlog 客户端, IBinlogEventHandler 为 binlog 事件的通知, 配置 host 中的所有数据变化, 都将会被推送到 onUpdate, onDelete, onInsert 接口。 isHandle 为 1.4.0 新增, 用于判定当前 handler 是否需要被执行, 你可以用过 BinlogEvent 获取到 database 和 table 判定依据。 public class BootStrap { public static void main(String[] args) { BinlogClientConfig clientConfig = new BinlogClientConfig(); clientConfig.setHost("127.0.0.1"); clientConfig.setPort(3306); clientConfig.setUsername("root"); clientConfig.setPassword("taoren@123"); clientConfig.setServerId(1990); IBinlogClient binlogClient = new BinlogClient(clientConfig); binlogClient.registerEventHandler(new IBinlogEventHandler() { @Override public void onInsert(BinlogEvent event) { System.out.println("插入数据:{}", event.getData()); } @Override public void onUpdate(BinlogEvent event) { System.out.println("修改数据:{}", event.getData()); } @Override public void onDelete(BinlogEvent event) { System.out.println("删除数据:{}", event.getData()); } @Override public boolean isHandle(String database, String table) { return database.equals("pear-admin") && table.equals("sys_user"); } }); binlogClient.connect(); } } 注销事件 通过 registerEventHandler 的重载方法注册具名处理器, 调用 unregisterEventHandler 注销指定 eventName 的处理器。 IBinlogClient binlogClient = new BinlogClient(clientConfig); binlogClient.registerEventHandler("eventName", new CustomBinlogEventHandler()); binlogClient.unregisterEventHandler("eventName"); 宕机续读 防止宕机期间的数据丢失, 从而保证数据一致性, persistence[boolean] 为此而生。你可以通过设置 true 来开启, 每次处理 binlog event 时, binlog4j 都将会 当前的消费进度记录到 Redis 中, 从而在下次启动时实现续读。 RedisConfig redisConfig = new RedisConfig(); redisConfig.setHost("127.0.0.1"); redisConfig.setPort(6379); redisConfig.setPassword("taoren@123"); BinlogClientConfig clientConfig = new BinlogClientConfig(); clientConfig.setRedisConfig(redisConfig); // Redis 配置 clientConfig.setPersistence(true); // 开启续读 PS: persistence 的功能实现依赖于 Redis 中间件, 在开启时, 你需要提供 RedisConfig 的配置。 集群模式 在实际应用场景中, 为了提供服务的可用性, 服务常常以集群的方式呈现。在 binlog4j 中, 你可以通过 mode 配置, 开启 cluster(集群) 模式, 默认为 standalone(单机)。 cluster 模式借助 Redisson 实现, RedisConfig 不可或缺。需要注意的是, 不同的集群你需要保证 serverId 配置的唯一性。 RedisConfig redisConfig = new RedisConfig(); redisConfig.setHost("127.0.0.1"); redisConfig.setPort(6379); redisConfig.setPassword("taoren@123"); BinlogClientConfig clientConfig = new BinlogClientConfig(); clientConfig.setRedisConfig(redisConfig); // Redis 配置 clientConfig.setMode(BinlogClientMode.cluster); // 集群模式 泛型参数 在 BinlogEvent 中 data 与 originalData 的 Class 类型为 Map<String, Object>, 为进一步降低使用的心智负担, IBinlogEventHandler 接口提供了泛型参数的支持, binlog4j 将依据泛型参数, 将 接收到的数据转换为 JavaBean。 public class UserBinlogEventHandler implements IBinlogEventHandler<User> { @Override public void onInsert(BinlogEvent<User> event) { System.out.println("插入数据:" + event.getData()); } @Override public void onUpdate(BinlogEvent<User> event) { System.out.println("修改数据:" + event.getData()); } @Override public void onDelete(BinlogEvent<User> event) { System.out.println("删除数据:" + event.getData()); } @Override public boolean isHandle(String database, String table) { return database.equals("pear-admin") && table.equals("sys_user"); } } bit -> BitSet | Boolean | boolean text | longtext -> String datetime -> Date | LocalDate | LocalDateTime | LocalTime .... 快速启动 为了进一步简化 binlog4j 在 Spring Boot 项目中的使用, 我们提供了 binlog4j-spring-boot-starter 包, 它将帮助你在 Spring Boot 中快速集成。 <dependency> <groupId>com.gitee.Jmysy</groupId> <artifactId>binlog4j-spring-boot-starter</artifactId> <version>latest.version</version> </dependency> 或 implementation group: 'com.gitee.Jmysy', name: 'binlog4j-spring-boot-starter', version: 'latest.version' 首先, 在 application.yml / application.properties 中编写 binlog4j 所需配置 spring: binlog4j: redis-config: host: 127.0.0.1 port: 6379 password: taoren@123 client-configs: master: username: root password: taoren@123 host: 127.0.0.1 port: 3306 serverId: 1990 slave: username: root password: taoren@123 host: 127.0.0.1 port: 3307 serverId: 1991 在 Spring Boot 中存在多个 client 的概念,通过 @BinlogSubscriber 注解指定 handler 绑定的客户端, 本质上它代替了 binlogClient.registerEventHandler(IBinlogEventHandler)。 @BinlogSubscriber(clientName = "master") public class UserEventHandler implements IBinlogEventHandler<User> { @Override public void onInsert(BinlogEvent<User> event) { System.out.println("插入数据:" + event.getData()); } @Override public void onUpdate(BinlogEvent<User> event) { System.out.println("修改数据:" + event.getData()); } @Override public void onDelete(BinlogEvent<User> event) { System.out.println("删除数据:" + event.getData()); } @Override public boolean isHandle(String database, String table) { return database.equals("pear-admin") && table.equals("sys_user"); } } 配置说明 timeOffset 时间偏移量, 单位:毫秒 serverId 编号 redisConfig Redis 配置信息, 详见 RedisConfig inaugural 首次启动, 如果为 true 在启动时不再读取 Redis 记录 persistence 是否启用持久化, 默认为 false strict 严格模式, 默认为 true mode 模式, 详见: BinlogClientMode username 数据库账户 password 数据库密码 host 数据库所在服务器 IP 地址 port 数据库占用端口, 默认 3306 hikariConfig 数据库连接池配置

优秀的个人博客,低调大师

高效数据传输:Java通过绑定快速将数据导出至Excel

摘要:本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 把数据导出至 Excel 是很常见的需求,而数据的持久化,往往又放在数据库中。因此把数据库中的数据导出到 Excel中,成了非常普遍的一个需求。 以关系型数据库为例,数据表是一个二维矩阵,但是为了易于操作和维护,在数据读取中,都会定义类,并且以对象的形式在内存中存放数据。但是Excel的工作表又是另一个二维矩阵,这就意味着,从数据库读取出的对象数据,又需要循环写入另一个表格中,这使得代码难以维护。 为了解决数据不易维护的问题,可以给工作表,单元格或者表格设置对象及单元格的绑定关系,这样在保存时便可以根据数据源的绑定关系,自动填充数据。 具体实现方法 现有数据类如下: public static class SalesRecord { public int sales; public String productType; public String product; public String salesman; public String area; } public static class SalesData { public ArrayList records; } 样本数据如下: private SalesData getDataSource() { // 创建数据源 SalesData datasource = new SalesData(); datasource.records = new ArrayList(); // 添加数据 SalesRecord record1 = new SalesRecord(); record1.area = "NorthChina"; record1.salesman = "Hellen"; record1.product = "Apple"; record1.productType = "Fruit"; record1.sales = 120; datasource.records.add(record1); SalesRecord record2 = new SalesRecord(); record2.area = "NorthChina"; record2.salesman = "Hellen"; record2.product = "Banana"; record2.productType = "Fruit"; record2.sales = 143; datasource.records.add(record2); SalesRecord record3 = new SalesRecord(); record3.area = "NorthChina"; record3.salesman = "Hellen"; record3.product = "Kiwi"; record3.productType = "Fruit"; record3.sales = 322; datasource.records.add(record3); return datasource; } 1.数据源绑定至工作表 下面是给工作表设置数据源绑定的代码,其中setAutoGenerateColumns设置为false,当setAutoGenerateColumns为true 时,工作表会根据数据源自动生成列。 public void SheetBinding() { // 创建一个新的workbook Workbook workbook = new Workbook(); // 获取默认sheet IWorksheet worksheet = workbook.getWorksheets().get(0); SalesData datasource = getDataSource(); // 自动生成列设置为false worksheet.setAutoGenerateColumns(false); // 给工作表中的每一列绑定数据源 worksheet.getRange("A:A").getEntireColumn().setBindingPath("area"); worksheet.getRange("B:B").getEntireColumn().setBindingPath("salesman"); worksheet.getRange("C:C").getEntireColumn().setBindingPath("product"); worksheet.getRange("D:D").getEntireColumn().setBindingPath("productType"); worksheet.getRange("E:E").getEntireColumn().setBindingPath("sales"); // 设置数据源 worksheet.setDataSource(datasource.records); // 保存为Excel文件 workbook.save("output/SheetBinding.xlsx"); } 实现效果如下: 2.数据源绑定至单元格 // 创建workbook Workbook workbook = new Workbook(); // 获取默认的sheet IWorksheet worksheet = workbook.getActiveSheet(); // 添加数据 SalesRecord record = new SalesRecord(); record.area = "北方"; record.salesman = "李强"; record.product = "苹果"; record.productType = "水果"; record.sales = 120; // 给单元格设置绑定 worksheet.getRange("A1").setBindingPath("area"); worksheet.getRange("B2").setBindingPath("salesman"); worksheet.getRange("C2").setBindingPath("product"); worksheet.getRange("D3").setBindingPath("productType"); // 设置数据源 worksheet.setDataSource(record); // 保存为Excel workbook.save("output/CellBinding.xlsx"); 实现效果如下: 3.数据源绑定至表格 下面的代码使用了setExpandBoundRows ,ITable.setExpandBoundRows方法用来处理一个绑定的表格对数据源的更改该如何响应。当属性设置为true时,该绑定表格会使用整行操作自动调整行数以适应数据源更改。 // 创建workbook Workbook workbook = new Workbook(); // 获取默认的sheet IWorksheet worksheet = workbook.getActiveSheet(); SalesData datasource = getDataSource(); // 添加一个表格 ITable table = worksheet.getTables().add(worksheet.getRange("B2:F5"), true); // 设置表格,不自动生成列 table.setAutoGenerateColumns(false); // 给表格设置绑定path table.setBindingPath("records"); // 设置setExpandBoundRows为true, table.setExpandBoundRows(true); // 设置表格列的数据字段 table.getColumns().get(0).setDataField("area"); table.getColumns().get(1).setDataField("salesman"); table.getColumns().get(2).setDataField("product"); table.getColumns().get(3).setDataField("productType"); table.getColumns().get(4).setDataField("sales"); // 设置数据源 worksheet.setDataSource(datasource); // 保存为excel workbook.save("output/TableBinding.xlsx"); 实现效果如下: 总结 通过给工作表、单元格或表格设置数据源绑定关系,可以实现将数据库中的数据导出到Excel的功能。这种方法使用对象和属性的绑定关系,将内存中的数据源与Excel中的工作表、单元格或表格进行连接。这样,在保存数据时,只需要根据数据源的绑定关系自动填充数据,而无需手动循环写入。这种实现方式简化了代码,提高了代码的可维护性和可扩展性。同时,通过设置自动生成列、设置绑定路径以及处理数据源变化等操作,还可以进一步增强导出功能的灵活性和适应性。总的来说,这种数据源绑定的方法为数据导出提供了一种优雅而高效的解决方案。 扩展链接: 从表单驱动到模型驱动,解读低代码开发平台的发展趋势 低代码开发平台是什么? 基于分支的版本管理,帮助低代码从项目交付走向定制化产品开发

优秀的个人博客,低调大师

JeeSite V5.5.0 发布,升级 Antd v4.0,Java 快速开发平台

升级内容 升级 spring boot 2.7.14、justauth 1.16.5、antdv 4.0.0 调整 语法 html 和 js 编写不同的占位符,减少IDE标红提示 新增 支持数据源独立设置XA开关,如 jdbc.数据源名.xa: false 新增 当前用户展示子系统列表过滤,进入角色管理中配置包含系统 新增 js ajax 下载 clearParams 参数,可清理掉不需要添加的请求参数 优化 子系统,角色增加包含系统参数,切换系统时只需展示当前用户包含的子系统 优化 fileupload 增加缩略图生成设置,前端组件可使用 imageThumbName 使用缩略图 优化 fileupload 使用 returnPath 时的下载还原原始文件名 优化 翰高数据库有原来的 oracle 语法换为原生 postgresql 语法 优化 导出,查询后默认不添加 pageNo 参数 优化 界面,默认隐藏表单右上角按钮 修正 jquery migrate 版本,处理ie9下的一些兼容问题 修正 GBase 数据库,多余的 remarksReporting 属性问题,支持设置为空 修正 SqlServer2012 驱动下初始化库报 OFFSET 错误问题 修正 树表更新子节点状态,字段名错误问题(所有版本) 修正 初始化库的时候 area 表没有插入数据问题 优化 用户头像获取接口,排除 http 的地址,不增加 ctxPath 其它细节更多改进... Vue分离端 升级 antdv4.0.0、vite4.4.9 等等 新增 ListSelect 组件 queryParams 参数 新增 Upload 组件 图片最大宽高的压缩参数 新增 Upload 组件 缩略图生成预览参数支持 新增 对话框弹窗、路由页签的弹窗表单例子 新增 downloadByUrl post 带参数下载文件 新增 iframe 支持 query 参数接受 新增 BpmButton initialize 事件 优化 国际化语言包完善(用户组织公司岗位个人中心) 优化 在线用户列表查询换 Switch 组件 优化 权限类型的菜单也可以设置组件名称 优化 升级 antdv4 后的整体配色、布局等细节 简化 视图组件名称,直接通过 name 统一设置 修正 解决 Radio 组件 onChange 调用 2 次的问题 升级方法 修改pom.xml文件中的jeesite-parent版本号为5.5.0-SNAPSHOT 如果你修改了parent、common、core项目源码,请与git上的代码进行同步 如果你是跨版本升级,请注意每一个版本的升级方法,业务上有调整的地方进行修改 关于 Beetl 语法 html 和 js 编写不同的占位符,查找替换方法(使用正则表达式、全字匹配): \$\{@DictUtils\.getDictListJson\(\'(.+?)\'\)\}替换为"#\{@DictUtils\.getDictListJson\(\'$1\'\)\}" \$\{toJson\((.+?)\)\}替换为"#\{toJson\($1\)\}" \/\/\<\% (.+?) \%\>替换为//# $1 执行root/package.bat(sh)打包脚本,强制更新依赖。 Vue分离端升级 请与jeesite-vue代码仓库源码进行同步,合并代码,手动解决冲突代码。 Antdv 4.0 相比 3.2 改动还是比较大的,遗弃和修改了很多内容,但是您也无需担心升级的问题 由于 JeeSite 封装了各种业务组件,所以业务代码上变化不是很大,您对 JeeSite 改动越少,升级越容易 请先了解 Ant Design Vue 4.0 的升级指南:https://antdv.com/docs/vue/migration-v4-cn(opens new window) 全局替换,匹配文件*.vue,*.ts,*.tsx(区分大小写、全字匹配,注意排除掉 css、sys.ts 文件): dropdownClassName替换为popupClassName visible替换为open 关于 antdv4 样式 less 替换 CSS-in-JS 实现动态主题 为了方便升级 jeesite 保留了 less,减少升级难度 同时支持 CSS-in-JS 提供更好的动态主题支持 业务中的样式可通过 css and 选择器,可覆盖 antdv 中的样式 匹配后端版本为JeeSite v5.5.0 了解更多 JeeSite 官网地址:http://jeesite.com JeeSite 在线文档:http://docs.jeesite.com JeeSite 演示地址:http://demo.jeesite.com JeeSite Vue 演示地址:http://vue.jeesite.com JeeSite 源码仓库:https://gitee.com/thinkgem/jeesite4 JeeSite Vue 前端源码:https://gitee.com/thinkgem/jeesite-vue JeeSite 跨平台手机端:https://gitee.com/thinkgem/jeesite4-uniapp JeeSite Cloud 微服务:https://gitee.com/thinkgem/jeesite4-cloud JeeSite 客户端安装程序:https://gitee.com/thinkgem/jeesite-client

优秀的个人博客,低调大师

Binlog4j 1.2.0 发布,Java 轻量级 Binary Log 客户端

Binlog4j 轻量级 Mysql Binlog 客户端, 提供宕机续读, 高可用集群等特性 项目特性 集群模式, 通过集群部署的方式,保证服务高可用。 宕机续读, 避免宕机期间造成数据丢失。 数据转换, 基于泛型封装 binlog Event 的序列化数据。 兼容 传统项目 与 Spring Boot / Cloud 项目。 兼容 Spring Boot 2.x 与 Spring Boot 3.x 版本。项目特性 更新日志(1.2.0) [新增] BinlogClient 类 connect 方法日志打印。[新增] Binlog4jException.class 代替 RuntimeException.class 异常处理。[新增] binlog4j-spring-boot-starter 包 spring.binlog4j.enabled 配置, 默认为 true。[新增] GsonUtils 工具类到 utils 包 , 提供 Gson 方法。[升级] spring-boot 到 2.7.14 版本。[升级] redisson 到 3.23.3 版本。[升级] gson 到 2.10.1 版本。[升级] jedis 到 4.4.3 版本 下载安装 <dependency> <groupId>com.gitee.Jmysy</groupId> <artifactId>binlog4j-core</artifactId> <version>latest.version</version> </dependency> 或 implementation group: 'com.gitee.Jmysy', name: 'binlog4j-core', version: 'latest.version' 简单使用 通过 BinlogClient 创建 binlog 客户端, IBinlogEventHandler 用于接受 binlog 事件通知, 该接口允许使用泛型, 数据将遵循驼峰规则进行封装。 public class BootStrap { public static void main(String[] args) { BinlogClientConfig clientConfig = new BinlogClientConfig(); clientConfig.setHost("127.0.0.1"); clientConfig.setPort(3306); clientConfig.setUsername("root"); clientConfig.setPassword("taoren@123"); clientConfig.setServerId(1990); IBinlogClient binlogClient = new BinlogClient(clientConfig); binlogClient.registerEventHandler("database", "table", new IBinlogEventHandler() { @Override public void onInsert(BinlogEvent event) { System.out.println("插入数据:{}", event.getData()); } @Override public void onUpdate(BinlogEvent event) { System.out.println("修改数据:{}", event.getData()); } @Override public void onDelete(BinlogEvent event) { System.out.println("删除数据:{}", event.getData()); } }); binlogClient.connect(); } } 高级特性 通过 Persistence 配置为 true 启用宕机续读功能, Binlog4j 会将 binlog 的 filename 与 position 记录到 redis, 所以同时你需要设置 Redis 配置。 public class BootStrap { public static void main(String[] args) { RedisConfig redisConfig = new RedisConfig(); redisConfig.setHost("127.0.0.1"); redisConfig.setPort(6379); redisConfig.setPassword("taoren@123"); BinlogClientConfig clientConfig = new BinlogClientConfig(); clientConfig.setHost("127.0.0.1"); clientConfig.setPort(3306); clientConfig.setUsername("root"); clientConfig.setPassword("taoren@123"); clientConfig.setServerId(1990); // Client 编号 clientConfig.setRedisConfig(redisConfig); // Redis 配置 clientConfig.setPersistence(true); // 启用持久化 (宕机重启后, 从上次读取的位置开始) clientConfig.setMode(BinlogClientMode.cluster); // 高可用集群 BinlogClient binlogClient = new BinlogClient(clientConfig); binlogClient.registerEventHandler("database", "table", new IBinlogEventHandler<User>() { @Override public void onInsert(BinlogEvent<User> event) { System.out.println("插入数据:{}", event.getData()); } @Override public void onUpdate(BinlogEvent<User> event) { System.out.println("修改数据:{}", event.getData()); } @Override public void onDelete(BinlogEvent<User> event) { System.out.println("删除数据:{}", event.getData()); } }); binlogClient.connect(); } } Spring Boot Starter <dependency> <groupId>com.gitee.Jmysy</groupId> <artifactId>binlog4j-spring-boot-starter</artifactId> <version>latest.version</version> </dependency> 或 implementation group: 'com.gitee.Jmysy', name: 'binlog4j-spring-boot-starter', version: 'latest.version' 首先, 在 application.yml 中填写 BinlogClient 配置 spring: binlog4j: redis-config: host: 127.0.0.1 port: 6379 password: taoren@123 client-configs: master: username: root password: taoren@123 host: 127.0.0.1 port: 3306 serverId: 1990 单表监听 使用 @BinlogSubscriber 注解, 指定 IBinlogEventHandler 需要注册到哪个客户端, 并且指定监听的 database 与 table。 @BinlogSubscriber(clientName = "master", database = "pear-admin", table ="sys_user") public class UserEventHandler implements IBinlogEventHandler<User> { @Override public void onInsert(BinlogEvent<User> event) { System.out.println("插入数据:" + event.getData()); } @Override public void onUpdate(BinlogEvent<User> event) { System.out.println("修改数据:" + event.getData()); } @Override public void onDelete(BinlogEvent<User> event) { System.out.println("删除数据:" + event.getData()); } } 多表监听 @BinlogSubscriber 注解 database 与 table 属性支持 Pattern 匹配, IBinlogEventHandler 在不指定泛型的情况下, event.getData() 为 Map<String, Object> 类型, 用于兼容不同表的数据结构。 @BinlogSubscriber(clientName = "master", database = ".*", table ="sys.*") public class UserEventHandler implements IBinlogEventHandler { @Override public void onInsert(BinlogEvent event) { System.out.println("数据库:" + event.getDatabase()); System.out.println("数据表:" + event.getTable()); System.out.println("新数据:" + event.getData()); } @Override public void onUpdate(BinlogEvent event) { System.out.println("数据库:" + event.getDatabase()); System.out.println("数据表:" + event.getTable()); System.out.println("原数据:" + event.getOriginalData()); System.out.println("新数据:" + event.getData()); } @Override public void onDelete(BinlogEvent event) { System.out.println("数据库:" + event.getDatabase()); System.out.println("数据表:" + event.getTable()); System.out.println("新数据:" + event.getData()); } } 监听 master 数据源所有数据库中所有表的数据变化【最灵活】 @BinlogSubscriber(clientName = "master") 监听 master 数据源 pear-admin 数据库中所有表的数据变化 @BinlogSubscriber(clientName = "master", database="pear-admin") 监听 master 数据源 pear-admin 数据库中 user 表的数据变化 @BinlogSubscriber(clientName = "master", database="pear-admin", table="user") 监听 master 数据源所有数据库中 user 表的数据变化 @BinlogSubscriber(clientName = "master", table="user") 监听 master 数据源所有数据库中以 user 开头的表的数据变化 @BinlogSubscriber(clientName = "master", table="user.*")

优秀的个人博客,低调大师

binlog4j 1.1.0 发布,Java 轻量级 MySQL Binlog 客户端

Binlog4j 轻量级 Mysql Binlog 客户端, 提供宕机续读, 高可用集群等特性 项目特性 集群模式, 通过集群部署的方式,保证服务高可用。 宕机续读, 避免宕机期间造成数据丢失。 数据转换, 基于泛型封装 binlog Event 的序列化数据。 兼容 传统项目 与 Spring Boot / Cloud 项目。 兼容 Spring Boot 2.x 与 Spring Boot 3.x 版本。 更新内容(1.1.0) [破坏] IBinlogEventHandler 接口入参由 T 调整为 BinlogEvent。[新增] @BinlogSubscriber 注解 database 与 table 属性 pattern 匹配。[新增] @BinlogSubscriber 注解 database 与 table 属性默认值为 .*。[移动] BinlogUtils 包路径为 com.gitee.Jmysy.binlog4j.core.utils。[新增] PatternUtils 内置工具 Class 下载安装 <dependency> <groupId>com.gitee.Jmysy</groupId> <artifactId>binlog4j-core</artifactId> <version>latest.version</version> </dependency> 或 implementation group: 'com.gitee.Jmysy', name: 'binlog4j-core', version: 'latest.version' 简单使用 通过 BinlogClient 创建 binlog 客户端, IBinlogEventHandler 用于接受 binlog 事件通知, 该接口允许使用泛型, 数据将遵循驼峰规则进行封装。 public class BootStrap { public static void main(String[] args) { BinlogClientConfig clientConfig = new BinlogClientConfig(); clientConfig.setHost("127.0.0.1"); clientConfig.setPort(3306); clientConfig.setUsername("root"); clientConfig.setPassword("taoren@123"); clientConfig.setServerId(1990); IBinlogClient binlogClient = new BinlogClient(clientConfig); binlogClient.registerEventHandler("database", "table", new IBinlogEventHandler() { @Override public void onInsert(BinlogEvent event) { System.out.println("插入数据:{}", event.getData()); } @Override public void onUpdate(BinlogEvent event) { System.out.println("修改数据:{}", event.getData()); } @Override public void onDelete(BinlogEvent event) { System.out.println("删除数据:{}", event.getData()); } }); binlogClient.connect(); } } 高级特性 通过 Persistence 配置为 true 启用宕机续读功能, Binlog4j 会将 binlog 的 filename 与 position 记录到 redis, 所以同时你需要设置 Redis 配置。 public class BootStrap { public static void main(String[] args) { RedisConfig redisConfig = new RedisConfig(); redisConfig.setHost("127.0.0.1"); redisConfig.setPort(6379); redisConfig.setPassword("taoren@123"); BinlogClientConfig clientConfig = new BinlogClientConfig(); clientConfig.setHost("127.0.0.1"); clientConfig.setPort(3306); clientConfig.setUsername("root"); clientConfig.setPassword("taoren@123"); clientConfig.setServerId(1990); // Client 编号 clientConfig.setRedisConfig(redisConfig); // Redis 配置 clientConfig.setPersistence(true); // 启用持久化 (宕机重启后, 从上次读取的位置开始) clientConfig.setMode(BinlogClientMode.cluster); // 高可用集群 BinlogClient binlogClient = new BinlogClient(clientConfig); binlogClient.registerEventHandler("database", "table", new IBinlogEventHandler<User>() { @Override public void onInsert(BinlogEvent<User> event) { System.out.println("插入数据:{}", event.getData()); } @Override public void onUpdate(BinlogEvent<User> event) { System.out.println("修改数据:{}", event.getData()); } @Override public void onDelete(BinlogEvent<User> event) { System.out.println("删除数据:{}", event.getData()); } }); binlogClient.connect(); } } Spring Boot Starter <dependency> <groupId>com.gitee.Jmysy</groupId> <artifactId>binlog4j-spring-boot-starter</artifactId> <version>latest.version</version> </dependency> 或 implementation group: 'com.gitee.Jmysy', name: 'binlog4j-spring-boot-starter', version: 'latest.version' 首先, 在 application.yml 中填写 BinlogClient 配置 spring: binlog4j: redis-config: host: 127.0.0.1 port: 6379 password: taoren@123 client-configs: master: username: root password: taoren@123 host: 127.0.0.1 port: 3306 serverId: 1990 使用 @BinlogSubscriber 注解, 指定 IBinlogEventHandler 需要注册到哪个客户端, 并且指定监听的 database 与 table。 @BinlogSubscriber(clientName = "master", database = "pear-admin", table ="sys_user") public class UserEventHandler implements IBinlogEventHandler<User> { @Override public void onInsert(BinlogEvent<User> event) { System.out.println("插入数据:" + event.getData()); } @Override public void onUpdate(BinlogEvent<User> event) { System.out.println("修改数据:" + event.getData()); } @Override public void onDelete(BinlogEvent<User> event) { System.out.println("删除数据:" + event.getData()); } } 多表监听, database 与 table 使用 Pattern 匹配, 泛型不应该再被使用, data 默认为 Map<String, Object> 类型 @BinlogSubscriber(clientName = "master", database = ".*", table ="sys.*") public class UserEventHandler implements IBinlogEventHandler<User> { @Override public void onInsert(BinlogEvent<User> event) { System.out.println("数据库:" + event.getDatabase()); System.out.println("数据表:" + event.getTable()); System.out.println("新数据:" + event.getData()); } @Override public void onUpdate(BinlogEvent<User> event) { System.out.println("数据库:" + event.getDatabase()); System.out.println("数据表:" + event.getTable()); System.out.println("原数据:" + event.getOriginalData()); System.out.println("新数据:" + event.getData()); } @Override public void onDelete(BinlogEvent<User> event) { System.out.println("数据库:" + event.getDatabase()); System.out.println("数据表:" + event.getTable()); System.out.println("新数据:" + event.getData()); } }

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册