资源描述
小灵呼LQuery开发指南-替代JDBC快速操作数据库Ver 南京小灵呼科技 索引与目录第一章文档介绍41.1.目的41.2.范围41.3.分发41.4.版权4第二章总体设计5总体体系架构5系统设计原则6性能6可靠性6吞吐量6可扩充性7可管理性7可重用性7安全性7设计思想和方法7三层体系结构7基于JAVA/J2EE/SOA/XML/AJAX的技术7业务功能多样化且灵活配置8数据展现方式的多样化8安全控制模块和业务功能模块相互独立8LQuery体系架构8数据库查询分析9数据库修改9文件操作10数据接口10第三章配置文件分析12数据源的定义12数据库明细查询13什么是明细查询?13查询类xml配置说明13数据库汇总分析17什么是汇总分析?17xml配置说明18数据库修改操作21什么是数据库修改操作?21数据库修改类xml配置说明21文件操作23什么是文件操作?23配置说明23第四章实例讲解26建立示例数据库26通过表单按条件明细查询27通过API调用按明细查询29增加一个员工31批量增加员工33修改或删除员工信息34文件装载37构造选择下拉框40构造选择下拉框(include方式)42明细查询(同时显示班的名称)43明细查询(自动显示字段名称)47汇总分析(角度分析)52第五章API调用接口59查询类的API调用59查询类QueryService方法59入口参数QueryRequestI说明59返回值MyHashMap说明60第六章版权声明61第一章 文档介绍1.1. 目的本手册主要介绍如何使用LQuery开发体系进行二次扩展开发。通过这个手册,用户可以了解LQuery开发体系的原理,并通过近一步的案例学习近一步掌握如何通过LQuery进行实际的应用层开发。1.2. 范围本指南主要覆盖了LQuery的设计原理、体系架构、如何配置实施、实例讲解,适合初学者快速进行应用系统的二次开发。通过LQuery开发可以方便快捷地访问数据库及文件,尤其对于E-IVR的开发人员,可以很方便的基于LQuery框架访问各自的数据源。本指南适合于有一定的SQL语言基础并有一定的WEB页面JSP编程基础的人员阅读使用。1.3. 分发此文档授于小灵呼的客户及其他小灵呼授权的相关人员阅读和使用。1.4. 版权 该文档版权属于南京小灵呼科技所有,任何人或组织未经授权不得转载、销售、复制或应用于非此项目的任何应用场合。此项目是指基于小灵呼L系列的产品线(包括LTalk、LCall、LCallplus、LCallback、LOffice、LService、LSale等)的二次开发应用扩展。第二章 总体设计2.1 总体体系架构通用查询分析处理引擎LQuery是基于三层体系结构设计的,上图是以在一个局域网系统为例描述各个层次间关系。表示层主要指客户端,面对操作人员,主要任务是显示用户界面比如查询分析条件,接受客户查询指令,最后展现查询结果。客户端程序使用的技术有HTML、XML、JAVASCRIPT、CSS、AJAX、JSP等。应用层主要处理应用逻辑,LQuery的核心模块也位于该层,它部署于中间件应用服务器。目前支持的中间件服务器有Tomcat 、JBOSS、WebLogic等。 应用层程序使用的技术有SERVLET、JAVABEAN和EJB等。数据层是保存LQuery所要处理的原始数据的,数据层的数据可以是文本文件也可以是数据库。LQuery支持的数据库是MS Access、MS SQL Server、Sybase、Oracle等。小灵呼L系列的产品均以LQuery作为核心基础架构,如下图:2.2 系统设计原则LQuery的设计原则考虑以下几个方面的要求:性能、可靠性、吞吐量、可扩充性、可管理性、可重用性和安全性。2.2.1 性能LQuery的性能一般用一个用户终端对某一个操作的响应时间来衡量,如不考虑后台数据库性能的开销,LQuery对以下各类操作的处理时间为:操作类型处理时间对表或基于存储过程的数据清单不超过2秒对表的汇总性角度分析不超过10秒对后台返回的数据进行图形展示不超过2秒2.2.2 可靠性LQuery在生产运行系统中应该支持724小时不间断运行的要求。2.2.3 吞吐量LQuery应该支持一定的并发量,保证在多个前端用户同时进行查询分析的时候,系统能维持客户满意的处理性能并同时保证系统稳定运行不崩溃。系统能支持的并发用户数应至少在20个以上。2.2.4 可扩充性LQuery的可扩充性体现在两个层面:应用层和开发层。应用层的可扩充性是指平台提供的配置化的增加应用查询分析功能的能力,用户在不影响已有系统功能的前提下可以方便地增加额外的功能或修改已有功能。开发层的可扩充性体现在源程序的易于扩充和修改,这往往通过低耦合、接口和封装等设计技术去实现。2.2.5 可管理性LQuery应该有友好的用户界面,易于管理和维护,并允许动态的系统配置管理。2.2.6 可重用性LQuery的组件应该能最大程度可重用,以提高开发和管理效率。2.2.7 安全性LQuery通过提供用户认证、功能权限和数据权限从而保证系统的安全性。2.3 设计思想和方法2.3.1 三层体系结构LQuery使用三层的B/S体系架构,即将应用功能分成表示层、功能层和数据层三个部分。表示层是应用的用户接口部分,它负担应用和用户间的对话。功能层负责处理具体的业务逻辑。数据层负责对数据库或文件数据的读写。这种三层的体系结构具有以下特点和优越性:客户端零维护、可扩展性好、安全性好和可移植性好。2.3.2 基于JAVA/J2EE/SOA/XML/AJAX的技术JAVA/J2EE/SOA/XML/AJAX技术可以支持分布式的企业应用模型,可以提供可扩展的,模块化的组件开发模式和组件装配技术。基于JAVA/J2EE的企业应用可以方便快捷地部署到任意JAVA应用服务其平台产品之上,从而实现“一次开发、处处可用”的理想目标。基于SOA的服务请求处理模式可以更好地解决企业内部多种系统之间的互联互通及数据共享,实现系统之间的轻耦合。而XML技术更是为系统之间的数据传递提供了更标准的表达方式。AJAX技术的广泛应用更是改善了用户的操作体验,通过页面的无刷新技术,使用户的页面执行效率得到了极大的提高。2.3.3 业务功能多样化且灵活配置LQuery可以对数据库中的表或视图进行清单式查询,也可以对能返回数据的存储过程做清单式查询,也可以对表或视图进行汇总性的分析查询。LQuery各个查询功能是通过XML文件配置产生的,对各个功能的修改只需要修改配置文件,无需重新启动应用服务器或重新登录。LQuery所需的各类代码表是从XML配置文件产生的或者动态从数据库读取,无需在源程序中维护。LQuery通过对XML的配置,可以对数据库表记录的内容直接进行修改操作,同时也可以对文本文件或excel文件的进行修改或批量读取。LQuery从在个层面上来说可以是struts+hibernate的替代品,但是LQuery使用起来更方便,功能更强大。2.3.4 数据展现方式的多样化LQuery对查询结果可以以系统自定义的风格进行展现,保持界面的一致性,用户也可以自己定义页面展现的风格。系统的自定义的风格有:表格、饼图、柱状图、线图、柱状图3D和饼图3D等。通过LQuery的定制,开发者可以自己开发数据的展现页面。2.3.5 安全控制模块和业务功能模块相互独立LQuery对每一个用户请求URL是通过WEB服务器提供的过滤器技术Filter实现合法性检查的,系统通过配置文件提供了对不同的页面的检查方式。在Filter过滤器基础上,平台提供了对操作人员及及其机构进行权限控制的功能,而业务功能模块无需关注安全控制是怎么实现的,只需专注业务功能的实现。2.4 LQuery体系架构LQuery体系架构如下图: Web客户端发起的所有操作请求均通过Servlet Dispatcher派发,比如,对于查询分析类的请求转由Servlet QueryAck处理,QueryAck调用业务层处理逻辑BizLayer。BizLayer根据不同的查询类型访问数据库或文件,获得查询结果返回给QueryAck。 QueryAck根据该查询的展现类型将数据转交应答页面AutoAck.jsp或其它自定义页面处理。2.4.1 数据库查询分析对于数据库查询分析类的操作请求,BizLayer可以处理的查询类型有:n V对某个表或者视图的清单式的明细查询。n P调用存储过程,以取得返回数据。n A通过指定计算项及分析角度对表或视图中的数据进行汇总计算并返回结果。n A横向趋势分析,比如汇总计算某年内各个月份的指定计算项,并返回结果。n A|纵向对比分析,比如汇总计算同一个月份不同年份的指定计算项,并返回结果。同时将计算项分为以下几类:n 1 直接从本查询配置的表中取数。n 2复合计算列,表达式的各字段必须都在本查询配置的表中n 4比重n 5复合计算列,表达式各字段不一定在一个同一个表中,合计项从本列取n 6复合计算列,表达式各字段不一定在一个同一个表中,合计项从本行取n 7从本查询的配置文件中直接取表达式n 8从附加查询取数2.4.2 数据库修改对于数据库修改类的操作请求,BizLayer可以处理的操作类型有:n delByIndexFields根据主键集合批量删除记录。n delByIndexField根据主键删除记录。n updateByIndexField根据主键修改记录。n batchUpdate根据条件批量更新记录。n batchInsert批量插入。n Insert单次插入。n fastSQL自定义SQL语句操作。2.4.3 文件操作对于文件操作类的操作请求,BizLayer可以处理的操作类型有:n batchRead批量读取文件。n updateSegmentByIndex更新文件片段。n delSegmentByIndex删除文件片段。n delFieldInSegmentByIndex删除文件片段中的某个字段。n addSegmentByIndex增加文件片段。n uploadFile上传文件。n delUploadFile删除上传的文件。2.4.4 数据接口LQuery处理后的数据结果以一个ArrayList数组的方式存储。比如:一个查询同时对多个表或存储过程进行查询,则每个表或存储过程的查询结果以一个ArrayList存储,所有表的结果又以一个最终的ArrayList存储。每个表或存储过程的查询结果是有一条或多条记录的。对于每一条记录,是用一个HashMap存储其所有的字段名和值的。参见以下存储结构图:第三章 配置文件分析LQuery的功能主要是通过配置文件查询类配置文件:vWebRootscqoaccess *.xml,数据库修改类配置文件:vWebRootscdoaccess*.xml 及文件操作类配置文件fo_config.xml实现。对应scqoaccess、scdoaccess又分别存在两个文件夹ucqoaccess、ucdoaccess,uc代表user defined(用户自定义的),如果同一个文件同时存在在于ucqoaccess和scqoaccess,则系统将优先使用uc目录下的。每一类数据库查询有个ID即query_id,每一类数据库修改操作有个ID即do_id,每一类文件操作也有个ID即fo_id。这些ID会在分别存在于目录qoaccess、doaccess及文件fo_config.xml里。3.1 数据源的定义在正式发布的版本中,LQuery目前支持MS Access和MS SQL server数据源,缺省数据源在软件管理界面的业务参数页面配置或者在app_config.xml中配置。缺省数据源在查询类XML和数据库修改类配置文件中无需特别指定,如需要操作其它数据源,可增加段指定。而这个数据源也需预先在vWebRootdb_config.xml中配置好。dSql Server 数据源的配置范例:- mssql_1 !这行填上数据源的名称 这里是备注 mssql !这行填上数据源的类型,有mssql 和 access 两种可选 !这行填上数据源的IP,装sqlserver的机器的IP 1433 !装sqlserver的机器的sql server端口 vr !sqlserver数据库的名称 sa !sqlserver数据库的用户名称 lcall !sqlserver数据库的用户密码 定义好的数据源在查询类xml中使用范例:qo_m6mobile mssql_1 !这行填上本查询使用的数据源V100%.省略3.2 数据库明细查询3.2.1 什么是明细查询?明细查询指得是从数据库中查询一个表或多个表或视图(视图在access中叫查询)的1条或若干条未经汇总的原始数据记录。比如以下SQL语句均为明细查询的语句:Select * from workersSelect *from workers where name=“张三”Select v_ workers.name, v_ workers.age from v_ workersv_ workers其实是一个视图,它是workers和team 的关联,以上语句实际等同于以下语句:Select workers.name, workers.age from workers a , team b where a.team_id=b.team_id where b. team_name=“二班”3.2.2 查询类xml配置说明LQuery通过配置查询类xml文件可以实现以上的明细查询。用于明细查询的xml样式如下: query_workers查询员工信息V query_workers2 name40名字age40年龄name=charagenianlinleint_additional_con_add addteam_idteam_id=charteamteam_idteam.team_namephone1phone=charphone2 phone=charphone3 phone=charphone4 phone=charworkers mid(code_area3,5,4) = 0000 and mid(code_area3,3,2) <> 00 andlen(name_area3)0 age desc manu workers_ack.jsp workers_top.jsp workers_query2 以上文件必须以query_id作为文件名保存即文件名必须是 query_workers.xml配置说明:xml的段说明query_id一个.段的唯一标识,前台查询页面的form表单(以后简称form表单)中必须显式地指定query_id。description用来描述该明细查询的,对操作没影响。qtype可选择V或P,参见aid附加查询的query_id,通过附加查询可以一次性地产生多个查询的结果statement直接写sql语句,比如select * from workers或select distinct code_skill as code,name_skill as name,id_skill as id from dm_skill order by id_skill ascconditionSQL条件where条件语句就是由构造的,每个condition构造的条件语句之间是且即and 的关系。condition/codecode对应的是数据库中表的字段名同时根据code从form表单中取值作为查询条件。比如:name=char构造的条件语句为 name=张三如果code为_additional_con_,代表直接从前台页面的form表单中取字段名为_additional_con_的值作为查询条件。condition/idid对应的是前台页面中form表单的字段名,如果没有id则使用code,LQuery在创建查询条件时候,首先取form表单中的id对应的值,如果没有,则取code对应的值。condition/expr对应where条件语句中的关系符号= 表示 =ge表示 =le表示 =gt表示 lt表示 add表示condition/code为_additional_con_condition/type数据库中表的字段的类型,支持char,datetime,numeric,text,int,long,addcondition/or_code/or_id/or_expr/or_type.condition/or_code_10/or_id_10/or_expr_10/or_type_10为一个condtion构造or查询语句,比如以上例子构造的or语句为( phone1=122 or phone2=122 or phone3=122 or phone4=122)team_idteam_name=charteamteam_idteam.team_name构造和其它表相关联的查询语句,比如假设form表单传入的team_name的值为二班,则构造的语句为select . from workers , team where workers.team_id=team.team_id and team.team_name=二班join_table:被关联的表的表名join_code:被关联的表的关联字段statement_code:关联时候使用的条件语句tabwidth自动显示查询结果时表格的宽度(需要和前台页面配合使用)。age40年龄每次查询的结果及本查询的所有field段将会被LQuery返回给前台页面,以自动显示查询结果(需要和前台页面配合使用,参见。code:所有的code均以名为Field_AL的ArrayList数组的方式在session中返回。width:页面该字段的宽度,均以名为Field_Width的ArrayList数组的方式在session中返回。name:页面该字段的中文名,均以名为Field_Name_AL的ArrayList数组的方式在session中返回。如果该字段为动态字段,code可以写成xml_df.1或xml_df.2,其中xml_df是动态字段在数据库中的名字且必须以_df结尾。additional_con在SQL查询语句中直接附加条件,比如比如: mid(code_area3,5,4) = 0000 and mid(code_area3,3,2) <> 00 and len(name_area3)0Mid是access自带的一个函数: 从一个文本字符串的指定位置开始,截取指定数目的字符 如code_area3=”123456789” 则mid(code_area3,5,4)=”5678” <,>分别对应 因为在xml中为保留字,所以分别用< ,>代替只需要按access语法去使用access自带函数,当当前实际数据库为MS SQL server的时候,系统会自动转化成SQL server的自带函数。order_by是在SQL语句中追加order by语句,比如:age asc 代表查询结果以age升序排序age desc 代表查询结果以age降序排序style查询结果的显示模式,auto: 通过系统页面自动显示;manu:通过ackjsp或forward指定的页面显示ackjspLQuery在执行查询后跳转到所定义的页面显示相关结果topjsp存放查询条件的页面,也就是向LQuery发起操作请求的页面 workers_query2 w 也是用于在执行查询语句后跳转到所定义的页面,但是是有条件跳转,中定义条件,如果页面传过来的forward等于中的值,则跳转否则不跳转。是无条件跳转,优先级没有高,如果条件不满足,则执行跳转3.3 数据库汇总分析3.3.1 什么是汇总分析?汇总分析指得是从数据库中查询一个表或多个表或视图(视图在access中叫查询)的数据再根据一定的角度进行聚合统计产生相应的结果。比如以下SQL语句均为汇总分析的语句:Select team_id ,sum(wages) as wages_total from workers group by team_id按班组编号分类汇总每个班的薪水总和。SELECT b.team_name AS name, sum(a.wages) AS wages_total FROM workers AS a, workers_team AS b 按班组名称分类汇总每个班的薪水总和。SELECT b.team_name AS name, sum(a.wages) AS wages_total FROM workers AS a, workers_team AS b and sex=男 按班组编号分类汇总每个班的男员工的薪水总和。因为workers表本身只存有班的编号,不存放班的名称,可以通过和代码表(维表)workers_team进行关联进行汇总。3.3.2 xml配置说明LQuery通过配置xml文件可以实现以上的汇总。用于汇总分析的xml样式同明细查询,它们可以共用一个文件。:格式如下: ana_workerssample汇总分析员工薪水Aana_workers_numwages_total薪水10.00wages_ratio比重 wages_total 4% num_workers 人数81num_workers_abc0num_workers_ratio人数比重 num_workers 4%wages_avg平均工资5wages_total/num_workers0.00sex=charcode_teamteam_idworkers_teamteam_id workers_team.time_nameworkersborn_datemanu/sample/ana_workers_top.jsp/query/ana_workers_ack.jsp ana_workers_numsample汇总分析员工人数Anum_workers人数7count(*)0sex=charcode_teamteam_idworkers_teamteam_id workers_team.time_nameworkersborn_datemanu/sample/ana_workers_top.jsp/query/ana_workers_ack.jsp 配置说明:xml的段说明query_id一个.段的唯一标识,前台查询页面的form表单(以后简称form表单)中必须显式地指定query_id。description用来描述该明细查询的,对操作没影响。qtypeA,参见aid附加查询的query_idstatement需要汇总的主表表名,非代码表。conditionSQL条件where条件语句就是由构造的,每个condition构造的条件语句之间是且即and 的关系。具体可以参见明细查询的说明。wages_total薪水10.00falsefield字段用以表示汇总查询的显示结果,如果field/display的值为false,将不显示该字段field/code:字段名field/name:字段的名称,将会显示在页面的表格头部field/mtype:参见计算项分类field/nformat:显示的数字的精确度0代表整数,0.0代表小数点后1位,0.00代表小数点后2位,以此类推 num_workers 人数81num_workers_abc0这是个通过附加查询取数的例子,员工人数可通过附加查询ana_workers_num取得,再被ana_workers所用,如果有多个附加查询,则以aquery_idx以1开始往后类推。code_teamteam_idworkers_teamteam_idworkers_team.time_name汇总分析的分析角度以,一个汇总分析可能要用到的分析角度,均要定义。code:分析角度的标识,该标识应该从页面form表单传入tabfield:对应主表的字段join_table:分析角度对应的代码表(维表)的表名join_code:代码表的关联字段statement_code:显示代码表字段的名称born_date当需要进行横向趋势分析或纵向对比的时候需要指定时间维对应的字段stylemanu:通过ackjsp指定的页面显示ackjspLQuery在执行查询后跳转到所定义的页面显示相关结果topjsp存放查询条件的页面,也就是向LQuery发起操作请求的页面3.4 数据库修改操作3.4.1 什么是数据库修改操作?数据库修改操作会对数据库中数据内容产生变化,比如表记录的增加或减少,表中某条记录某个字段的值的变化。以下SQL语句均为数据库修改操作语句:insert into workers ( id,team_id,name, age)values (1000,2,张三,20)update workers set age=20 where id=1000delete from workers where id=10003.4.2 数据库修改类xml配置说明LQuery通过配置xml文件可以实现以上的数据库修改操作的。xml样式如下: do_workers有关workers的数据库修改Tid员工号chartrueteam_id班组编号intname姓名charage年龄intage=intworkers update_workers update 配置说明:xml的段说明do_id一个.段的唯一标识,前台查询页面的form表单(以后简称form表单)中必须显式地指定do_id。description用来描述该操作的,对操作没影响。dtype指定为Tidid员工号chartrue是数据库中的字段名是字段的中文名称,无实际用途是指数据库中该字段的类型,支持char,datetime,text,df,numeric,double,int,long表示该字段是否为主键段可为多个,要修改数据中哪些字段就需要定义对应的注意当本字段为动态字段时候,本字段的名字必须以_df结尾,且type必须为df,一般来说动态字段不建议作为主键。如果从form表单传入的该字段的值为_NULL_,则不修改该字段的内容。id对应的是前台页面中form表单的字段名,如果没有id则使用code。condition用于构造更新或删除操作的条件,参见query_config中的描述。additional_con在SQL语句中直接附加条件statement数据库修改的对象即表名ackjspLQuery在执行后跳转到所定义的页面显示相关结果topjsp存放向LQuery发起操作请求的页面forward条件跳转,参见query_config中的描述。3.5 文件操作3.5.1 什么是文件操作?LQuery支持的文件操作有读取和修改,读取支持的文件格式有两种,第一种:以某个分隔符分隔的多行文本文件如下:111,2222,2333,3222,aaa,bbb,122,2222,2333,3222,aaa,bbb,133,2222,2333,3222,aaa,bbb,第二种:以段为单位的多行文本文件如下:totalnumber=500id=1name=张三age=26id=2name=李四age=30目前LQuery支持第二种格式的修改操作。3.5.2 fLQuery通过配置f实现以上格式的文件操作的。fo样式如下:fo_workers读取员工信息R,id员工号name姓名age年龄 autoAckMng /do/cust_add_batch2.jsp /do/cust_add_batch.jsp 配置说明:f说明fo_id一个.段的唯一标识,前台查询页面的form表单(以后简称form表单)中必须显式地指定fo_id。description用来描述该操作的,对操作没影响。ftypeR代表以上描述的第一种文件格式R2代表以上描述的第二种文件格式delimiter分割符,当ftype=R时候有效postFileExecuter文件读取完了之后交由postFileExecuter指定的类再处理一次id员工号field段当ftype=R时候才有效。设置由分割符分割下的各个字段对应的名称是字段的中文名称,无实际用途段可为多个,要修改数据中哪些字段就需要定义对应的 total numbersegment段当ftype=R2时候才有效。用以表示如下的格式:totalnumber=500indexId表示该段的名字code表示该段以下的字段名字,可以写一个或多个ackjspLQuery在执行后跳转到所定义的页面显示相关结果topjsp存放向LQuery发起操作请求的页面forward条件跳转,参见query_config中的描述。第四章 实例讲解4.1 建立示例数据库 在vr.mdb文件中创建一个名为workers的表。1)2) 点击新建,选择设计视图3) 输入各个字段的名称和数据类型4) 这里依次输入id(类型:文本,长度:10),name(类型:文本,长度:20),team_id(类型:数字),sex(类型:文本,长度:2),wages(类型:数字) 5) 关闭新建表并且命名为workers.ers就建立好了,如下图:再往该表中加入一些模拟数据。4.2 通过表单按条件明细查询配置文件query_workers.xmlquery_workerssample例子Vid=/expr
展开阅读全文