另一种思考:为什么不选JPA、MyBatis,而选择JDBCTemplate?

Mybatis-Plus saveBatch失效排查:从JDBC批处理到事务边界的深度解析 在Java企业级应用开发中,数据库批量操作是提升数据写入性能的关键技术。其核心原理通常基于JDBC的批处理机制,通过PreparedStatement的addBatch和executeBatch方法,将多条SQL语句合并发送,从而减少网络往返开销并提升吞吐量。这项技术的工程价值在于能够显著降低高并发或大数据量场景下的数据库压力与响应时间。在实际应用场景中,批量插入常见于数据同步、日志归档和初始化脚本等。然而,实践中常会遇到批处理“静默失效”的问题,例如数据未持久化却无异常抛出。这往往与MySQL的rewri 阅读详情


以下内容转载自:https://segmentfault.com/a/1190000018472572

作者:scherman

因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ是总体上最好的,可惜不是完全免费,最终选择JDBC Template。

Hibernate和Mybatis是使用最多的两个主流框架,而JOOQ、Ebean等小众框架则知道的人不多,但也有很多独特的优点;而JPA则是一组Java持久层Api的规范,Spring Data JPA是JPA Repository的实现,本来和Hibernate、Mybatis、JOOQ之类的框架不在同一个层次上,但引入Spring Data JPA之类框架之后,我们会直接使用JPA的API查询更新数据库,就像我们使用Mybatis一样,所以这里也把JPA和其他框架放在一起进行比较。

同样,JDBC和其他框架也在同一层次,位于所有持久框架的底层,但我们有时候也会直接在项目中使用JDBC,而Spring JDBC Template部分消除了使用JDBC的繁琐细节,降低了使用成本,使得我们更加愿意在项目中直接使用JDBC。

一、SQL封装和性能

在使用Hibernate的时候,我们查询的是POJO实体类,而不再是数据库的表,例如hql语句 select count(*) from User,里面的User是一个Java类,而不是数据库表User。这符合ORM最初的理想,ORM认为Java程序员使用OO的思维方式,和关系数据库的思维方式差距巨大,为了填补对象和关系思维方式的鸿沟,必须做一个对象到关系的映射,然后在Java的对象世界中,程序员可以使用纯的对象的思维方式,查询POJO对象,查询条件是对象属性,不再需要有任何表、字段等关系的概念,这样java程序员就更容易做持久层的操作。

JPA可以视为Hibernate的儿子,也继承了这个思路,把SQL彻底封装起来,让Java程序员看不到关系的概念,用纯的面向对象思想,重新创造一个新的查询语言代替sql,比如hql,还有JPQL等。支持JPA的框架,例如Ebean都属于这种类型的框架。

但封装SQL,使用另一种纯的面向对象查询语言代替sql,真的能够让程序员更容易实现持久层操作吗?MyBatis的流行证明了事实并非如此,至少在大多数情况下,使用hql并不比使用sql简单。首先,从很多角度上看,hql/JPQL等语言更加复杂和难以理解;其次就是性能上明显降低,速度更慢,内存占用巨大,而且还不好优化。最为恼火的是,当关系的概念被替换为对象的概念之后,查询语言的灵活性变得很差,表达能力也比sql弱很多。写查询语句的时候受到各种各样的限制,一个典型的例子就是多表关联查询。

不管是hibernate还是jpa,表之间的连接查询,被映射为实体类之间的关联关系,这样,如果两个实体类之间没有(实现)关联关系,你就不能把两个实体(或者表)join起来查询。这是很恼火的事情,因为我们很多时候并不需要显式定义两个实体类之间的关联关系就可以实现业务逻辑,如果使用hql,只是为了join我们就必须在两个实体类之间添加代码,而且还不能逆向工程,如果表里面没有定义外键约束的话,逆向工程会把我们添加的关联代码抹掉。

MyBatis则是另外一种类型的持久化框架,它没有封装SQL也没有创建一种新的面相对象的查询语言,而是直接使用SQL作为查询语言,只是把结果填入POJO对象而已。使用sql并不比hql和JPQL困难,查询速度快,可以灵活使用任意复杂的查询只要数据库支持。从SQL封装角度上看,MyBatis比Hibernate和JPA成功,SQL本不该被封装和隐藏,让Java程序员使用SQL既不麻烦也更容易学习和上手,这应该是MyBatis流行起来的重要原因。

