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

整理:我们需不需要像存储过程一样的跨数据库过程

 
阅读更多
接触过数据库的同学肯定知道存储过程,先列一下好处?
1:易于调试。
2:随时可以查看其原代码。
3:便于测试及跟踪。
4:性能良好。
缺点:
1:只能用于特定的数据库。
2:保密性不强。
3:语言单一。

以下是一些简单说明,如果我们开发出一款类似于存储过程的"Java存储过程",他有存储过程的好处,又可以克服存储过程的缺点,你会用吗?
经过这段时间的讨论以及对技术的调研,总结如下:
1、SQLJ:这个确实是好东西,与我的想法基本一致,也试用了一下。可以在数据库上用JAVA写储储过程,是基于JDBC上的封装,目前只看到Oracle与DB2有解析,开发工具也是这两家独有的,第三方的开发工具基本没有(可能我没找到),还有解析器也没有开源的,用到j2ee服务器上会不会有法律问题,这个没有深入了解。还有SQL语句是在标准的基础上加了一些扩展,不能做到跨数据库,与传统的存储过程对比,移植方面会更好。很可惜的是不能成为Java的一项标准,否则现在的Hibernate应该就不会这么火了。
2、JSQLParser:SQL的语法解析器,这玩意儿也不错,可以校验SQL语句,或许能够派上用处。
3、LINQ to SQL:微软的玩意儿,这个还是相当的好的,功能强大,在Java方面只有Linq,LINQ to SQL还没见着,可惜了。
4、自已写一个解析器,这个可行性还是很高的,而且现有有很多文法解析框架,实现起来应该不难,关键是还得有配套的开发工具,这个是个大工程,短期内很难实现,而且价值不高。
5、使用模板引擎结合JSQLParser来实现,这个可行性还是很高的,但看着模板引擎的语法怎么看怎么不舒服。
6、利用注释+Java语法+JSQLParser作为扩展脚本来实现(非常怪异、应该没看懂)。简单上说就是在java的注释里写sql脚本。如下:
/**
SQL{
--这是一个获是用户的sql语句。(对sql的备注)
select * from users where a.user = 'super';
--这个太普通了,再来一句有深度的。
  select user_code to ${userBean.user_code},user_name to ${userBean.user_name} from a.user = 'super';
}
*/
这个类的扩展名不是java叫sqld(SQL帝).将sqld根据简单的规则转换成java源码(SQLJ的原理一致),写在注释也有好处,生成的java doc里,就有业务逻辑,以后查小问题你就不用看代码了。或者这样说,哪些蛋疼的问题就让客服和工程去忙去吧。
当然,这么干的话很多开发人员会拍砖。
所以、数风流人物还看今朝。看各位了.........

下面是使用模板引擎+JSQLparse实现的过程,开发工具使用Java开发工具,这样的做法你能接受吗。

 

public  procedure  P_users_1001001(UserInfo info){

 /**自定义对象。*/

  DataGrid dg = new DataGrid();

    /**

       sql{

           --userinfo是实体表。

              insert es_system.users (user_code,user_name)
              values
               (:info.userCode,info.user_name);

           --查询的值放到data(二维数组)里。

               select * into :data   from users where user_code=:info.getUser_code();

     }

  */

   return ProcedureUtil.createProcedure(0,"用户创建成功!!",dg);

}

 

在我的构想中,将开发一个简单的工具,根据上述自动解析出Java原代码,并执行原代码返回执行结果,达到类以于脚本语言的效果。

如果续1的方式不喜欢,这样或许你会喜欢 。

1、SQL语句符合sql92标准。

2、Java标准语法。

3、一个精简的ORM。根据数据库生成对等的JavaBean.数据库的类型与JavaBean的类型对应,校验可以通过标注的方式进行。

 

