像写SQL一样编写Java数据应用-TinySqlDsl

前言
话说企业应用,一般离不开数据库。要做数据库,可以有N种方案,比如:直接采用JDBC层自己封装下使用的,采用一些框架的,如:iBatis,Hiberate,Spring JDBC Template等等(这个太多了,因此不一一列举)的,这些方案也都在各自的领域展示了自己的特点,解决了相当部分的技术问题,并取得了相当好的应用效果。
但是不管是哪种方案,其优点和缺点往往也是连在一起的,究其原因是因为SQL和Java编程之间是割裂的,如果封装得不到位,做Java的人太难使用;如果封装得太多,在做一些用复杂SQL的时候又非常麻烦。比如:Hibernate就采用了封装HQL的方式来解决这方面的问题。iBatis对于SQL支持比较好,但是又会有一些割裂感,同时在解决时还要引入动态SQL来解决需要根据一些运行时条件来处理的问题,一定程度上又增加了使用的复杂度。
那么问题就来了,有没有更好的方式来解决数据库应用开发过程中的问题呢?究其根本原因是要如何解决数据库开发中的SQL与Java代码之间的割裂问题,如果能把这个问题解决掉,理论上会有一个不错的解。
我们知道SQL实际是是一种数据为领域的DSL语言,如果我们能直接在Java中编写SQL,然后执行结果就可以直接返回Java对象,这个问题不就有了良好的解决方案么?
TinySqlDsl解决方案
实际上这方面已经有一些现成的解决方案,但是有的不是开源的,有的支持的还不是非常到位,因此悠然就决定尝试着写一下,写了半天时间看了看效果,详见RESTful风格的支持实践一文,内部讨论了一下,感觉还不错,于是正式决定正式花时间来编写一个TinySqlDsl,当然实际编写的时候,还是有许多的问题点的,以至于最终的风格与上面的文章还有一些不一致,当然这也是正常的,容易理解的,否则那什么也太神了。
我们常见的SQL语句有Select、Insert、Update、Delete,因此我们的方案中也实现了这几个语句的编写方式。
首先来看看看TinySqlDsl版的Dao是怎么写的。
第一步:定义POJO

  1. <strong>public class Custom {
  2. private String id;
  3. private String name;
  4. private int age;
  5. public String getId() {
  6. return id;
  7. }
  8. public void setId(String id) {
  9. this.id = id;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public int getAge() {
  18. return age;
  19. }
  20. public void setAge(int age) {
  21. this.age = age;
  22. }
  23. }
  24. </strong>

复制代码

第二步:定义表结构定义文件

  1. public class CustomTable extends Table {
  2. public static final CustomTable CUSTOM = new CustomTable();
  3. public final Column ID = new Column(this, "id");
  4. public final Column NAME = new Column(this, "name");
  5. public final Column AGE = new Column(this, "age");
  6. private CustomTable() {
  7. super("custom");
  8. }
  9. }

复制代码

第三步:编写DAO类

  1. public class CustomDao {
  2. private DslSession dslSession;
  3. public DslSession getDslSession() {
  4. return dslSession;
  5. }
  6. public void setDslSession(DslSession dslSession) {
  7. this.dslSession = dslSession;
  8. }
  9. public void insertCustom(Custom custom) {
  10. dslSession.execute(
  11. insertInto(CUSTOM).values(
  12. CUSTOM.ID.value(custom.getId()),
  13. CUSTOM.NAME.value(custom.getName()),
  14. CUSTOM.AGE.value(custom.getAge())
  15. )
  16. );
  17. }
  18. public void updateCustom(Custom custom) {
  19. dslSession.execute(
  20. update(CUSTOM).set(
  21. CUSTOM.NAME.value(custom.getName()),
  22. CUSTOM.AGE.value(custom.getAge())).where(
  23. CUSTOM.ID.eq(custom.getId())
  24. )
  25. );
  26. }
  27. public void deleteCustom(String id) {
  28. dslSession.execute(
  29. delete(CUSTOM).where(
  30. CUSTOM.ID.eq(id)
  31. )
  32. );
  33. }
  34. public Custom getCustomById(String id) {
  35. return dslSession.fetchOneResult(
  36. selectFrom(CUSTOM).where(
  37. CUSTOM.ID.eq(id)
  38. )
  39. , Custom.class);
  40. }
  41. public List<Custom> queryCustom(Custom custom) {
  42. return dslSession.fetchList(
  43. selectFrom(CUSTOM).where(
  44. and(
  45. CUSTOM.ID.eq(custom.getId()),
  46. CUSTOM.NAME.equal(custom.getName()),
  47. CUSTOM.AGE.equal(custom.getAge())
  48. )
  49. )
  50. , Custom.class);
  51. }
  52. }

复制代码

看了上面的示例,会不会感觉有点奇怪,怎么可以这么写?呵呵,先别着急了解实际的实现机理,我们先品味一下这种DSL风格的数据库编写方式,嗯嗯,具体的来说就是像写SQL一样的方式来写SQL。

时间: 2024-12-23 23:06:01

像写SQL一样编写Java数据应用-TinySqlDsl的相关文章

hive--构建于hadoop之上、让你像写SQL一样编写MapReduce程序

hive介绍 什么是hive? hive:由Facebook开源用于解决海量结构化日志的数据统计 hive是基于hadoop的一个数据仓库工具,可以将结构化的数据映射为数据库的一张表,并提供类SQL查询功能.本质就是将HQL(hive sql)转化为MapReduce程序 我们使用MapReduce开发会很麻烦,但是程序员很熟悉sql,于是hive就出现了,可以让我们像写sql一样来编写MapReduce程序,会自动将我们写的sql进行转化.但底层使用的肯定还是MapReduce. hive处理

Spring Jdbc 自定义 ORM——sql查询对应Java数据对象

Target:  实现如下,通过Spring Jdbc,传入sql,查询满足条件的Java数据对象: pojo: public class ZmTest { public ZmTest() { // TODO Auto-generated constructor stub } private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) {

写在开始编写Java之前(1)——Java的跨平台性

Java语言之所以比C语言更加实用 是有原因的 Java的一个重要的特点——跨平台性 无论是哪个平台,如Windows.Linus还是Mac系统 Java的语法都是一样的 这个要比C语言用处要广 因为C语言只能在Windows系统下运行 所以人们在选择语言编辑程序或软件时一般会选择Java语言 但是对于不同系统还是有不同的地方 就是要用不同的Java虚拟机 Windows之所以可以运行C语言,是因为Windows里面有C语言的虚拟机 over

Java开发者写SQL时常犯的10个错误

首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - 导航条 - 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - iOS - Python - Android - Web前端 Java开发者写SQL时常犯的10个错误 2015/03/10 | 分类: 基础技术 | 0 条评论 | 标签: SQL 分享到:0 本文由 ImportNew - zer0Black 翻译自 jooq.欢迎加入翻译小组.转载请见文末要求. 我十分惊讶的

大数据不就是写SQL吗?

[原创,转载请注明出处] 应届生小祖参加了个需求分析会回来后跟我说被产品怼了一句: "不就是写SQL吗,要那么久吗" 我去,欺负我小弟,这我肯定不能忍呀,于是我写了一篇文章发在了公司的wiki 贴出来给大家看看,省略了一些敏感的内容.当然内部版言辞也会温和一点,嘻嘻 在哪里写SQL? 这个问题高级点的问法是用哪种SQL引擎? SparkSQL.Hive.Phoenix.Drill.Impala.Presto.Druid.Kylin (这里的SQL引擎是广义的,大家不必钻牛角尖) 我用一

如何更规范化编写Java 代码

如何更规范化编写Java 代码 Many of the happiest people are those who own the least. But are we really so happy with our IPhones, our big houses, our fancy cars? 忘川如斯,拥有一切的人才更怕失去. 背景:如何更规范化编写Java 代码的重要性想必毋需多言,其中最重要的几点当属提高代码性能.使代码远离Bug.令代码更优雅. 一.MyBatis 不要为了多个查询条

写了10年JAVA代码,为何还是给人一种乱糟糟的感觉?

接触过不少号称写了10多年代码的程序员,可经常还是会发现他们的代码给人一种乱糟糟的感觉,那么如何才能写出让同事感觉不那么乱的代码呢? 一.为什么要写这篇文章 在开篇之前先说明下为什么要写这篇文章?在Java的世界里MVC软件架构模式绝对是经典的存在(PS:MVC是一种软件架构方式并不只有Java有),如果你是在最近十年前后进入Java的编程世界,那么你会发现自己这些年似乎从来没有逃离MVC架构模式的牢笼,只不过换着使用了不同的MVC框架,如早期的Struts1.Struts2以及现在几乎一统江湖

十步优化SQL Server中的数据访问(转载)

原文地址:http://tech.it168.com/a2009/1125/814/000000814758.shtml 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户,你开始着手调查访问变慢的原因. 经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有些表

ASP.NET用SQL Server中的数据来生成JSON字符串

原文引自:  作者: 缺水的海豚  来源: 博客园  发布时间: 2010-09-21 21:47  阅读: 6136 次  推荐: 0   原文链接   [收藏] 摘要:ExtJs用到的数据内容基本上都是JSON格式的,要和ASP.NET结合开发,需要格式化数据成JSON的东西.所以作者实现了一个生成JSON字符串的方法. 最近在学习ExtJs与ASP.NET结合开发,前者用到的数据内容基本上都是JSON格式,遂想写一个格式化数据成JSON的东东,在网上找了一下,发现还蛮多的,实现了一个类似于