轻量级持久层框架JOOQ也和MyBatis一样,直接使用SQL作为查询语言,比起MyBatis,JOOQ虽然知名度要低得多,但JOOQ不但和MyBatis一样可以利用SQL的灵活性和高效率,通过逆向工程,JOOQ还可以用Java代码来编写SQL语句,利用IDE的代码自动补全功能,自动提示表名和字段名,减少程序员记忆负担,还可以在元数据发生变化时发生编译错误,提示程序员修改相应的SQL语句。

Ebean作为一种基于JPA的框架,它也使用JPQL语言进行查询,多数情况下会让人很恼火。但据说Ebean不排斥SQL,可以直接用SQL查询,也可以用类似JOOQ的DSL方式在代码中构造SQL语句(还是JPQL语句?),但没用过Ebean,所以具体细节不清楚。

JDBC Template就不用说了,它根本没做ORM,当然是纯SQL查询。利用Spring框架,可以把JDBC Template和JPA结合起来使用,在JPA不好查询的地方,或者效率低不好优化的地方使用JDBC,缓解了Hibernate/JPA封装SQL造成的麻烦,但我仍没看到任何封装SQL的必要性,除了给程序员带来一大堆麻烦和学习负担之外,没有太明显的好处。

二、DSL和变化适应性

为了实现复杂的业务逻辑,不论是用SQL还是hql或者JPQL,我们都不得不写很多简单的或者复杂的查询语句,ORM无法减少这部分工作,最多是用另一种面向对象风格的语言去表达查询需求,如前所述,用面向对象风格的语言不见得比SQL更容易。通常业务系统中会有很多表,每个表都有很多字段,即便是编写最简单的查询语句也不是一件容易的事情,需要记住数据库中有哪些表,有哪些字段,记住有哪些函数等。写查询语句很多时候成为一件头疼的事情。

QueryDSL、JOOQ、Ebean甚至MyBatis和JPA都设计一些特性,帮助开发人员编写查询语句,有人称之为“DSL风格数据库编程”。最早实现这类功能的可能是QueryDSL,把数据库的表结构逆向工程为java的类,然后可以让java程序员能够用java的语法构造出一个复杂的查询语句,利用IDE的代码自动补全功能,可以自动提示表名、字段名、查询语句的关键字等,很成功的简化了查询语句的编写,免除了程序员记忆各种名字、函数和关键字的负担。

QueryDSL有很多版本,但用得多的是QueryDSL JPA,可以帮助开发人员编写JPQL语句,如前所述,JPQL语句有很多局限不如SQL灵活高效。后来的JOOQ和Ebean,基本上继承了QueryDSL的思路,Ebean基本上还是JPA风格的ORM框架,虽然也支持SQL,但不清楚其DSL特性是否支持SQL语句编写,在官网上看到的例子都是用于构造JPQL语句。

这里面最成功的应该是JOOQ,和QueryDSL不同,JOOQ的DSL编程是帮助开发人员编写SQL语句,抛弃累赘的ORM概念,JOOQ这个功能非常轻小,非常容易学习和使用,同时性能也非常好,不像QueryDSL和Ebean,需要了解复杂的JPA概念和各种奇异的限制,JOOQ编写的就是普通的SQL语句,只是把查询结果填充到实体类中(严格说JOOQ没有实体类,只是自动生成的Record对象),JOOQ甚至不一定要把结果转换为实体类,可以让开发人员按照字段取得结果的值,相对于JDBC,JOOQ会把结果值转换为合适的Java类型,用起来比JDBC更简单。

传统主流的框架对DSL风格支持得很少,Hibernate里面基本上没有看到有这方面的特性。MyBatis提供了"SQL语句构建器"来帮助开发人员构造SQL语句,但和QueryDSL/JOOQ/Ebean差很多,不能提示表名和字段名,语法也显得累赘不像SQL。

