首页 文章 精选 留言 我的

精选列表

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

🔥 xbatis ORM 框架 1.9.0 正式发布,一款好用、简单、便捷的框架!!

1.9.0 更新内容: 1:增加插入监听器@OnInsert 2:增加更新监听器@OnUpdate 3:增强复杂 mybatis resultMap 类的兼容性 4:增强 xml 分页 5:增加对象转条件(支持关键字多列 or 查询) 6:增强内嵌 exists、notExists 方法 1.8.7 更新内容: 1:为了更好的 JAVA+XML 结合,query 和 where 增加 tableAs (实体类,别名) 方法,用于自定义表名别名 2:XbatisConfig 改为 XbatisGlobalConfig 3:增加逻辑删除拦截器 4:updatedelete增加 原生 RETURNING (原生) 功能 5:增加原生 sql 查询方法和update delete RETURNING 功能 6:增加了一个Mapper 方法拦截器 7:增加exists/not exists 简易写法 通用 SQL 扩展: //类型支持 实体类,VO和普通POJO SysUser user = sysUserMapper.select(SysUser.class, "select * from t_sys_user where id =?", 1); //支持增删改,且支持返回数据 String user_name = sysUserMapper.executeAndReturning(String.class, "update t_sys_user set user_name=? where id=1 RETURNING user_name", "xxx"); //ORM写法 删除并返回被删除的数据(数据库原生操作) List<SysUser> list = DeleteChain.of(sysUserMapper) .in(SysUser::getId, 1, 2) .returning(SysUser.class) .returnType(SysUser.class) .executeAndReturningList(); //ORM写法 修改并返回修改后的数据(数据库原生操作)适合金额加减操作返回剩余金额 SysUser sysUser = UpdateChain.of(sysUserMapper) .eq(SysUser::getId, 1) .set(SysUser::getUserName, "abc2") .returning(SysUser.class) .returnType(SysUser.class) .executeAndReturning(); 分表配置 @Data @SplitTable(SysUserSplitter.class) public class SysUser { @TableId private Integer id; @SplitTableKey private Integer groupId; private String nickname; private String username; } public class SysUserSplitter implements TableSplitter { @Override public boolean support(Class<?> type) { return type == Integer.class || type == int.class; } @Override public String split(String sourceTableName, Object splitValue) { Integer groupId = (Integer) splitValue; //分成10个表 return sourceTableName + "_" + groupId % 10; } } 分表就是这么简单,其他操作和常规无异!!! 1.7.7 更新内容: 1:QueryChain,DeleteChain,InsertChain,UpdateChain 支持 BasicMapper 方法 2:支持通用 BasicMapper,可不需要创建多个实体类 Mapper;一个 BasicMapper 即可使用所有功能 3:正式支持单 Mapper (写一个 Mapper 即可) 为什么推荐 xbatis?: xbatis 是一款超级强大的 ORM 框架 1:可多表 join(不再只能单表了) 2:代码分页,xml 还可以分页(可以不用 pagehelper 了) 3:良好的扩展能力:orm+sql 模板 (让 ORM 框架不再死板,扩展性极强) 4:强大的各种数据库适配,可在一套代码中 实现多个数据库适配;真正的 ORM hibernate 都做不到 6:极简的 api 设计,让开发者 不再迷糊 1.单表 +@Fetch 注解 + fetchFilter 方法 @Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; private String password; private Integer roleId; private LocalDateTime create_time; @Fetch(source = SysUser.class, property = "roleId", target = SysRole.class, targetProperty = "id") private List<SysRoleVo> sysRoles; } List<SysUserVO> list = QueryChain.of(sysUserMapper) .from(SysUser.class) .fetchFilter(SysUserVO::getRoles,where->where.eq(SysRole::getStatus,1)) .returnType(SysUserVO.class) .list(); fetchFilter 方法是对 @Fetch 注解的增强,没有特殊要求一般,可忽略 2. 单表查询 SysUser sysUser = QueryChain.of(sysUserMapper) .eq(SysUser::getId, 1) .eq(SysUser::getUserName,'admin') .get(); 3.VO 映射 @Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; //字段名字不一样时 @ResultEntityField(property = "password") private String pwd; } SysUserVO sysUserVO = QueryChain.of(sysUserMapper) .eq(SysUser::getId, 1) .eq(SysUser::getUserName,'admin') .returnType(SysUserVO.class) .list(); 4. join 查询 @Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; //字段名字不一样时 @ResultEntityField(property = "password") private String pwd; //映射一个对象 1对1 @NestedResultEntity(target = SysRole.class) prviate SysRole sysRole; //映射多个对象 1对多 @NestedResultEntity(target = SysRole.class) prviate List<SysRole> sysRoles; } List<SysUserRoleVO> list = QueryChain.of(sysUserMapper) .from(SysUser.class) .join(SysUser.class, SysRole.class) .returnType(SysUserRoleVO.class) .list(); 还有很多很多超级方便有趣的写法,欢迎大家来使用https://xbatis.cn 例如: 1 . 多表 join A 内嵌 B B 内嵌 C 都可以 2 . 不使用 join 使用 @Fetch 注解 + fetchFilter 方法实现 将 A JOIN B 变成 query A + query B 3 . 使用 @Paging 注解 实现你的 xml 自动分页 4 . 使用 SQL 模板,让你 ORM 更简单更容易扩展,再也不怕被框架限制了

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

老用户快速从经典网络迁移VPC,阿里云提供便捷解决方案

