为什么说xml是复杂sql必须的选择

原创
2020/06/09 21:47
阅读数 2.9K

最近看一些ORM开源项目,突然有一个不好的风向:用xml就是low!!!

本来这都是“萝卜青菜各有所爱”,竟然被上升到low不low的问题了,今天我来为之正名一下,复杂sql不用xml就是low

下面用逻辑思维告诉你不要因为反对mybatis而走向另外一个极端!

第一、请问不用xml你用什么来存放较长的sql?

  • 代码中,类似于jooq模式:给你一个范例自己去看(我不做评价) https://msd.misuland.com/pd/4146263742822227236
  • md或者模板引擎中:  请问跟xml究竟有什么区别呢?换了一个文件类型而已,不要偷换概念!
  • 代码中直接字符串写sql:简单的可以,复杂的在没有jdk13文本块之前不觉得乱吗?就算于文本块其实也不易过复杂

 简单的大家都是可以直接在代码或者注解中写的(不要总举简单例子)!

List<StaffInfoVO> staffVOs = sqlToyLazyDao.findEntity(StaffInfoVO.class,
    EntityQuery.create().where("#[staffName like ?] #[ and status=?]").values("陈", 1).lock(LockMode.UPGRADE)
	.orderBy("staffName").orderByDesc("createTime"));

//单表查询,对象传参模式
List<StaffInfoVO> staffVOs = sqlToyLazyDao.findEntity(StaffInfoVO.class,
	EntityQuery.create().where("#[staffName like :staffName] #[ and status=:status]")
	.values(new StaffInfoVO().setStatus(1).setEmail("test3@aliyun.com")));


//代码中链式查询并删除
Long deleteCount = sqlToyLazyDao.deleteByQuery(StaffInfoVO.class,
EntityQuery.create().where("status=:status").values(new StaffInfoVO().setStatus(1)));

第二、大家为什么反对xml?

  • mybatis 给大家带来的误区,看下面这个范例,其实就是很久之前代码中if(xx!=null) {sql.append()}的xml化。而且还是这么有名气的开源项目,很多人就认为其他的开源项目用xml也好不到哪里去!

  • 下面是beeltsql的写法md格式的(之前很多人要求跟其对比一下,满足一次)

第三、核心问题是没有人告诉你sqltoy是怎么玩的!认真了解sqltoy之后你就不这么认为了!

  • 核心sql部分是不是一个整体?是不是很整洁?是不是基本上跟dbeaver客户端调试完的保持了一致?看到这里是不是觉得xml并不难看!

第四、告诉你为什么xml?

1、markdown文件或者模板引擎这些sql配置可以提示吗?了解一下xml的schema,不需要记忆ide开发工具自动提示!

2、markdown和一些模板引擎有严格的格式校验吗?你写错了开发工具也不会提示!xml可以!

2、我现在想在sql上扩展一些功能,你markdown和模板引擎如何扩?你那就是文本编辑器呀!增加一个扩展就是增加了开发者的记忆难度!

 如下图,xml中增加一个缓存翻译,很容易,xml自动提示,都不需要记忆!你可以吗?

第五、不用xml你就是放弃了大量的优势!

  • xml的优势你一个都不沾,再向xml方向发展又违背了当初头脑热的时候吹下的各种绝对上了天的牛(也不先做个调查)!
  • 而sqltoy则比较灵活,强调什么场景下用什么技术,该用xml时用xml,该在代码中硬sql、该跟jooq一样针对简单的操作来点链式操作也可以!

第六、介绍一下sqltoy的sql为什么可以这么写?

  • 发现规律:你去总结sql过滤条件是不是95%以上以null或者空白就表示不参与过滤?你想问假如null或空白参与过滤呢?

    

  • 通过将参数整理独立出来,其实极少情况需要额外处理!

sqltoy的地址