JPA给人的印象是复杂难懂,它的MetaModel Api继承了特点,MetaModel API+Criteria API,再配合Hibernate JPA 2 Metamodel Generator,让人有点QueryDSL JPA的感觉,只是绕了一个大大的弯,叠加了好几层技术,最后勉强实现了QueryDSL JPA的简单易懂的功能。很多人不推荐JPA+QueryDSL的用法,而是推荐JPA MetaModel API+Criteria API+Hibernate JPA 2 Metamodel Generator的用法,让人很难理解,也许是因为这个方案是纯的标准的JPA方案。

数据库DSL编程的另一个主要卖点是变化适应性强,数据库表结构在开发过程中通常会频繁发生变化,传统的非DSL编程,字段名只是一个字符串,如果字段名或者类型改变之后,查询语句没有相应修改,编译不会出错,也容易被开发人员忽略,是bug的一个主要来源。DSL编程里面,字段被逆向工程为一个java类的属性,数据库结构改变之后,作为java代码一部分的查询语句会发生编译错误,提示开发人员进行修改,可以减少大量bug,减轻测试的负担,提高软件的可靠性和质量。

三、跨数据库移植

Hibernate和JPA使用hql和JPQL这类数据库无关的中间语言描述查询,可以在不同数据库中无缝移植,移植到一个SQL有巨大差别的数据库通常不需要修改代码或者只需要修改很少的代码。Ebean如果不使用原生SQL,而是使用JPA的方式开发,也能在不同数据库中平滑的移植。

MyBatis和JOOQ直接使用SQL,跨数据库移植时都难免要修改SQL语句。这方面MyBatis比较差,只有一个动态SQL提供的特性,对于不同的数据库编写不同的sql语句。

JOOQ虽然无法像Hibernate和JPA那样无缝移植,但比MyBatis好很多。JOOQ的DSL很大一部分是通用的,例如分页查询中,Mysql的limit/offset关键字是很方便的描述方式,但Oracle和SQLServer的SQL不支持,如果我们用JOOQ的DSL的limit和offset方法构造SQL语句,不修改移植到不支持limit/offset的Oracle和SQLServer上,我们会发现这些语句还能正常使用,因为JOOQ会把limit/offset转换成等价的目标数据库的SQL语句。JOOQ根据目标数据库转换SQL语句的特性,使得在不同数据库之间移植的时候,只需要修改很少的代码,明显优于MyBatis。

JDBC Template应该最差,只能尽量使用标准sql语句来减少移植工作量。

四、安全性

一般来说,拼接查询语句都会有安全隐患,容易被sql注入攻击。不论是jdbc,还是hql/JPQL,只要使用拼接的查询语句都是不安全的。对于JDBC来说,使用参数化的sql语句代替拼接,可以解决问题。而JPA则应该使用Criteria API解决这个问题。

对于JOOQ之类的DSL风格框架,最终会被render为参数化的sql,天生免疫sql注入攻击。Ebean也支持DSL方式编程,也同样免疫sql注入攻击。

这是因为DSL风格编程参数化查询比拼接字符串查询更简单,没人会拼接字符串。而jdbc/hql/JPQL拼接字符串有时候比参数化查询更简单,特别是jdbc,很多人会偷懒使用不安全的方式。

五、JOOQ的失败之处

可能大部分人会不同意,虽然Hibernate、JPA仍然大行其道,是最主流的持久化框架,但其实这种封装SQL的纯正ORM已经过时,效益低于使用它们的代价,应该淘汰了。MyBatis虽然有很多优点,但它的优点JOOQ基本上都有,而且多数还更好。MyBatis最大的缺点是难以避免写xml文件,xml文件编写困难,容易出错,还不容易查找错误。相对于JOOQ,MyBatis在多数情况下没有任何优势。

Ebean同时具有很多不同框架的优点,但它是基于JPA的,难免有JPA的各种限制,这是致命的缺点。

JOOQ这个极端轻量级的框架技术上是最完美的,突然有一天几个Web系统同时崩了,最后发现是JOOQ试用期过期了,这是JOOQ的失败之处,它不是完全免费的,只是对MySql之类的开源数据库免费。

最终,我决定选择JDBC Template。


后记