近日,阿里云宣布推出经典网络迁移VPC完整解决方案,帮忙云上老用户平滑迁移到VPC。 阿里云起步于经典网络,但已经全面转向VPC。专有网络VPC(Virtual Private Cloud)以其在安全、成本和网络功能方面的优势,正受到越来越多用户的欢迎,已经成为云上用户的首选网络类型,也是阿里云默认推荐的网络类型。然而,云上还有很多存量用户在使用经典网络,为了帮助这些用户从经典网络迁移到VPC,阿里云提供了如下完整的解决方案。 更多信息请访问:经典网络迁移VPC[https://yq.aliyun.com/articles/107616]() 方案概述阿里云提供了三种迁移方案。这三种方案可以独立使用,也可以组合使用,以满足不同的迁移场景。混挂和混访方案ClassicLink方案单ECS迁移方案• 混挂和混访方案混挂和混访方案是一种

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

Dante Cloud 3.5.7.0 发布,微服务也支持从 Session 便捷获取用户信息了

[一] 项目简介 Dante Cloud 国内首个支持阻塞式和响应式服务并行的、开箱即用的企业级云原生微服务基座。是采用领域驱动模型(DDD)设计思想,以「高质量代码、低安全漏洞」为核心,基于 Spring 生态全域开源技术,高度模块化和组件化设计,支持智能电视、IoT等物联网设备认证,满足国家三级等保要求,支持接口国密数字信封加解密等一系列安全体系的一站式多租户微服务解决方案。独创的可以“一套代码实现微服务和单体两种架构灵活切换”的企业级应用系统。 1、项目理念 Dante Cloud 一直秉承着“简洁、高效、包容、务实”的理念,使用微服务领域及周边相关的各类新兴技术或主流技术进行建设,不断地深耕细作、去粗取精、用心打造。目标是构建一款代码质量高、维护投入低、安全防护强的微服务基座,可以帮助用户快速跨越架构技术选型、技术研究探索、基础架构搭建阶段,直接聚焦业务开发。极大地降低传统项目中因安全漏洞、技术负债、低质代码等潜在隐患所产生的高维护投入。期望像项目名字寓意一样,构建一套可以在在行业变革的时期承上启下,助力企业信息化建设和数字化转型的产品。 Dante Cloud 核心关注点是:「高质量的系统代码」、「合理的系统架构」、「低耦合的模块划分」、「高安全性系统实现」、「灵活的功能扩展能力」,「优质的微服务防范」。不会像其它一些系统一样,追求 业务功能 的 丰富 性。堆叠大量无法做到真正通用的功能,反倒会成为负担和干扰,不如由用户自己按照需求灵活设计和实现。 2、架构设计 Dante Cloud 优秀的模块化能力,为系统提供了高度灵活的配置能力、功能的“可插拔”能力 以及不同需求场景的适配能力。正因为优秀的模块化体系,使得 Dante Cloud 不仅是一套完整的微服务架构,还是一套高质量的 「单体模块化」 系统。这里的微服务架构和单体架构并不是分离的两套代码,也不是分离的两个项目。而是完全融合的一整套代码,使用时可以根据需要选择是以微服务模式或者单体模式运行,配合灵活的模块能力,实现系统的多样化定制和功能的管控。 这是 Dante Cloud 微服务最大的特色之一:“一套代码、两种架构”。可以帮助企业在项目早期以单体架构快速建设项目、方便开发人员在本地进行开发以及新技术研究。在项目后期随着用户规模增大以及并发需求提升时,可以快速无缝迁移至微服务架构。 3、适用用户 微服务技术并不是 **「落伍」**了,而是进入了 「成熟期」,它的 「适用场景和边界被更清晰地定义」 了。微服务不再是一个 「必须要有」 的选项,而是一个 「权衡之后」 的选择。 Dante Cloud 也并未使用任何复杂难懂或难以上手掌握的技术,项目中所涉及核心关键组件中,其中 「近 80% 均为 Spring 生态原生组件」。技术实现均为各组件标准用法的组合与应用,编码风格和代码设计一直也在极尽努力尽量与 Spring 生态的标准规范用法保持一致,只不过经过大量的版本迭代和重构之后逐渐形成了一定的封装与抽象。 因此,我们推荐以下用户体检和使用 Dante Cloud 「传统项目用户」:可以先体验和使用单体版,先从“前后端分离”以及“多端适配”开始,尝试不同于传统内嵌页面的开发模式。之后也可以平滑迁移至微服务版。 「数字转型用户」:如果您正在考虑进行数字化转型,可以直接选择使用微服务版,不用再为“基础组件碎片化,需花大量时间整合、踩坑版本兼容”等问题而苦恼。 「复杂项目用户」:如果您的业务复杂度上升到一定阶段,可以直接选择使用微服务版,直接聚焦于业务开发,节省大量前期搭建基础设施、解决通用技术问题的时间。 「初创团队用户」:可以先使用单体版进行开发,只要代码放置规范、模块划分合理,后期可以根据需要无缝迁移至微服务架构 「技术尝鲜用户」:本项目并不拘泥局限于常规成熟的技术内容,目标是探索新型技术并用其来为业务的创新服务。喜欢技术尝鲜的用户可以尝鲜使用。 「学习提升用户」:本项目代码实现优雅和领域划分清晰,编码风格和模块实现尽最大可能与 Spring 生态规范保持一致,是深入学习 Spring 生态组件和提升技能的优秀案例 想要从传统项目转型至微服务项目的用户,建议详细阅读《企业IT架构转型之道:阿里巴巴中台战略思想与架构实战》一书(可以先读前几章)之后再上手本项目! 对于以下用户我们不建议选择 Dante Cloud 「单体拥趸用户」:如果您觉得单体架构可以满足您所有的架构需求,微服务繁琐庞大无法比拟单体的“方便”、“快捷”,那么建议选择其它更专业的单体项目。 「主流技术用户」:如果您只擅长 mysql、mybatis 等主流技术,本项目所涉及的基础技术体系可能会让您觉得格格不入,建议选择更适配您技术体系项目。 「功能丰富用户」:本项目定位是基础平台,自认为没有能力做到功能既丰富又通用,如果您追求拥有丰富的、开箱即用的功能后台系统,那么本项目并不适合。 「会话思维用户」:基于 Token 的前后端分离架构与传统基于 Session 的传统单体开发思想有较大不同,本项目无法让您完全沿用原有单体设计思路和开发思维。 「极简编程用户」:如果您希望通过界面拖拽就可以生成代码,或者不看文档、不用学习就可以轻松掌握相关技术,这需求与本项目的产品定位、开发理念、设计哲学背道而驰。 「审美品鉴用户」:本项目前端是使用组件库纯手搓构建,没有专业的美工也没有照搬主流框架,初衷是为后端开发人员接触前端提供一条更友好的途径,所以不能保证符合您的审美。 [二] 新增特性 在微服务架构的实践中,“无状态”一直被奉为金科玉律,它确保了系统的水平扩展能力和高可用性。然而,这种纯粹性在用户体验和开发效率上带来了显著的挑战:为了获取当前用户信息,每个微服务都必须自行解析令牌、查询用户中心或依赖上游传递的上下文。这不仅导致了代码的重复与冗余,更在分布式链路中埋下了信息不一致的隐患——同一个用户在不同服务中可能看到版本各异的信息,极大地增加了调试与维护的复杂度。 为此,Dante Cloud 进行了一次深思熟虑的架构演进:在严格保障服务集群本身无状态扩展能力的前提下,创新性地引入了基于 Session 的用户信息管理机制。这一改变,并非对无状态原则的背离,而是一次面向开发效率与数据可靠性的“优雅平衡”。可以使用新增的工具类 ServletSecurityUtils,通过其方法 getUserPrincipal(HttpServletRequest request) 来获取到用户信息。 响应式服务也提供了从 Session 中获取用户信息的工具类 ReactiveSecurityUtils。 这一支持为系统带来了三个维度的根本性提升: 开发范式简化,效率跃升:开发者无需在每一个服务中编写重复的用户信息解析代码,现在仅需一行指令即可直接从 Session 中获取完整、规范的用户上下文。这极大地简化了开发流程,降低了认知负担,让工程师能更专注于核心业务逻辑。 数据强一致性,根除隐患:所有微服务都访问同一个权威的 Session 数据源,从根本上杜绝了因为缓存延迟或解析差异导致的信息不一致问题。用户身份、权限、偏好等数据在整个会话周期内保持高度统一,确保了业务逻辑的准确与可靠。- 架构清晰度增强,维护成本降低:此举消除了服务间繁琐的用户上下文传递链条,使得代码更加简洁、内聚。系统内耗减少,稳定性和可维护性自然得到了显著增强。 本质上,Dante Cloud 是在网关认证之后,于业务服务集群内部实现了一个 “局部的、会话级的有状态”。它完美地兼顾了微服务架构的弹性优势与单体应用的开发便利性,为构建既健壮又高效的现代分布式应用提供了一个全新的最佳实践。 [三] 本次更新 主要更新 [升级] Spring Boot 版本升级至 3.5.7 [升级] Spring Authorization Server 版本升级至 1.5.3 [升级] Spring Cloud Alibaba 版本升级至 2025.0.0.0 [升级] Camunda 版本升级至 7.24.0,SQL 脚本同步升级 [升级] 服务基础 jre 和 jdk 版本升级至 17.0.17-11 和 25.0.1-11 [新增] 新增后端支持跨服务的从 Session 中获取用户信息 [新增] 改用 sm-crypto-v2 替代原有 sm-crypto 大幅提升加解密性能 其它更新 [新增] 新增物联网平台启动时动态添加平台订阅主题功能 [新增] 新增物联网平台默认主题权限数据初始化脚本 [新增] JPA 核心方法定义中,新增 Optional findOne(Specification specification) 方法 [新增] 新增一机一密设备签名信息生成逻辑及接口 [新增] 新增一型一密设备基于 Mqtt 动态注册 [重构] 使用 sealed 接口重构各类型实体定义基类的继承关系,提升继承关系的可控制性,减少基础定义类型无序继承问题。 [修复] 修复授权码模式自定义表单配置类提示使用过时方法设置问题 [修复] 修复系统默认 Mqtt 在出现异常以后不会自动链接问题 [修复] 修复策略工厂统一定义错误引起的死循环问题 [修复] 对 Mqtt 接受数据进行反序列化时存在泛型擦除问题,导致多层嵌套对象被转化成 Map 的问题。 [修复] 修复使用新版 Spring Authorization Server,授权码模式配置错误,访问 /oauth2/authorize 页面不会跳转至登录页面问题 [修复] 修复如果先启动 Gateway 再启动其它服务,服务发现就会失败,调用接口出现 404 的问题 fix: #ID18CG [修复] 修复服务端在退出时,Mqtt v5 抛出 Mqttv5PahoMessageDrivenChannelAdapter : Error unsubscribing from [,java.util.ConcurrentModificationException: null 错误 [修复] 修复签名计算参数传递错误,导致签名校验失败问题 [优化] 优化响应式环境 @EnableHerodotusRestReactiveMessage 注解放置位置,提升代码的规范性及合理性 [优化] 调整授权服务器和资源服务器配置参数,将 Jwk 相关配置参数归并至更合理位置。 [优化] 优化前端 Nginx 配置,支持更精准的客户端 IP 获取。 [升级] ip 地址数据库更新至 2025.10.22 [升级] loki docker 镜像版本升级至 3.5.7 [升级] promtail docker 镜像版本升级至 3.5.7 [升级] tempo docker 镜像版本升级至 2.9.0 [升级] node red docker 镜像版本升级至 4.1.1-22 依赖更新 [升级] protobuf-maven-plugin 版本升级至 3.10.2 [升级] alipay-sdk-java 版本升级至 4.40.483.ALL [升级] camunda 版本升级至 7.24.0 [升级] hutool 版本升级至 7.0.0-M2 [升级] loki-logback-appender 版本升级至 2.0.1 [升级] protobuf-bom 版本升级至 4.33.0 [升级] software.amazon.awssdk 版本升级至 2.35.11 [升级] software.amazon.awssdk.crt 版本升级至 0.39.4 [升级] weixin-java 版本升级至 4.7.8-20251023.110018 [升级] sweetalert2 webjars 版本升级至 11.26.3 [升级] error_prone_annotations 版本升级至 2.43.0 [升级] hutool 5.X 版本升级至 5.8.41 [升级] okio 版本升级至 3.16.2 [升级] opengauss-jdbc 版本升级至 6.0.2-og [升级] classgraph 版本升级至 4.8.184 如果本项目对你有所帮助,欢迎 Star 一波来支持我们! Gitee:https://gitee.com/dromara/dante-cloud Github:https://github.com/dromara/dante-cloud Gitcode:https://gitcode.com/dromara/dante-cloud

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

🔥 xbatis ORM 框架 1.9.1-正式发布,一款好用、简单、便捷的框架!!

1.9.1- 2025-10-22 1:修复对象转条件多表条件配置报异常问题 2:优化 exists 条件方法,更优雅 3:增加对象动态排序 4:修复 oracle-batchSave 原生批量会去重的问题 5:兼容 PageHelper 支持配合 xbatis-lambda 分页 6:新增mapWithKeyAndValue方法 7:统一查询结果为空时的 List Map 为可修改的 List 和 Map 8:修改@Conditions注解逻辑默认为 OR 9:注解@Fetch增加 memoryLimit,采用内存 limit 前几条 10:新增cross join支持 11:动态默认值增加强制设置配置 12:增加 Mapper 支持原生 update 批量修改支持 13:@ResultField 注解支持多列名映射 14:SQL 模板支持,特殊字符包裹(解决单引号的问题) 15:其他优化,增加更多条件开关方法 16:支持 PG distinct on (xxx) 排重功能 17:支持表、列名全部大小写设置 18:Mapper 方法拦截器支持官方自带方法拦截 19:对象转条件增加 NOT/NULL 空 / 非空的功能 20:增加计算字段注解 ResultCalcField,用于自动 select 计算字段,例如 count,sum 等等计算字段 21:优化原生 SQL 操作,支持动态 where 拼接 22:增加日期年月时分秒增减方法 23:增加启动时安全检查功能,针对 @ResultEnity @ConditionTarget @OrderByTarget 等非实体类的检测 24:其他优化 1.8.7 更新内容: 1:为了更好的 JAVA+XML 结合,query 和 where 增加 tableAs (实体类,别名) 方法,用于自定义表名别名 2:XbatisConfig 改为 XbatisGlobalConfig 3:增加逻辑删除拦截器 4:updatedelete增加 原生 RETURNING (原生) 功能 5:增加原生 sql 查询方法和update delete RETURNING 功能 6:增加了一个Mapper 方法拦截器 7:增加exists/not exists 简易写法 通用 SQL 扩展: //类型支持 实体类,VO和普通POJO SysUser user = sysUserMapper.select(SysUser.class, "select * from t_sys_user where id =?", 1); //支持增删改,且支持返回数据 String user_name = sysUserMapper.executeAndReturning(String.class, "update t_sys_user set user_name=? where id=1 RETURNING user_name", "xxx"); //ORM写法 删除并返回被删除的数据(数据库原生操作) List<SysUser> list = DeleteChain.of(sysUserMapper) .in(SysUser::getId, 1, 2) .returning(SysUser.class) .returnType(SysUser.class) .executeAndReturningList(); //ORM写法 修改并返回修改后的数据(数据库原生操作)适合金额加减操作返回剩余金额 SysUser sysUser = UpdateChain.of(sysUserMapper) .eq(SysUser::getId, 1) .set(SysUser::getUserName, "abc2") .returning(SysUser.class) .returnType(SysUser.class) .executeAndReturning(); 分表配置 @Data @SplitTable(SysUserSplitter.class) public class SysUser { @TableId private Integer id; @SplitTableKey private Integer groupId; private String nickname; private String username; } public class SysUserSplitter implements TableSplitter { @Override public boolean support(Class<?> type) { return type == Integer.class || type == int.class; } @Override public String split(String sourceTableName, Object splitValue) { Integer groupId = (Integer) splitValue; //分成10个表 return sourceTableName + "_" + groupId % 10; } } 分表就是这么简单,其他操作和常规无异!!! 1.7.7 更新内容: 1:QueryChain,DeleteChain,InsertChain,UpdateChain 支持 BasicMapper 方法 2:支持通用 BasicMapper,可不需要创建多个实体类 Mapper;一个 BasicMapper 即可使用所有功能 3:正式支持单 Mapper (写一个 Mapper 即可) 为什么推荐 xbatis?: xbatis 是一款超级强大的 ORM 框架 1:可多表 join(不再只能单表了) 2:代码分页,xml 还可以分页(可以不用 pagehelper 了) 3:良好的扩展能力:orm+sql 模板 (让 ORM 框架不再死板,扩展性极强) 4:强大的各种数据库适配,可在一套代码中 实现多个数据库适配;真正的 ORM hibernate 都做不到 6:极简的 api 设计,让开发者 不再迷糊 1.单表 +@Fetch 注解 + fetchFilter 方法 @Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; private String password; private Integer roleId; private LocalDateTime create_time; @Fetch(source = SysUser.class, property = "roleId", target = SysRole.class, targetProperty = "id") private List<SysRoleVo> sysRoles; } List<SysUserVO> list = QueryChain.of(sysUserMapper) .from(SysUser.class) .fetchFilter(SysUserVO::getRoles,where->where.eq(SysRole::getStatus,1)) .returnType(SysUserVO.class) .list(); fetchFilter 方法是对 @Fetch 注解的增强,没有特殊要求一般,可忽略 2. 单表查询 SysUser sysUser = QueryChain.of(sysUserMapper) .eq(SysUser::getId, 1) .eq(SysUser::getUserName,'admin') .get(); 3.VO 映射 @Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; //字段名字不一样时 @ResultEntityField(property = "password") private String pwd; } SysUserVO sysUserVO = QueryChain.of(sysUserMapper) .eq(SysUser::getId, 1) .eq(SysUser::getUserName,'admin') .returnType(SysUserVO.class) .list(); 4. join 查询 @Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; //字段名字不一样时 @ResultEntityField(property = "password") private String pwd; //映射一个对象 1对1 @NestedResultEntity(target = SysRole.class) prviate SysRole sysRole; //映射多个对象 1对多 @NestedResultEntity(target = SysRole.class) prviate List<SysRole> sysRoles; } List<SysUserRoleVO> list = QueryChain.of(sysUserMapper) .from(SysUser.class) .join(SysUser.class, SysRole.class) .returnType(SysUserRoleVO.class) .list(); 还有很多很多超级方便有趣的写法,欢迎大家来使用https://xbatis.cn 例如: 1 . 多表 join A 内嵌 B B 内嵌 C 都可以 2 . 不使用 join 使用 @Fetch 注解 + fetchFilter 方法实现 将 A JOIN B 变成 query A + query B 3 . 使用 @Paging 注解 实现你的 xml 自动分页 4 . 使用 SQL 模板,让你 ORM 更简单更容易扩展,再也不怕被框架限制了

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

🔥 xbatis ORM 框架 1.9.1-M15 发布,一款好用、简单、便捷的框架!!

1.9.1-M15 - 2025-10-20 1:修复对象转条件多表条件配置报异常问题 2:优化 exists 条件方法,更优雅 3:增加对象动态排序 4:修复 oracle-batchSave 原生批量会去重的问题 5:兼容 PageHelper 支持配合 xbatis-lambda 分页 6:新增mapWithKeyAndValue方法 7:统一查询结果为空时的 List Map 为可修改的 List 和 Map 8:修改@Conditions注解逻辑默认为 OR 9:注解@Fetch增加 memoryLimit,采用内存 limit 前几条 10:新增cross join支持 11:动态默认值增加强制设置配置 12:增加 Mapper 支持原生 update 批量修改支持 13:@ResultField 注解支持多列名映射 14:SQL 模板支持,特殊字符包裹(解决单引号的问题) 15:其他优化,增加更多条件开关方法 16:支持 PG distinct on (xxx) 排重功能 17:支持表、列名全部大小写设置 18:Mapper 方法拦截器支持官方自带方法拦截 19:对象转条件增加 NOT/NULL 空 / 非空的功能 20:增加计算字段注解 ResultCalcField,用于自动 select 计算字段,例如 count,sum 等等计算字段 21:优化原生 SQL 操作,支持动态 where 拼接 22:增加日期年月时分秒增减方法 23:增加启动时安全检查功能,针对@ResultEnity @ConditionTarget @OrderByTarget等非实体类的检测 24:其他优化 1.8.7 更新内容: 1:为了更好的 JAVA+XML 结合,query 和 where 增加 tableAs (实体类,别名) 方法,用于自定义表名别名 2:XbatisConfig 改为 XbatisGlobalConfig 3:增加逻辑删除拦截器 4:updatedelete增加 原生 RETURNING (原生) 功能 5:增加原生 sql 查询方法和update delete RETURNING 功能 6:增加了一个Mapper 方法拦截器 7:增加exists/not exists 简易写法 通用 SQL 扩展: //类型支持 实体类,VO和普通POJO SysUser user = sysUserMapper.select(SysUser.class, "select * from t_sys_user where id =?", 1); //支持增删改,且支持返回数据 String user_name = sysUserMapper.executeAndReturning(String.class, "update t_sys_user set user_name=? where id=1 RETURNING user_name", "xxx"); //ORM写法 删除并返回被删除的数据(数据库原生操作) List<SysUser> list = DeleteChain.of(sysUserMapper) .in(SysUser::getId, 1, 2) .returning(SysUser.class) .returnType(SysUser.class) .executeAndReturningList(); //ORM写法 修改并返回修改后的数据(数据库原生操作)适合金额加减操作返回剩余金额 SysUser sysUser = UpdateChain.of(sysUserMapper) .eq(SysUser::getId, 1) .set(SysUser::getUserName, "abc2") .returning(SysUser.class) .returnType(SysUser.class) .executeAndReturning(); 分表配置 @Data @SplitTable(SysUserSplitter.class) public class SysUser { @TableId private Integer id; @SplitTableKey private Integer groupId; private String nickname; private String username; } public class SysUserSplitter implements TableSplitter { @Override public boolean support(Class<?> type) { return type == Integer.class || type == int.class; } @Override public String split(String sourceTableName, Object splitValue) { Integer groupId = (Integer) splitValue; //分成10个表 return sourceTableName + "_" + groupId % 10; } } 分表就是这么简单,其他操作和常规无异!!! 1.7.7 更新内容: 1:QueryChain,DeleteChain,InsertChain,UpdateChain 支持 BasicMapper 方法 2:支持通用 BasicMapper,可不需要创建多个实体类 Mapper;一个 BasicMapper 即可使用所有功能 3:正式支持单 Mapper (写一个 Mapper 即可) 为什么推荐 xbatis?: xbatis 是一款超级强大的 ORM 框架 1:可多表 join(不再只能单表了) 2:代码分页,xml 还可以分页(可以不用 pagehelper 了) 3:良好的扩展能力:orm+sql 模板 (让 ORM 框架不再死板,扩展性极强) 4:强大的各种数据库适配,可在一套代码中 实现多个数据库适配;真正的 ORM hibernate 都做不到 6:极简的 api 设计,让开发者 不再迷糊 1.单表 +@Fetch 注解 + fetchFilter 方法 @Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; private String password; private Integer roleId; private LocalDateTime create_time; @Fetch(source = SysUser.class, property = "roleId", target = SysRole.class, targetProperty = "id") private List<SysRoleVo> sysRoles; } List<SysUserVO> list = QueryChain.of(sysUserMapper) .from(SysUser.class) .fetchFilter(SysUserVO::getRoles,where->where.eq(SysRole::getStatus,1)) .returnType(SysUserVO.class) .list(); fetchFilter 方法是对 @Fetch 注解的增强,没有特殊要求一般,可忽略 2. 单表查询 SysUser sysUser = QueryChain.of(sysUserMapper) .eq(SysUser::getId, 1) .eq(SysUser::getUserName,'admin') .get(); 3.VO 映射 @Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; //字段名字不一样时 @ResultEntityField(property = "password") private String pwd; } SysUserVO sysUserVO = QueryChain.of(sysUserMapper) .eq(SysUser::getId, 1) .eq(SysUser::getUserName,'admin') .returnType(SysUserVO.class) .list(); 4. join 查询 @Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; //字段名字不一样时 @ResultEntityField(property = "password") private String pwd; //映射一个对象 1对1 @NestedResultEntity(target = SysRole.class) prviate SysRole sysRole; //映射多个对象 1对多 @NestedResultEntity(target = SysRole.class) prviate List<SysRole> sysRoles; } List<SysUserRoleVO> list = QueryChain.of(sysUserMapper) .from(SysUser.class) .join(SysUser.class, SysRole.class) .returnType(SysUserRoleVO.class) .list(); 还有很多很多超级方便有趣的写法,欢迎大家来使用https://xbatis.cn 例如: 1 . 多表 join A 内嵌 B B 内嵌 C 都可以 2 . 不使用 join 使用 @Fetch 注解 + fetchFilter 方法实现 将 A JOIN B 变成 query A + query B 3 . 使用 @Paging 注解 实现你的 xml 自动分页 4 . 使用 SQL 模板,让你 ORM 更简单更容易扩展,再也不怕被框架限制了

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

🔥 xbatis ORM 框架 1.9.1-M13 发布,一款好用、简单、便捷的框架!!

1.9.1-M13 - 2025-10-19 1:修复对象转条件多表条件配置报异常问题 2:优化 exists 条件方法,更优雅 3:增加对象动态排序 4:修复 oracle-batchSave 原生批量会去重的问题 5:兼容 PageHelper 支持配合 xbatis-lambda 分页 6:新增mapWithKeyAndValue方法 7:统一查询结果为空时的 List Map 为可修改的 List 和 Map 8:修改@Conditions注解逻辑默认为 OR 9:注解@Fetch增加 memoryLimit,采用内存 limit 前几条 10:新增cross join支持 11:动态默认值增加强制设置配置 12:增加 Mapper 支持原生 update 批量修改支持 13:@ResultField 注解支持多列名映射 14:SQL 模板支持,特殊字符包裹(解决单引号的问题) 15:其他优化,增加更多条件开关方法 16:支持 PG distinct on (xxx) 排重功能 17:支持表、列名全部大小写设置 18:Mapper 方法拦截器支持官方自带方法拦截 19:对象转条件增加 NOT/NULL 空 / 非空的功能 20:增加计算字段注解 ResultCalcField,用于自动 select 计算字段,例如 count,sum 等等计算字段 21:优化原生SQL操作,支持动态where拼接 22:增加日期年月时分秒增减方法 23:其他优化 1.8.7 更新内容: 1:为了更好的 JAVA+XML 结合,query 和 where 增加 tableAs (实体类,别名) 方法,用于自定义表名别名 2:XbatisConfig 改为 XbatisGlobalConfig 3:增加逻辑删除拦截器 4:updatedelete增加 原生 RETURNING (原生) 功能 5:增加原生 sql 查询方法和update delete RETURNING 功能 6:增加了一个Mapper 方法拦截器 7:增加exists/not exists 简易写法 通用 SQL 扩展: //类型支持 实体类,VO和普通POJO SysUser user = sysUserMapper.select(SysUser.class, "select * from t_sys_user where id =?", 1); //支持增删改,且支持返回数据 String user_name = sysUserMapper.executeAndReturning(String.class, "update t_sys_user set user_name=? where id=1 RETURNING user_name", "xxx"); //ORM写法 删除并返回被删除的数据(数据库原生操作) List<SysUser> list = DeleteChain.of(sysUserMapper) .in(SysUser::getId, 1, 2) .returning(SysUser.class) .returnType(SysUser.class) .executeAndReturningList(); //ORM写法 修改并返回修改后的数据(数据库原生操作)适合金额加减操作返回剩余金额 SysUser sysUser = UpdateChain.of(sysUserMapper) .eq(SysUser::getId, 1) .set(SysUser::getUserName, "abc2") .returning(SysUser.class) .returnType(SysUser.class) .executeAndReturning(); 分表配置 @Data @SplitTable(SysUserSplitter.class) public class SysUser { @TableId private Integer id; @SplitTableKey private Integer groupId; private String nickname; private String username; } public class SysUserSplitter implements TableSplitter { @Override public boolean support(Class<?> type) { return type == Integer.class || type == int.class; } @Override public String split(String sourceTableName, Object splitValue) { Integer groupId = (Integer) splitValue; //分成10个表 return sourceTableName + "_" + groupId % 10; } } 分表就是这么简单,其他操作和常规无异!!! 1.7.7 更新内容: 1:QueryChain,DeleteChain,InsertChain,UpdateChain 支持 BasicMapper 方法 2:支持通用 BasicMapper,可不需要创建多个实体类 Mapper;一个 BasicMapper 即可使用所有功能 3:正式支持单 Mapper (写一个 Mapper 即可) 为什么推荐 xbatis?: xbatis 是一款超级强大的 ORM 框架 1:可多表 join(不再只能单表了) 2:代码分页,xml 还可以分页(可以不用 pagehelper 了) 3:良好的扩展能力:orm+sql 模板 (让 ORM 框架不再死板,扩展性极强) 4:强大的各种数据库适配,可在一套代码中 实现多个数据库适配;真正的 ORM hibernate 都做不到 6:极简的 api 设计,让开发者 不再迷糊 1.单表 +@Fetch 注解 + fetchFilter 方法 @Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; private String password; private Integer roleId; private LocalDateTime create_time; @Fetch(source = SysUser.class, property = "roleId", target = SysRole.class, targetProperty = "id") private List<SysRoleVo> sysRoles; } List<SysUserVO> list = QueryChain.of(sysUserMapper) .from(SysUser.class) .fetchFilter(SysUserVO::getRoles,where->where.eq(SysRole::getStatus,1)) .returnType(SysUserVO.class) .list(); fetchFilter 方法是对 @Fetch 注解的增强,没有特殊要求一般,可忽略 2. 单表查询 SysUser sysUser = QueryChain.of(sysUserMapper) .eq(SysUser::getId, 1) .eq(SysUser::getUserName,'admin') .get(); 3.VO 映射 @Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; //字段名字不一样时 @ResultEntityField(property = "password") private String pwd; } SysUserVO sysUserVO = QueryChain.of(sysUserMapper) .eq(SysUser::getId, 1) .eq(SysUser::getUserName,'admin') .returnType(SysUserVO.class) .list(); 4. join 查询 @Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; //字段名字不一样时 @ResultEntityField(property = "password") private String pwd; //映射一个对象 1对1 @NestedResultEntity(target = SysRole.class) prviate SysRole sysRole; //映射多个对象 1对多 @NestedResultEntity(target = SysRole.class) prviate List<SysRole> sysRoles; } List<SysUserRoleVO> list = QueryChain.of(sysUserMapper) .from(SysUser.class) .join(SysUser.class, SysRole.class) .returnType(SysUserRoleVO.class) .list(); 还有很多很多超级方便有趣的写法,欢迎大家来使用https://xbatis.cn 例如: 1 . 多表 join A 内嵌 B B 内嵌 C 都可以 2 . 不使用 join 使用 @Fetch 注解 + fetchFilter 方法实现 将 A JOIN B 变成 query A + query B 3 . 使用 @Paging 注解 实现你的 xml 自动分页 4 . 使用 SQL 模板,让你 ORM 更简单更容易扩展,再也不怕被框架限制了

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

🔥 xbatis ORM 框架 1.9.1-M12 发布,一款好用、简单、便捷的框架!!

1.9.1-M12 - 2025-10-16 1:修复对象转条件多表条件配置报异常问题 2:优化exists条件方法,更优雅 3:增加对象动态排序 4:修复oracle-batchSave原生批量会去重的问题 5:兼容PageHelper支持配合xbatis-lambda分页 6:新增mapWithKeyAndValue方法 7:统一查询结果为空时的List Map为可修改的List和Map 8:修改@Conditions注解逻辑默认为OR 9:注解@Fetch增加memoryLimit,采用内存limit前几条 10:新增cross join支持 11:动态默认值增加强制设置配置 12:增加Mapper支持原生update批量修改支持 13:@ResultField注解支持多列名映射 14:SQL模板支持,特殊字符包裹(解决单引号的问题) 15:其他优化,增加更多条件开关方法 16:支持PG distinct on(xxx) 排重功能 17:支持表、列名全部大小写设置 18:Mapper方法拦截器支持官方自带方法拦截 19:对象转条件增加NOT/NULL 空/非空的功能 20:增加计算字段注解ResultCalcField,用于自动select计算字段,例如count,sum等等计算字段 21:其他优化 1.8.7 更新内容: 1:为了更好的 JAVA+XML 结合,query 和 where 增加 tableAs (实体类,别名) 方法,用于自定义表名别名 2:XbatisConfig 改为 XbatisGlobalConfig 3:增加逻辑删除拦截器 4:updatedelete增加 原生 RETURNING (原生) 功能 5:增加原生 sql 查询方法和update delete RETURNING 功能 6:增加了一个Mapper 方法拦截器 7:增加exists/not exists 简易写法 通用 SQL 扩展: //类型支持 实体类,VO和普通POJO SysUser user = sysUserMapper.select(SysUser.class, "select * from t_sys_user where id =?", 1); //支持增删改,且支持返回数据 String user_name = sysUserMapper.executeAndReturning(String.class, "update t_sys_user set user_name=? where id=1 RETURNING user_name", "xxx"); //ORM写法 删除并返回被删除的数据(数据库原生操作) List<SysUser> list = DeleteChain.of(sysUserMapper) .in(SysUser::getId, 1, 2) .returning(SysUser.class) .returnType(SysUser.class) .executeAndReturningList(); //ORM写法 修改并返回修改后的数据(数据库原生操作)适合金额加减操作返回剩余金额 SysUser sysUser = UpdateChain.of(sysUserMapper) .eq(SysUser::getId, 1) .set(SysUser::getUserName, "abc2") .returning(SysUser.class) .returnType(SysUser.class) .executeAndReturning(); 分表配置 @Data @SplitTable(SysUserSplitter.class) public class SysUser { @TableId private Integer id; @SplitTableKey private Integer groupId; private String nickname; private String username; } public class SysUserSplitter implements TableSplitter { @Override public boolean support(Class<?> type) { return type == Integer.class || type == int.class; } @Override public String split(String sourceTableName, Object splitValue) { Integer groupId = (Integer) splitValue; //分成10个表 return sourceTableName + "_" + groupId % 10; } } 分表就是这么简单,其他操作和常规无异!!! 1.7.7 更新内容: 1:QueryChain,DeleteChain,InsertChain,UpdateChain 支持 BasicMapper 方法 2:支持通用 BasicMapper,可不需要创建多个实体类 Mapper;一个 BasicMapper 即可使用所有功能 3:正式支持单 Mapper (写一个 Mapper 即可) 为什么推荐 xbatis?: xbatis 是一款超级强大的 ORM 框架 1:可多表 join(不再只能单表了) 2:代码分页,xml 还可以分页(可以不用 pagehelper 了) 3:良好的扩展能力:orm+sql 模板 (让 ORM 框架不再死板,扩展性极强) 4:强大的各种数据库适配,可在一套代码中 实现多个数据库适配;真正的 ORM hibernate 都做不到 6:极简的 api 设计,让开发者 不再迷糊 1.单表 +@Fetch 注解 + fetchFilter 方法 @Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; private String password; private Integer roleId; private LocalDateTime create_time; @Fetch(source = SysUser.class, property = "roleId", target = SysRole.class, targetProperty = "id") private List<SysRoleVo> sysRoles; } List<SysUserVO> list = QueryChain.of(sysUserMapper) .from(SysUser.class) .fetchFilter(SysUserVO::getRoles,where->where.eq(SysRole::getStatus,1)) .returnType(SysUserVO.class) .list(); fetchFilter 方法是对 @Fetch 注解的增强,没有特殊要求一般,可忽略 2. 单表查询 SysUser sysUser = QueryChain.of(sysUserMapper) .eq(SysUser::getId, 1) .eq(SysUser::getUserName,'admin') .get(); 3.VO 映射 @Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; //字段名字不一样时 @ResultEntityField(property = "password") private String pwd; } SysUserVO sysUserVO = QueryChain.of(sysUserMapper) .eq(SysUser::getId, 1) .eq(SysUser::getUserName,'admin') .returnType(SysUserVO.class) .list(); 4. join 查询 @Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; //字段名字不一样时 @ResultEntityField(property = "password") private String pwd; //映射一个对象 1对1 @NestedResultEntity(target = SysRole.class) prviate SysRole sysRole; //映射多个对象 1对多 @NestedResultEntity(target = SysRole.class) prviate List<SysRole> sysRoles; } List<SysUserRoleVO> list = QueryChain.of(sysUserMapper) .from(SysUser.class) .join(SysUser.class, SysRole.class) .returnType(SysUserRoleVO.class) .list(); 还有很多很多超级方便有趣的写法,欢迎大家来使用https://xbatis.cn 例如: 1 . 多表 join A 内嵌 B B 内嵌 C 都可以 2 . 不使用 join 使用 @Fetch 注解 + fetchFilter 方法实现 将 A JOIN B 变成 query A + query B 3 . 使用 @Paging 注解 实现你的 xml 自动分页 4 . 使用 SQL 模板,让你 ORM 更简单更容易扩展,再也不怕被框架限制了

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

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等操作系统。