展开阅读全文
打赏
2
5 收藏
分享
加载中
XML 的 schema 能校验 CDATA 吗?
2020/06/29 18:06
回复
举报
很屌!
2020/06/28 19:20
回复
举报
我不觉得xml有问题,但觉得myabtis使用xml+ongl有问题,这也是mybatis的问题,因为核心解析技术(xml解析和ongl解析)他并没有,导致很多错误提示不清楚,myabtis要整合这俩种错误解析异常确实很难
2020/06/28 17:04
回复
举报
我放了一个连接 https://my.oschina.net/xiandafu/blog/4327851 ,BeetlSQL 能结合Markdown插件和DataSource功能,完成提示和语法校验,这主要是靠IDEA的强大。当然,还需要BeetlSQL把定界符配置改一下,伪装成注释
2020/06/28 16:54
回复
举报
zhongxuchen博主
很棒,继续加油!
2020/06/28 19:18
回复
举报
不好意思,我简单问一句,如果用其它ORM工具,手工查询出一个List或数组结构后,再用普通的Java方法去实现你所说的行转列,缓存翻译,格式化, 扩展函数、分组计算、同比环比这些高级功能(实际上很少遇到),这种做法有什么问题没有? 我相信大多数人目前手上的业务都是这么实现的,将复杂的数据后处理放在Java里,而不是利用DAO工具的模板函数来解决。
2020/06/28 16:28
回复
举报
zhongxuchen博主
你问的很好! 其实你应该可以想到sqltoy这些功能是怎么发展起来的?不可能一下子就有,必然是经过了你说的这些过程,然后再提炼到框架里面的! 1、自己实现导致较大的代码量 2、质量控制变成了各个开发者,带来了较大的培训工作(开发者一过来能熟悉吗?) 3、这部分核心逻辑代码实现如何管控?谁来不断维护?如果是公司级别的,意味着这些能力会局限于一定的组织范围内!
2020/06/28 16:36
回复
举报
sqltoy这些功能的发展,是因为你正好是sqltoy的作者,所以可以在模板里不断添加新的函数。但是对于使用其它DAO工具的程序员来说,他们不可能没遇到这些业务问题,而且貌似也没人抱怨DAO功能不足,这足以说明他们已经有了解决方案,而且很可能是用Java的方式完成的,所以你这些功能对于MyBatis/JPA的使用者来说,可能吸引力不大,没有切换DAO工具的动力,这才是关键。代码量、质量控制、逻辑代码管控这些你没必要替他们担心,存在即合理,如果他们遇到了这些功能点,肯定已经解决了,如果没遇到,肯定是不常用的。
2020/06/28 16:55
回复
举报
zhongxuchen博主
不好意思,确实是被很多人喷的很恼火,回复时有点冲,很多人不理解,网上和现实中都有面对这种人!

要感谢大家提意见!
2020/06/28 15:36
回复
举报
喷子统统不要理会,做开源不容易,而且几乎没啥回报,辛苦了:bowtie:
2020/06/28 18:42
回复
举报
zhongxuchen博主
👍
2020/06/28 19:15
回复
举报
你的意思很明确,就是你们反对mybatis用xml,其实是mybatis用xml用的太烂,但是我先进呀,可是本质上,写的sql,不论用什么形式,写的sql本身类似一个sql模板,根据不同的输入,输出不同的sql,所以,模板的问题应该用模板引擎来写,比如beetlsql,你用xml,你的CDDATA里面处理那些东西的时候,你内部怎么解析呢?你CDDATA里面的东西,难道不像模板吗?
2020/06/28 15:30
回复
举报
zhongxuchen博主
这里表达的是没有必要再引入一个模板引擎,同时利用xml的优点(schema提升和格式校验和广泛支持)。 如果依你说用类似freemarker 模板引擎,能带来这些优点吗? 这里 强调的是swot分析,1.00001>1 的概念,而不是1.00001和1里面的共有的1部分有什么区别!
2020/06/28 16:43
回复
举报
@JFinal 波总怎么看?
2020/06/28 13:41
回复
举报
存在既有道理,萝卜青菜各取所爱就好了。
2020/11/19 17:09
回复
举报
更多评论
打赏
15 评论
5 收藏
2
分享
返回顶部
顶部