DSL风格数据库编程之实践
来源:互联网 发布:linux的gcc编译器 编辑:程序博客网 时间:2024/06/08 12:33
现在的应用系统中,绝多多数的情况下都是要用到数据库的,而适合Java框架的数据库处理方案太多了。
现在又比较流行一种DSL(Domain Specific Language)风格的数据库访问方式,比如:JOOQ、Querydsl等等,都比较成熟。这两货都是收费的,这明显不符合时代潮流么;第二就是有点过度封装的意思,有许多东西都封装了,导致学习及使用成本上升。
删除代码示例
delete(USER).where( USER.NAME.eq("悠然") ); delete(USER).where( USER.NAME.leftLike("A"), USER.AGE.between(20,30) );
插入代码示例
insertInto(USER).values( USER.NAME.value("悠然"), USER.AGE.value(22) );
更新代码示例
update(USER).set( USER.NAME.to("abc"), USER.AGE.to(3) ).where( USER.NAME.eq("悠然") );
查询代码示例
selectFrom(USER); select( customField("%s-%s"), USER.NAME,USER.AGE ).from(USER); select( customField("upper(%s)-%s"), USER.NAME,USER.AGE ).from(USER); selectFrom(USER).orderBy(USER.NAME.desc()); selectFrom(USER).where( USER.NAME.eq("abc") ); selectFrom(USER).where( USER.NAME.like("abc") ); selectFrom(USER).where( or( USER.NAME.like("abc"), USER.AGE.gt(20) ) ); selectFrom(USER).where( USER.AGE.gt(20).and( USER.NAME.like("abc"), USER.AGE.gt(20) ) ); selectFrom(USER).where( USER.NAME.leftLike("abc") ); selectFrom(USER).where( USER.AGE.between(23, 25) ); select(USER.AGE.max()).from(USER); select(USER.AGE.min()).from(USER); select(USER.AGE.avg()).from(USER); select(USER.AGE.count()).from(USER); select(USER.AGE.sum()).from(USER); select(USER.NAME.distinct()).from(USER); select(USER.AGE.sum()).from(USER).having( USER.AGE.sum().gt(100) ).union( select(USER.AGE.sum()).from(USER).having( USER.AGE.sum().gt(100) ) );
查询是最复杂,也是最多变的,上面已经列举了大多数情况。
总结
通过上面的示例,基本上涵盖了四种SQL语句的处理方式。当然每种方案都有它自己的优点与缺点,正所谓萝卜芹菜各有所爱。
这个方案的优点是把SQL逻辑用有语义的代码进行编写,更容易理解;同时由于其与SQL语句的结构相当相似,也更容易写出相应的SQL逻辑,熟悉SQL的人的学习成本非常低;同时也可以非常好的避免SQL注入问题;较SQL拼接是有相当的改善的。也避免了SQL与Java代码分离导致的开发和调试的不方便。
当然也有它的缺点,比如,经常听到的反对声音就是不如写原生SQL。
阅读全文
0 0
- DSL风格数据库编程之实践
- Tiny即将推出DSL风格数据库编程框架
- Tiny即将推出DSL风格数据库编程框架
- 程序设计实践----编程风格
- java HelloWorld 编程风格实践
- [C++] 编程实践之1: Google的C++代码风格1:头文件
- [C++] 编程实践之1: Google的C++代码风格2:作用域
- [C++] 编程实践之1: Google的C++代码风格3:类
- [C++] 编程实践之1: Google的C++代码风格4:来自Google的奇技
- [C++] 编程实践之1: Google的C++代码风格5:其它C++特性
- [C++] 编程实践之1: Google的C++代码风格6:命名约定
- [C++] 编程实践之1: Google的C++代码风格7:注释
- [C++] 编程实践之1: Google的C++代码风格8:格式
- [C++] 编程实践之1: Google的C++代码风格9:规则特例
- 数据库编程实战:Oracle PL/SQL入门之案例实践
- DSL设计编程
- FP编程实践:CPS编程风格及其C++模拟实现
- C++编程规范之编程风格
- Vue框架(一)
- 阿里云存储失败
- 移动端中弹框显示模型属性信息的实现方案
- Mybatis的$和#的区别
- 【转载】读完这些书,妈妈再也不用担心你的学习了
- DSL风格数据库编程之实践
- python日志组件logging模块(一)
- SQLSERVER的客户端连接(java web)
- Codeforces Round #443 (Div. 2) A. Borya's Diagnosis
- Django 分页
- 信息传递EventBus
- Linux常用命令
- 线程状态转换说明
- git 中文显示问题