复杂SQL之外部XML引用

        在项目中查询报表/列表,免不了遇到SQL非常复杂的情况,一坨坨几十行的sql语句,放在java代码里,不好维护,调试,不好看! 不好看是重点..


背景:

        以前的工作经历基本都是用mybatis,所以刚接触jfinal略不习惯,总想找个类似mybatis的替代品,oschina上看了很多 beetsql、jssql等等等,功能都挺强大的,然而<% %> 这种风格写ifelse的判断实在是无法接受,然后就放弃了...

        在正式使用jfinal开发的小半年里,一直避免使用超长sql的使用场景,但是还是遇到了几个无法规避的功能写的sql又长又搓-。-,在DreamLu的帮助下,初成品来了,仅仅最基本的存放sql功能。


举个栗子:

1132BC84-71A2-4454-80A3-B64EE03FF71E.pngA7719815-03D9-4FB5-A685-B05200313A4B.png

存放路径丢在同级目录下,主要考虑更新生产环境,打成jar包,丢上去就好了,不用xml文件在传一次。


分页的使用:

01850873-BFA5-469A-9411-C37F235D0EF1.png

E136EDEF-CD51-4191-BF5E-4E1025B5D851.png

单条的使用:

39AABCFC-E1DD-4B69-A1BB-89B85FCA7DD7.png


避免了又丑又长的sql耦合在代码中,跟代码的时候眼睛都看花了。



不足之处:

最常用的if else 判断都没有,所以写sql的时候就要变着法的写,所有可能需要分支判断的参数都设计一个默认值,比如查询时间[全部],正常是这个查询条件就没了,这里只能把1970-1-1的时间传进来。 其他几的类似处理。

坐等DreamLu大神easy4Jfinal中的sqlxml插件~~~



最后附上代码

从类同级目录下读取:is_local是用来判断是本机还是生产环境读取jar

82F4EB05-42C1-4FE8-9AF5-12B1A256E6DD.png

9805BC23-DA7A-4013-A0E0-AD5B8F581C38.png

在附上从resource目录下读取的代码:

528C1AD1-CA3B-4586-B226-0C1EA792AF2A.png

直接上代码,提交的时候格式会被自动压缩-,-,所以只能上图了


掏出好久没用的github给有需要的小伙伴下载工具类:

https://github.com/linbq-b7/JFinal4sqlxml


评论区

JFinal

2016-09-13 21:43

这么好的分享,刚刚才看到,这个需求确实比较大,有需要的朋友们有福了,此外,在哪里有下载啊,带个下载链接哈,先赞一个

Dreamlu

2016-09-13 21:51

很赞,代码简单,无第三方依赖。

Dreamlu

2016-09-13 22:33

两个小建议,你可以把sql以sql名+id缓存到一个SqlUtils的全局map里面,map里面有的时候从map里面取,第二可以用sql.replaceAll("\\s+", " ");去除一些空白符,减少内存占用。

l745230

2016-09-14 10:05

@Dreamlu 临时先用用,更看好easy4jfinal的~~~

JFinal

2016-09-14 10:25

@Dreamlu 强迫症比我还严重,多余的空白符都不放过,这种精神才能写出更优质的代码

happyboy

2016-09-18 20:04

很长的sql写在java文件里确实不舒服,也不方便维护。我现在使用的就是利用beetl模板从xml文件里读取sql,但是写起来确实没用mybatis方便。

水滴鱼

2016-09-22 10:56

uib不是早就有了吗?有什么不同么?

happyboy

2016-10-21 15:22

http://git.oschina.net/h5lib/jfinal-xsql-plugin
这个感觉要更好用一些,用法更接近ibatis了。

JFinal

2016-10-21 18:40

@happyboy jfinal 2.3 新添加的功能,将秒掉 ibatis 这类解决方案,学习成本极低,用户体验极好,代码量极少,多多关注社区动态

happyboy

2016-10-21 18:47

@JFinal 不知道2.3何时正式发布?

李金元

2016-12-23 10:00

请问要导入微信的包吗

l745230

2016-12-25 10:54

@李金元 只额外引用了jfinal-weixin中的XmlHelper工具类,如果你不想引入的话,可以把这个类copy到自己的工程里就能用了

热门分享

扫码入社