不论我们是在做功能开发还是架构设计的时候,框架的选型、中间的选型一直都是我们逃不开的话题,任何一个框架、中间件,它们都有各自的特点,当这些特点放错了地方,我们会吐槽,说它“坑”。而每个东西之所有长期存在着,是因为它还有其自身特点所能覆盖的应用场景。任何一个框架和中间件,都不是解决问题的银弹,我们不应该人云亦云,而更应用根据自身团队的情况、业务需求的情况、成本预算的情况,选择更适合自身环境的东西,这样才是最好的。

高通camera open代码流程(hal到kernel) 内容:简单介绍Camera open代码调用流程,从HAl到kernel。(api1+hal1) 前言 Android camera api和hal对应关系。安卓在版本更新过程中,camera相关代码也经历了几个版本的更新,表现为camera HAL版本更新(HAL1->HAL2->HAL3),camera API版本更新(camera API1->camera API2),接下... 阅读详情

相关推荐

别再只调OpenCV参数了!手把手教你用Python bm3d库搞定图像去噪(附完整代码与效果对比)

本文详细介绍了BM3D算法在图像去噪中的高级应用,通过Python bm3d库实现超越OpenCV传统方法的去噪效果。文章包含完整代码示例、参数调优技巧及工程化应用场景,帮助开发者掌握这一被称为'传统方法天花板'的技术,显著提升图像信噪比和细节保留能力。

weixin_28362173的博客 367

数据持久化框架为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate!

作者:scherman来源:segmentfault.com/a/1190000018472572因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,...

程序员闪充宝 1094

LangChain4j + Milvus 从0-1实现会话管理与RAG检索的AIChat超详细教程

本教程将介绍如何使用LangChain4j和Milvus向量数据库构建一个具备流式输出、会话管理、会话隔离和基于文档RAG检索能力的AI机器人。我们将使用阿里百炼模型作为LLM后端,并通过Docker部署Milvus向量数据库。创建Assistant接口,定义聊天服务:LangChain4j 中文文档 | LangChain4j 中文文档wiringMode :这个属性一般两种,一种是自动装配,我们这里选择手动配置。

2301_80014343的博客 1436

Hibernate注解@JsonIgnoreProperties@JsonIgnore

@JsonIgnoreProperties类注解,作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。 转换实体时忽略json中不存在的字段 解析json数据之忽略解析字段注解@JsonIgnoreProperties 接口的数据无法完全的预知,所以实体类字段有可能不完整 @JsonIgnoreProperties转换实体时忽略json中不存...

icecoola_的博客 1843