public  procedure  P_users_1001001(UserInfo info){

 /**自定义对象。*/

  DataGrid dg = new DataGrid();

  sql.execute("insert es_system.users (user_code,user_name)"+
           "values"  +
            " (:info.userCode,info.user_name) ";

   sql.executeQuery("select * into :data   from users where user_code=:info.getUser_code()");

   return ProcedureUtil.createProcedure(0,"用户创建成功!!",dg);

}

 

结论:

经过一段时间的思考以及对所开发过项目的总结,最终下了结论,主要分两部份完成,在描述之前,先说明一下需要达到的目标:

1、跨数据库:即允许在多个数据库上运行。

2、可读性强:可读性强,入门的成本低,开发人员容易接受。

3、效率高:主要分两部份,开发的效率及运行的效率,在两都之间达到平衡。

4、即时运行:以脚本化的方式运行。

 

实现的方案如下:

1、将SQL92关键字对象化。

2、扩展SQL92标准,支持如:@等关键用法。

 

用例如下:

1、关键字对象化:

UserInfo是一个用户对象:主要属性有用户代码、用户名称、性别、年龄,部门id (外键)等。

Dep是一个部门对象:含部门的相关信息。

isNullNotCondition是一个自定函数,如果部门名称为空,不做为条件。

Select(UserInfo.class,"DEP_NAME") .from(UserInfo.class)

                                                        .innerJour(Dep.class)

                                                        .on("UserInfo.dep_id=Dep.dep_id");

                                                        .where()

                                                        .and("UserInfo.dep_id=:id")

                                                        .or(isNullNotCondition("Dep.dep_name=:name"));

 

动态SQL语句:

SQL = "select user_code,user_name,sex,age,dep_id,dep_name "+

           "          from UserInfo"+

           "          innerJour Dep "+ 

           "          on (user_info.dep_id=Dep.dep_id" +

           "          where userInfo.dep_id=:id"+

           "          @isNullNotCondition(and Dep.dep_name=:name)";

封装的集合如下:

1、创建临时表

2、Insert、Update、Delete、Select语句。

3、根据数据库生成Java对象,java对象与数据库一一对应该。

 

Command: INSERT

Description: Inserts new rows into a table

   INSERT INTO table [ ( column [, ...] ) ]

        { VALUES ( expression [, ...] ) | SELECT query }

Command: UPDATE

Description: Replaces values of columns in a table

   UPDATE table SET col = expression [,...]

        [ FROM fromlist ]

        [ WHERE condition ]

分享到:
评论

相关推荐

    四级数据库工程师历年真题(含答案)

    - **简化用户视图**: 存储过程不能直接简化用户视图。 - **减少网络流量**: 通过将复杂操作封装在服务器端执行,可以减少客户端与服务器间的交互次数。 - **实现安全控制**: 可以通过存储过程限制某些操作,实现安全...

    网管教程 从入门到精通软件篇.txt

    小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。  Bootcfg  bootcfg 命令启动配置和故障恢复(对于大多数计算机,即 boot.ini 文件)。  含有下列参数的 bootcfg 命令仅在...

    2010_[1].NET面试题整理之基础篇

    7. **C#中的索引器**:索引器允许对象像数组一样被索引。不仅可以使用数字,也可以使用任意类型作为索引,提供更灵活的访问方式。 8. **三层架构**:三层架构是一种常见的软件架构模式,将应用分为表现层(UI)、...

    vCenterServer配置的备份与还原[整理].pdf

    本方案基于使用数据库工具实现vCenter Server配置的备份及恢复,包括但不限于在同一台主机上的恢复以及跨主机的迁移。具体步骤如下: 1. **准备环境**: - **软件需求**: - VMware vCenter Server(至少两套,...

    搜索引擎整理

    根据给定文件的标题“搜索引擎整理”及描述“一些对搜索引擎有帮助的概念,对于搜索引擎的编程有帮助”,我们可以深入探讨一系列关键知识点,包括搜索引擎的工作原理、网络爬虫技术、HTTP协议的理解、以及如何利用...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    在数据库处理方面,不需要在数据层借助存储过程及数据库服务器端函数封装过多的业务逻辑,因此数据库系统采用相对精巧的MySQL[6]。 该在线博客系统服务器端如果需要布置到其他主机上,则该主机必备条件如下: 1. ...

    [CMS程序]Duoxun! v3.0_duoxun.zip

    v3.0可能支持MySQL或类似的数据库系统来存储网站数据。 8. **安全防护**:为保护网站免受攻击,系统可能包含了安全更新、防止SQL注入和跨站脚本等措施。 9. **多语言支持**:对于有国际化需求的用户,Duoxun! v...

    东北大学_操作系统复习提纲

    - 缺点:不能灵活地响应紧急事件。 8. **周转时间 (Turnaround Time)** - 定义:一个进程从提交到第一次运行的时间。 - 计算公式:周转时间 = 完成时间 - 提交时间。 9. **等待时间 (Waiting Time)** - 定义:...

    一键博客备份工具

    通过此工具,你可以将博客文章批量导出并转换成CHM(Microsoft HTML帮助文件)和PDF(便携式文档格式),这样不仅可以便于长期存储,还可以像真正的书籍一样阅读和分享。 该工具的核心功能包括: 1. **博客数据...

    C#经典试题,哈

    根据提供的文件信息,我们可以整理出以下相关知识点: ### 1. C# 访问修饰符详解 - **Private**: 私有访问修饰符,仅在声明它的类内部可访问。 - **Protected**: 受保护访问修饰符,允许在同一类、派生类中访问。 ...

    众多ASP.NET面试题目

    根据提供的文件信息,我们可以整理出一系列与ASP.NET相关的面试知识点,并对这些知识点进行详细解析。 ### 1. 访问修饰符 - **private**: 私有访问修饰符,仅在声明它的类内部可见。 - **protected**: 受保护访问...

    信息管理学基础~考研笔记(注释).doc

    这就要求我们在信息管理过程中,必须有效地进行信息的收集、处理、存储、传播和利用,确保信息的正确性和时效性。 在实际生活中,信息管理的应用极为广泛,包括但不限于信息系统设计、数据库管理、网络信息资源管理...

    项目企业的知识管理应用.docx

    进入20世纪,尤其是信息时代的到来,知识管理逐渐成为一门学科,伴随着信息技术的发展,如数据库、互联网等,知识管理的媒介和技术也日益丰富,使得知识的获取、存储、分享和应用变得更加便捷。 #### 1.2 组织的...

    peer:PhotoPeer是一个可以轻松管理您的个人照片的项目

    5. **数据存储与同步**: 如果是云服务,可能涉及到数据库(如MongoDB)和API接口设计,以支持照片的存储和跨设备同步。 6. **用户界面设计**: 良好的照片管理工具需要直观的UI,便于用户浏览、筛选和编辑照片。 7. *...

    Bibi - the Bibtex File Manager-开源

    1. **图形界面**:Bibi提供了一个跨平台的图形用户界面,支持Windows、Mac OS X和Linux等操作系统,使得用户可以像使用其他日常应用一样管理.bib文件。 2. **实时预览**:在Bibi中编辑条目时,可以实时查看LaTeX...

Global site tag (gtag.js) - Google Analytics