`
j2eetop
  • 浏览: 64403 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

像写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。

分享到:
评论

相关推荐

    java 连接sqlserver使用的java-sqlserver-connect.jar包

    在本例中,我们关注的是"java-sqlserver-connect.jar",这是一个专门为Java应用程序提供与Microsoft SQL Server数据库交互功能的库。这个JAR文件支持两个不同的Java运行时环境(JRE),即JRE7和JRE8。 首先,了解...

    基于JAVA和SQL-Server图书管理系统课程设计

    基于JAVA和SQL-Server图书管理系统课程设计 本课程设计旨在设计和开发一个基于JAVA和SQL-Server的图书管理系统,旨在解决图书馆中借阅者或工作人员查找特定书目的困难问题。该系统将能够缩短借阅者的等待时间,减轻...

    mysql-connector-java-5.1.40-bin.jar连接器

    总的来说,mysql-connector-java-5.1.40-bin.jar是Java开发者连接MySQL数据库的关键工具,无论是在Hive还是其他Java应用中,它都扮演着数据交互的中介角色,确保了数据的顺畅流动。然而,为了保持最佳兼容性和安全性...

    mysql-connector-java-5.1.7-bin.jar

    总之,"mysql-connector-java-5.1.7-bin.jar"是Java应用程序连接到MySQL数据库的关键组件。通过理解和正确使用这个驱动,开发者可以轻松地在Java项目中集成MySQL数据库,实现数据的存储、检索和其他复杂的数据库操作...

    mysql-connector-java-gpl-5.1.36

    总之,"mysql-connector-java-gpl-5.1.36"是用于Java应用程序与MySQL 5.1数据库通信的驱动程序,通过JDBC API提供数据库操作的能力。理解这些核心概念和用法,可以帮助开发者有效地使用MySQL数据库进行Java编程。

    数据库SQLserver java课程 设计-SQL Server代码类资源

    SQL Server是微软公司推出的一款关系型数据库管理系统(RDBMS),广泛应用于企业级的数据存储和管理。在本设计中,SQL Server将用于存储学生信息,如姓名、学号、班级等。你需要学习如何创建数据库、定义数据表结构...

    mybatis框架压缩包及MySQL驱动包mysql-connector-java-5.1.37-bin.jar

    MyBatis是一个流行的Java持久层框架,它简化了数据库与Java应用程序之间的交互,通过XML或注解方式将SQL语句映射为Java方法,提供了一种灵活的数据访问接口。本压缩包包含MyBatis框架所需的全部依赖,以及适用于...

    mysql-connector-java-5.1.22-bin.jar

    总之,`mysql-connector-java-5.1.22-bin.jar`是Java开发者在使用MySQL数据库时不可或缺的组件,它简化了数据库操作,使Java应用程序能够方便地与MySQL进行数据交互。正确地引入和使用这个驱动,可以大大提高开发...

    mysql-connector-java-5.1.45-bin.jar

    MySQL Connector/J是MySQL数据库官方提供的Java...总的来说,"mysql-connector-java-5.1.45-bin.jar"是一个关键组件,用于Java应用程序与MySQL数据库的交互,它的正确使用和配置对于开发基于Java的数据库应用至关重要。

    网上书店 java sql java sql 网上书店 java sql

    其次,SQL是连接Java应用和数据存储的关键。网上书店需要存储大量信息,如书籍详情、用户信息、订单记录等。这些数据通常存储在关系型数据库中,如MySQL或Oracle。Java通过JDBC(Java Database Connectivity)API与...

    SQL2JAVA-java字段串代码拼接小工具

    标题中的“SQL2JAVA-java字段串代码拼接小工具”是指一个辅助开发的软件,它主要功能是帮助程序员便捷地在Java代码和SQL语句之间进行转换,特别是处理字符串拼接的问题。在软件开发过程中,尤其是在数据库交互时,...

    java操作mysql数据库,不写sql语句版

    总结起来,不直接写SQL语句的Java MySQL数据库操作通常依赖于ORM框架或Spring提供的数据访问工具,这些工具通过映射机制和高级API,使得开发者可以更加专注于业务逻辑,而不是数据库细节。在实际项目中,`DataAccess...

    mysql-connector-java-5.1.46-bin.jar

    MySQL数据库驱动程序“mysql-connector-java-5.1.46-bin.jar”是Java应用程序与MySQL数据库进行交互的重要组件。这个驱动程序实现了Java Database Connectivity (JDBC) API,允许Java开发者通过编写Java代码来连接、...

    Java开发软件相关安装包 SQL Server-中文开发版-Tools

    SQL Server是微软公司推出的一款关系型数据库管理系统,它在数据存储、管理和分析方面有着强大的功能,尤其对于需要处理大量数据的Java应用程序来说,是理想的后端支持。本安装包“SQL Server-中文开发版-Tools”...

    mysql-connector-java-5.1.23-bin.jar

    总结来说,`mysql-connector-java-5.1.23-bin.jar`是Java程序员与MySQL数据库进行交互的核心组件,它简化了数据库操作,使得Java应用能够高效、安全地存取MySQL中的数据。将这个JAR文件添加到项目的类路径...

    Developing-applications-with-Java-and-Azure-SQL.zip

    标题中的“Developing-applications-with-Java-and-Azure-SQL”指示了本次讨论的主题,即使用Java编程语言和Azure SQL数据库来开发应用程序。这涵盖了两个主要领域:Java应用程序开发和微软Azure云平台上的SQL数据库...

    java源码包---java 源码 大量 实例

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    mysql-connector-java-5.1.47.jar

    在这个场景下,它可能表示这个JAR文件是从一个远程Maven仓库下载的,包含关于mysql-connector-java-5.1.47.jar的版本、作者、发布日期等信息。 使用这个JAR文件,开发者可以在Java项目中执行以下操作: 1. 创建...

    Excel VBA+SQL 数据管理与应用模板开发.rar

    在Excel VBA(Visual Basic for Applications)和SQL(Structured Query Language)的结合使用中,我们可以创建高效、自动化的数据管理与应用模板。这样的模板对于处理大量数据和执行复杂的计算任务非常有用,尤其在...

    sql-map-2.dtd和sql-map-config-2.dtd

    总结来说,"sql-map-2.dtd"和"sql-map-config-2.dtd"是Ibatis 2.x版本中非常关键的组件,它们为XML配置文件提供了结构化规则,使得开发人员能够编写出合法且易于维护的SQL映射文件和全局配置文件。理解并正确使用...

Global site tag (gtag.js) - Google Analytics