DSE 动态SQL发动机
驱动力
开发人员在面对一个新业务模块时,习惯将一个业务分解为多个增、删、改、查操作以及事务操作。我们不难发现大多数业务系统使用查询操作的比重很大,而且业务系统的复杂也体现在查询操作,这些复杂往往表现在多表关联查询和动态查询条件查询上。在开源界Ibatis和Hibernate等技术框架也对单表的动态条件查询做了很好的支持,但是对于多表的联合查询的动态条件查询还未支持,因此DSE的概念产生。SQL引擎接受页面的查询参数,根据SQL模板的去自动匹配并最终生成SQL语句。
DSE 组件架构
1. View 与Web的View交互组件,主要处理从View层传递到DSE引擎时的不匹配性。View采纳了OGNL方案。并且在OGNL的基础上,构建了OGNLValueStack的机制,从而比较完美的解决了数据流转中的不匹配性。 2. SQL build 根据SQL 模板和页面的请求条件动态生成SQL语句。 3. SQL Execute 根据SQL build组件生产的SQL语句,然后根据前台页面查询条件对应类型匹配变量,并使用JDBC 的绑定变量API去 执行SQL。 4. Result 处理放回结果,并发给ServerContext。 5. Reader 读取SQL模板中的信息,将实例化的SQL模板放入 Context DSE中。 6. SQL Template SQL模板是动态SQL组装SQL预警的根据,SQL模板包含:基础SQL模板、条件类型配置信息两部分信息。 7. Context DSE 存储SQL 模板信息。在DynamicSqlEngine启动时,将SQL模板存储在Context DSE 中。 8. DynamicSqlEngine DynamicSqlEngine 组件是整个引擎的灵魂,负责各个组件的调度,同时负责整个引擎日志记录和异常处理功能。下面是DynamicSqlEngine 引擎的工作原理:WebContext启动是,调用Reader组件读取SQLTemplate,并加载到Context中;当页面有查询请求后,由View组件封装数据,DSE组装动态组装SQL;组装完成后交给SE组件去执行;最后将SE结构给Result组件,放回给页面(Servlet Context);View 获取业务熟悉,并将页面属性映射到 Context 中。 特性 1. 动态构造sql条件语句,提供sql拼接与使用占位符两种方式 2. 采用绑定变量的形式 3. 数据类型的修饰 4. 对SQL注入攻击的防范 项目详细发布地址: http://code.google.com/p/worldeasy/ 这是我的关于动态SQL引擎的设计思路,请大家给些建议。目前代码正在完善中,更多的请关注google code 的进度 备注: 1. DSE: 2. 动态条件查询:查询的条件是变化的。