import-im6.q16: attempt to perform an operation not allowed by the security policy `PS‘ @ error/cons

这六个 policy 是使用 XML 格式描述的安全策略。要将其中的限制注释掉,在每个 policy 开始和结束的标记之间添加注释标记“

m0_60657960的博客 1909

告别密码烦恼:用Windows Server NPS给公司Wi-Fi和有线网加一道MAC地址白名单(附H3C交换机配置)

本文详细介绍了如何利用Windows Server NPS(网络策略服务器)与H3C交换机实现MAC地址白名单认证,为企业Wi-Fi和有线网络提供零密码安全方案。通过配置NPS服务器、网络策略及H3C交换机联调,实现无感知认证体验,降低运维负担,同时满足审计追溯需求。适用于中小企业网络管理,提升安全性与便捷性。

weixin_42535703的博客 367

Hibernate实体类注解中如何忽略某些字段的映射

@Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.  如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic @Transien t...

sinat_16022089的博客 6597

【COMSOL超材料和超表面仿真设计】

超材料和超表面的设计通常需要自定义材料属性。在COMSOL中,可以通过定义介电常数和磁导率的张量来模拟超材料的特性。对于超表面,通常需要定义表面阻抗或等效电路模型。

weixin_51101456的博客 1673

JPA的好搭档 - QueryDSL

JPA的好搭档 - QueryDSL

LuckyTHP 1424

Mac电脑用Latex论文排版3天速成5天实战de笔记

我后悔了,这五天竞赛搞得我视力都下降了...一个冲动的决定后成为数模竞赛论文写手,3天速成+5天时间=点亮攻克latex写论文技能💡关于Overleaf我是Mac,曾经按照大部分推荐的方式用TEXshop+vs code,但是把模板导入就开始报错。跟着少之又少的适配mac的教程(此时我已知道大概是走错路了)改了配置也无效。海鲜市场找佬改了半天,佬问我:一定要用VC吗?我说,那倒也不是。于是佬推荐我overleaf,三下五除二帮我挑配了环境,美汁汁收了我30块钱。

luwanjoyce的博客 2252

会计引擎:交易与核算分离的前世今生

一、为什么需要会计引擎 金融产品的设计,一如一块硬币需要兼顾两面:一面是为客户提供好的金融服务,满足客户支付结算、借贷、资产保值增值等方面的需求,并在这个过程中,以数字化的方式做好客户资产的登记,登记的载体,则是“分户”或“台账”,如客户存款户,是一种典型的分户--资金的增减变化都在一个账户中进行体现,而客户购买的银行理财,因为收益率、期限、投资标的不同,每一笔持有就形成一行记录,即为“台账”--这当然是不严谨但相对形象的表述。但是,“分户”和“台账”并没有必然的区别,以贷款为例,一些银行仍然存在所谓“

银行信息系统应用架构详解 985

使用QueryDSL过程中你肯定遇到过的问题

如果是初次使用QueryDSL的同学建议去这篇博客:SpringDataJPA+QueryDSL玩转态动条件/投影查询,本文针探讨的是使用时遇到的一些问题: 如何使用Projections.bean投影属性到查询对象,简化代码? 如何使用级联查询,关联同一张表两次? 1. Projections简化代码,使代码更优雅 使用Projections方法可以更简单更方便的返回自定义的参数...

影落离风 7811

【AI编程】Vibe Coding 开发环境搭建与项目实战操作详解

Vibe Coding 开发环境搭建与项目实战操作详解

congge 7343

另一种思考:为什么不选JPA、MyBatis,而选择JDBCTemplate

这符合ORM最初的理想,ORM认为Java程序员使用OO的思维方式,和关系数据库的思维方式差距巨大,为了填补对象和关系思维方式的鸿沟,必须做一个对象到关系的映射,然后在Java的对象世界中,程序员可以使用纯的对象的思维方式,查询POJO对象,查询条件是对象属性,不再需要有任何表、字段等关系的概念,这样java程序员就更容易做持久层的操作。任何一个框架和中间件,都不是解决问题的银弹,我们不应该人云亦云,而更应用根据自身团队的情况、业务需求的情况、成本预算的情况,选择更适合自身环境的东西,这样才是最好的。

z_ssyy的博客 1082

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JPA与MyBatis批量操作性能优化实战

数据库批量操作是提升数据处理效率的核心技术,通过减少网络往返和事务开销实现性能数量级提升。其原理是将多个独立操作合并为单个批处理单元,在JDBC层面利用预处理语句复用和批量执行机制。在电商库存更新、日志批量入库等高并发场景中,合理使用批量操作可使吞吐量提升10倍以上。以JPA的merge批量与原生SQL批处理为例,后者通常有3-5倍的性能优势。结合Spring Batch框架和动态批次大小算法,可进一步优化资源利用率。现代反应式编程如WebFlux的buffer操作符,为异步流式批处理提供了新范式。

425

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

MYBATIS生成策略

这里是修真院后端小课堂,每篇分享文从 【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】 八个方面深度解析后端知识/技能。 大家好,我是IT修真院北京分院一枚正直纯洁善良的java程序员。 今天给大家分享一下,修真院官网java任务拓展:【MYBATIS生成策略】 (1)背景介绍: MYBATIS MyBatis 是一款优秀的持...

IT修真院:初学者转行到互联网的聚集地 420

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Spring Data JPA 实战:告别重复 CRUD,掌握高效持久层开发

在 Java 企业级应用开发中,对象关系映射(ORM)是连接面向对象编程与关系型数据库的核心技术,它通过将数据库表映射为 Java 对象,简化了数据持久化操作。其原理在于定义实体与表之间的映射关系,由框架自动处理 SQL 生成与结果集转换。这一技术的核心价值在于大幅提升开发效率,减少样板代码,并降低因手动编写 SQL 导致的错误。在实际应用场景中,无论是电商系统的用户与订单管理,还是内容管理系统的数据建模,ORM 都能显著加速数据访问层的开发。Spring Data JPA 正是这一理念的杰出代表,它基于

weixin_33798152的博客 926

Spring Boot 3.3批量插入MySQL性能优化实战

批量数据处理是Web应用开发中的常见需求,尤其在电商、金融和物联网领域。通过减少网络往返和事务开销,批量操作能显著提升数据库写入性能。Spring Boot作为主流Java框架,提供了JPA、JdbcTemplate等多种批处理方案。本文基于10万条Excel数据导入MySQL的真实案例,对比分析了逐条插入、saveAll、原生SQL等方案的性能差异,最终实现从15分钟到8秒的优化突破。其中涉及连接池调优、多线程分片等关键技术,特别适合ERP系统初始化、金融对账等大数据量场景。

weixin_34174322的博客 323

MyBatis-Plus为何叫好不叫座?从技术选型到工程实践的深度解析

在Java持久层开发领域,ORM框架是连接应用与数据库的核心技术组件,其选型直接影响着开发效率与系统可维护性。MyBatis作为一款经典的半自动化ORM框架,因其在SQL灵活性与控制力方面的平衡,在企业级应用中广泛使用。而基于MyBatis增强的MyBatis-Plus(MP)通过封装通用CRUD操作与条件构造器,显著提升了开发效率,尤其适用于快速迭代的业务场景。然而,在工程实践中,技术选型往往需要权衡框架的便利性与系统的长期演化需求。对于存量项目而言,历史代码的迁移成本、团队的技术路径依赖,以及对复杂SQ

weixin_30552811的博客 393

Spring Boot技术博客:开发过程中的问题解决与项目实践

在课程中,我选择了一个实体类增删改查的项目进行实践。我尝试使用了Maven的多模块支持功能,将不同的模块定义在不同的Maven项目中,然后通过父项目的形式进行聚合。具体实现过程中,我在父项目的pom.xml中添加了子模块的依赖,并使用Spring Boot的Starter父类来启动整个项目。本文将探讨我在使用Spring Boot过程中遇到的问题、解决方法和项目实践,并分享一些常用的技术知识点。在实际开发中,我们需要根据项目的需求选择合适的技术和方法,并灵活运用各种注解和框架来简化开发过程和提高代码质量。

2302_78116309的博客 313

Java工程师为何回归IDEA:Cursor与IDEA在SpringBoot/MyBatis开发中的本质差异

IDE(集成开发环境)是Java工程实践的核心基础设施,其能力边界直接决定开发效率与系统稳定性。在SpringBoot和MyBatis等强约定、深集成的Java生态中,IDE需具备编译期类型推导、字节码级导航、框架生命周期透视及数据库元数据联动等确定性能力——这远超LLM驱动的‘概率性补全’范畴。Cursor虽在自然语言交互与代码生成上表现亮眼,但在SpringBoot自动配置解析、MyBatis Mapper-XML-实体三重绑定验证、运行时SQL参数追踪等关键环节缺乏工程级语义理解;而IDEA凭借十年级

weixin_30847939的博客 395

Spring JDBC Ultra:凭什么敢说自己是 MyBatis 终结者?

本文介绍了Spring JDBC Ultra(SimpleDAO)框架的设计理念与核心功能,通过对比Hibernate/JPA、MyBatis和Spring JDBC三大主流持久层框架的优缺点,提出了一种整合三者优势的创新解决方案。 该框架的核心设计包含三大主类: BaseDao - 提供单表CRUD零代码实现,支持自动填充审计字段和逻辑删除 BaseSql - 实现联表查询的完全自由,支持所有SQL特性而不进行SQL解析 BaseCond - 提供强大的动态条件拼接能力 框架特点包括: 继承Hiberna

gzz_gzz的博客 643
上一篇: 卧槽!字节跳动总结的设计模式 PDF 火了,完整版开放下载!
下一篇: SpringBoot 中实现跨域的5种方式
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值