CN104572047A - 一种基于Apache Tomcat的WEB数据库开发组件方法 - Google Patents
一种基于Apache Tomcat的WEB数据库开发组件方法 Download PDFInfo
- Publication number
- CN104572047A CN104572047A CN201310489749.2A CN201310489749A CN104572047A CN 104572047 A CN104572047 A CN 104572047A CN 201310489749 A CN201310489749 A CN 201310489749A CN 104572047 A CN104572047 A CN 104572047A
- Authority
- CN
- China
- Prior art keywords
- data
- class
- database
- vector
- type
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
一种基于Apache?Tomcat的WEB数据库开发组件方法是利用MVC模式的封装,使整个JDBC数据库连接过程对程序员来说变的透明,程序员在开发中可以绕开繁琐复杂的JDBC数据库连接步骤,而只需面对由网络数据库开发组件提供的统一的编程接口。
Description
技术领域
一种基于Apache Tomcat的WEB数据库开发组件方法主要是涉及计算机领域中的数据存储技术。
背景技术
第三代Web数据库使所有对数据库的操作(增加、删除、修改)、信息的查询和管理都通过统一标准的Intemet浏览器界面来进行,这对于那些终端用户来说是极好的方式,也更加适应Intemet技术的发展和网络互连的需要。和许多传统的数据库一样,web数据库是一种可供用户访问的数据仓库或信息存储库,然而wcb数据库是一个新的研究领域,与传统数据库系统又有许多不同的方面,例如:体系结构不同、访问方式不同、访问的用户不同、客户端简化等。正是这些不同,决定了WEB数据库程序的复杂性。为了解决这种复杂性,各个公司都纷纷推出自己的解决方案,中间件的概念也应运而生。
发明内容
通过国家专利检索没有发现关于此系统方面的申请资料。
对JDBC进行对象化改进,以期达到如下效果:1)将整个数掘库连接过程封装,屏蔽掉其间复杂繁琐的连接步骤;2)让封装后的JDBC连接对象对程序员提供统一的编程接口,使程序员可以使用同样的函数方法来实现不同的数掘库操作。
为了实现上述要求的第一项,也就是实现JDBC数据库连接的封装,首先将整个JDBC数据库连接过程封装入一个叫做DBAceess的类中。按照MVC的设计思想,控制层正好能实现上述要求中的第二项,因此在对象化后的YDBC连接类中,控制层就是为程序员提供的统一编程接口。这样我们就需要让这个接口实现MVC模式中控制层的功能。期望最终用户只需与这个统一编程接口对话即可,而不用理会数据库连接的具体方法和细节。DBAcccss类中创建一个public方法,叫做DBControl,然后将DBControl方法作为整个DBAcccss类中的控制层。
按照MVC设计模式思想,我们将整个JDBC开发组件分为三层:表示层、控制层和模型层。在DBAccess类我们封装了控制层和模型层。利用public方法DBControl来实现用户请求的初步处理和数据分流,利用四个private方法来分别实现用户不同的数据库操作请求。另外创建两个辅助类Const类和Data类来提高整个数掘库丌发组件的性能。
Const类的实现:
另外创建一个Const类,专门用来存储整个程序所需要的各种常量,将上述各个字符串变量作为Const类的全局变量存储。当需要连接时,从Const类提取相应字符串变量传递给DBAccess类,当系统所选用的数据库产品更改时,我们只需重新编译存储这些参数的Const类即可。
const类的代码:
public final class Const{
public static string SQLDRIVERNAME=”org.git.mm.mysql.Driver”;
public static string SQLURL=”jdbc:mysql://DLMUDXF/TEXT”;
public static string SQLUSERID=”ROOT”;
public static string SQLPASSWORD=””;
}
其中SQLDRIVERNAME存储JDBC数据库连接所需要的数据库驱动程序名。SQLURL存储数据库的地址。SQLUSERID存储登录数据库所用的用户名。SQLPASSWORD存储登录用密码。当JDBC连接的数据库系统发生变化时,或者该系统的相关参数发生变化,我们只需修改Const类中相应字段即可。
Data类的实现:
Data类是在Hashtable类型基础上改进得到的,他是一种适于存储数掘库查询结果集的数据类型。因此,在Data类中我们设计了三个主要的私有属性,用柬存放相关的数据。
Private Hashtable data=null;
Private int index=-1;
Private Vector columnNameVec=null;
其中private Hashtable data就是最终用来存储数据库查询结果集的哈希表。private im index是用户在使用Data对象时所需要的虚拟指针。private Vector columnNameVec是一个向量,用来存储数据库查询结果集的列名,也就是查询出末的数掘库表的字段名。这罩之所以使用Vector向量这种数据结构,主要是考虑到Vecmr向量可以自伸缩的特点。因为在实际使用中,我们查询的数据库表的字段数日是小确定的,因此我们需要Vector向量这种灵活的,可以自己伸缩长度的数掘结构来存储相应的数据库表字段名。这三个属性都被设置成private型私有变量,这也是符合面向对象的封装思想的。用户如果需要获得者三个属性,不能直接读取他们,而必须通过相对应的函数方法来取得。因此我们在Data类中定义了三个函数方法,专门用来取得相对应的属性。例如,如果想要取得private Hashtable data,程序员必须通过getTable方法。GetTable方法的代码如下:
Public Hashtable gettable(){
Return data;
}
Data类中最重要的一个方法,是public Data(ResultSe!t p_da诅)方法,这也是Data类的初始化函数。其功能是对传入的ResultSet类型的参数p_data进行数据解构,并存储到Hashtable data中。public Dat“)方法的具体代码如下:
public Data(ResultSet p_data){
try{
this.data=new Hashtable0;
im fieldCount 2 p_data.getMetaDataO.getColumnCountO;
columnNameVec=new Vector();
for(inti=1;i<=fieldCount;i++){
String columnName 5 p_data.getMetaData0.getColumnName(i);
columnNameVec.addElement(colunmName);
Vector columnValue=new Vector();
this.data.put(columnName,columnValue);
)
int recordNum=O:
while(p data.next()){
recordNum++;
for(intj 2 1;j<_fieldCount;j+十){
String columnName 2 p-data.getMetaData0.getColumnName(j);
int columnType。p_data.getMetaData0.getColunmType(j);
Object value=null;
switch(columnType){
case java.sql.Types.TIMESTAMP:
case java.sql.Types.DATE:
case java.sql.Types.TIME:
value 2 p_data.getTimestamp(eolumnName);
break;
default:
String tempValue
5 p_data.getString(columnName);
if(tempValue 12 null)
value=new String(tempValue);
break;
}
if“(vector)this.data.get(columnName)).size0<recordNum){
((Vector)this.data.get(columnName)).addElement(value);
}
)
}
this.data.put(”data_size”,new Integer(recordNum));
}catch(SQLException sqlException){
System.out.println(”There are some sqlexception”);
}catch(Exception ioException){
System.out.println(”There are some ioException”);
)
)
首先Data方法的参数是ResultSet类型的p_data,这样设计有很大好处。程序员使用Data类型创建Data对象实例的同时,传递进来的ResultSet结果集,会被该Data方法自动处理,并存入Data对象实例中。
int fieldCount=p_data.getMetaData0.getColunmCount0;
columnNameVec=new Vector();
for(inti=l;i<_fieldCount;i++){
Stnng columnName=p_data.getMetaData0.getColumnName(i);
columnNameVec.addElement(columnName);
Vector columnValue=new Vector();
this.data.put(columnName,columnValue);
}
上面这段代码的作用是获得传递进来的ResultSet结果集所包含的字段的个数,并将各字段的名称存入向量columnNameVec中。与此同时,每一个ResultSet结果集中包含的字段都相对应的创建了一个向量eolunmValue,并将这些向量实例放入data中。也就是说,每一个ResultSet结果集中包含的字段,都对应了一个向量,这些向量是用柬存储ResultSet结果集中对应字段的所有数据的。直观的理解,上面每一个向量,实际上对应着获得的ResultSet结果集中的一列。这样我们也就明白为什么要使用向量Vector这种数据结构了,这正是因为ResultSet结果集中一列的长度并不一定。也就是说ResultSet结果集的记录条数并不一定,因此要使用灵活方便的向量Vector类型。之后的int recordNum用来存储ResultSet结果集的记录条数。而再接下来的while(p_data.next0)循环则是整个Data方法中最关键的部分,正是在这个部分中我们实现了从ResultSet类型到Data类型的转换。while(p_data.next())循环针对每一条ResultSet结果集的记录进行一次循环,也就是ResultSet结果集的每一行进行一次循环。在这样一次循环中,我们主要完成下列工作:RecordNum记泉条数加一。
第二,针对每一行中的每一列再进行一次内层循环,这是通过for(intj=1;j《=fieldCount;j++1来实现的。现在我们已经拥有了两层循环,这样对于ResultSet结果集这种二维数据结构来说,我们已经可以针对每一个行列交叉的节点进行操作了。在Data方法中,我们正是通过对每一个节点相关的处理,来实现从ResultSet类型到Data类型的转换的。
在每一个节点上我们主要完成了两部分工作。首先我们对该节点的数据类型进行判断,并根据判断的结果采取不同的方法将该节点的数据转化成统一的Object类型的value。其次,我们将各个节点取得的value值,存入到前文所述的data的各个向量之中。
我们之所以要对节点的数据类型进行判断,是因为对于不同的数据类型,ResultSet类提供了不同的处理方法。这种判断是通过分支判断语句switch(columnType)来实现的。在这个switch分支结构中,各个case后面的变量都是Java本身提供的Int型常量。通过匹配,我们可以选择合适的方法来取个各个节点不同的数掘类型。例如,我们可以使用getTimestamp方法取得数据库中的各种时间类型数据,通过getString我们可以取得其他各种类型的数据。而之所以将不同的数掘类型都转换为Object类型,是因为考虑到最终他们都要存储在哈希表结构的Hashtable data中。这罩使用Object类型也是有原因的。Object类是Java语言中最基础的一个类,可以说,所有的其他类,都是Object类的子类。因此我们可以将所有其他类型转化为Object类,在使用时又可以通过Java提供的强制类型转化方法将Object类型的数据重新转换为原始的数据类型。
最终我们通过((Vector)this.data.get(columnName)).addElement(value);这个方法将各个节点取得的value值存入到data的各个向量之中。当两层循环结束之后,我们已经得到了一个Hashtable类型的data对象。在这个data对象中,每一个元素都是一个向量,每一个向量对应着数据库的一列。而程序员在使用data对象时会根据不同向量的名称,也就是数据库的字段名,来取得相对应的一列数据。最后根据节点所在的行数取得需要的节点的数据值。另外Data类也提供了几个数据读取方法,getString、getInt、getDate等,他们用来取得相对应数据类型的数据。
DBAccess类的实现:
述,DBAccess类是整个WEB数据库开发组件的核心类,数据库连接和SQL文的执行都在这个类中实现。利用MVC模式,我们将DBAccess类中的DBControl方法作为控制器,来实现对用户请求的分流;利用sqlRetumResultSet、sqlReturnData、sqlRetumString、executeUrIdate这四种方法分别处理用户对数据库的不同请求操作,并取得用户期待的不同数据类型的返回值。
DBOontro I方法的实现:
public synchronized Object DBControl(Stfing strSQL,int dbcode){
Object obj=null;
switch(dbcode){
casel:
String[][】Stringresult=sqlReturnString(strSQL);
obj2Stringresult;
break;
case2:
Data dataresult=sqlReturnData(strSQL);
obj=dataresult;
break;
case 3:
ResultSet rsresult=sqlRetumResultSet(strSQL);
obj。rsresult;
break;
case4:
boolean rsboolean=executeUpdate(strSQL);
if(rsboolean=-lrue){
obj=”true”:
}else{
obj=”false”;
}
break;
default:
break;
}
return obj;
}
DBControl方法的参数有两个,strSQL是用户期望执行的SQL语句;dbcode则是用户期望的返回值的类型码。当dbeode=l时,代表用户期望执行数据库查询操作,并期待返回String[][]类型的返回值;当dbcode--2时,代表用户期望执行数掘库奁询操作,并期待返回Data类型的返回值;当dbcode=3时,代表用户期望执行数掘库查询操作,并期待返回ResultSet类型的返回值;当dbcode=4时,代表用户期望执行数掘库插入、删除或者更新操作,并期待返回boolean类型的返回值。对用户请求的分流正是利用了dbcode的不同值,进行switch分支判断,进而决定调用哪一个执行方法来执行用户提交的SQL语句。例如当dbcode=l时,调用sqlRetumString方法来执行用户提交的数据库查询语句,并返回String[]fl类型的返回值。与前面的Data类中Object类型的使用原因一样,因为用户期待不同的返回值类型,我们只能将这些不同类型的返回值统一转化为Object类型传递给用户。在用户使用时利用强制类型转换方法将他们转换为用户需要的数据类型。
sqlReturnData方法的实现:
因为sqlRetumResultSet,sqlRetumData、sqlRetumString、exeeuteUpdate这四种方法的实现比较相似;接收到DBControl方法传递过来的用户提交的SQL语句之后,sqlRemmDam方法具体的实现了创建并维护数据库连接、创建SQL执行容器、取得并处理结果集这三大步骤。这些步骤是在ny函数体中完成的。
try{
connection 2 getConnectionO;
statement=connection.createStatement();
rs=statement.executeQuery(strSQL);
dataresult=new Data(rs);
}
考虑到整个DBAccess类中有四种方法都需要刨建于数据库的连接,我们将这部分工作单独提炼出来作为一个独立的方法来实现。这与传统的连接创建方法不同是中通过一个私有函数getConnection来实现数据库连接的创建工作。
在sqlRetumData方法中,connection=getconnection()这条代码实现了这部分功能。
在getConnection方法中,创建连接所需要的各个参数都是从Const类中传递过来的。这样做的好处前文已经详细讲解,这里不做细述。接下束两条语句“statement=connection.createStatementO;”和“rs=statement.executeQuery(strSQL)”分别执行了创建SQL执行容器、取得结果集这两个步骤。而最后对结果集的处理则利用了Data类中的初始化函数Data()来实现。
最后在finally函数体中,我们完成了数据库连接的关闭与释放工作。
finally(
try{
if(null I-statement){
statement.close0;
statement=null;
)
if(null!=eonnection){
connection.close();
connection=null;
}
}catch(SQLException ex){
System.out.println(”sqlReturnData SQLException!”);
)
}
在sqlReturnData方法中完成了整个的数据库连接处理工作,并返回了一个Data类型的返回值给DBControl方法,最后由DBControl方法将其提交给用户。
Claims (10)
1.一种基于Apache Tomcat的WEB数据库开发组件方法,其特征是将整个数掘库连接过程封装,屏蔽掉其间复杂繁琐的连接步骤;让封装后的JDBC连接对象对程序员提供统一的编程接口。
2.根据权利要求1的要求将整个JDBC开发组件分为三层:表示层、控制层和模型层。
3.根据权利要求2的要求将创建DBAccess类,其DBAccess封装了控制层和模型层;利用public方法来实现用户请求的初步处理和数据分流,利用四个private方法来分别实现用户不同的数据库操作请;创建两个辅助类Const类和Data类来提高整个数掘库丌发组件的性能。
4.根据权利要求2的要求其Const类的主要功能是存储在整个WEB程序中所用道的各种常量;Data类是在Hashtable类型基础上改进得到的,他是一种适于存储数掘库查询结果集的数据类型。
5.根据权利要求2的定义则定义三种变量private Hashtable data就是最终用来存储数据库查询结果集的哈希表。
6.private im index是用户在使用Data对象时所需要的虚拟指针。
7.private Vector columnNameVec是一个向量,用来存储数据库查询结果集的列名,也就是查询出末的数掘库表的字段名。
8.两层循环,这样对于ResultSet结果集这种二维数据结构来说,我们已经可以针对每一个行列交叉的节点进行操作了。
9.在Data方法中,我们正是通过对每一个节点相关的处理,来实现从ResultSet类型到Data类型的转换的, 这个data对象中,每一个元素都是一个向量,每一个向量对应着数据库的一列。
10.而程序员在使用data对象时会根据不同向量的名称,也就是数据库的字段名,来取得相对应的一列数据。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310489749.2A CN104572047A (zh) | 2013-10-18 | 2013-10-18 | 一种基于Apache Tomcat的WEB数据库开发组件方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310489749.2A CN104572047A (zh) | 2013-10-18 | 2013-10-18 | 一种基于Apache Tomcat的WEB数据库开发组件方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN104572047A true CN104572047A (zh) | 2015-04-29 |
Family
ID=53088222
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310489749.2A Pending CN104572047A (zh) | 2013-10-18 | 2013-10-18 | 一种基于Apache Tomcat的WEB数据库开发组件方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104572047A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110691263A (zh) * | 2018-07-05 | 2020-01-14 | 武汉斗鱼网络科技有限公司 | 同步本地与服务器时间的方法、介质、电子设备及系统 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101110030A (zh) * | 2007-08-23 | 2008-01-23 | 南京联创科技股份有限公司 | 基于java的数据库持久层的开发方法 |
CN103294831A (zh) * | 2013-06-27 | 2013-09-11 | 中国人民大学 | 列存储数据库中基于多维数组的分组聚集计算方法 |
-
2013
- 2013-10-18 CN CN201310489749.2A patent/CN104572047A/zh active Pending
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101110030A (zh) * | 2007-08-23 | 2008-01-23 | 南京联创科技股份有限公司 | 基于java的数据库持久层的开发方法 |
CN103294831A (zh) * | 2013-06-27 | 2013-09-11 | 中国人民大学 | 列存储数据库中基于多维数组的分组聚集计算方法 |
Non-Patent Citations (1)
Title |
---|
YANGXIAOJUN9238: "Java经典封装JDBC模板(充分体现面向对象思想)", 《HTTP://BLOG.CSDN.NET/YANGXIAOJUN9238/ARTICLE/DETAILS/7350169》 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110691263A (zh) * | 2018-07-05 | 2020-01-14 | 武汉斗鱼网络科技有限公司 | 同步本地与服务器时间的方法、介质、电子设备及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107491561B (zh) | 一种基于本体的城市交通异构数据集成系统及方法 | |
CN102054025B (zh) | 交通信息资源整合处理方法及系统 | |
CN100468396C (zh) | 用于任意数据模型的映射体系结构 | |
US9146955B2 (en) | In-memory, columnar database multidimensional analytical view integration | |
CN101799826B (zh) | 一种基于虚拟视图的网络化数据共享系统及方法 | |
US20070294215A1 (en) | Method, system, and program product for generating a virtual database | |
EP0996907A1 (en) | Object to relational database mapping infrastructure in a customer care and billing system | |
CN102033748A (zh) | 一种数据处理流程代码的生成方法 | |
CN102402507B (zh) | 一种soa多消息机制的异构数据集成系统和方法 | |
CN109194762B (zh) | 基于ssh的土壤信息网络发布系统及方法 | |
CN103559189A (zh) | 基于元数据集成模型的电力仿真培训资源管理系统及方法 | |
CN104133889A (zh) | 一种数据库虚拟化微内核数据源注册与封装方法 | |
CN100447781C (zh) | 用于将可扩展标记语言映射到n维数据结构的方法和系统 | |
US11893026B2 (en) | Advanced multiprovider optimization | |
CN106095698A (zh) | 面向对象的缓存写入、读取方法及装置 | |
CN107025279A (zh) | 基于数据库接口层操作流的scd文件在线并行配置系统和方法 | |
CN103809944A (zh) | 一种基于jdbc的web数据库开发组件的方法 | |
US6748388B1 (en) | Method and mechanism for storing and managing self-descriptive heterogeneous data | |
CN105205103A (zh) | 访问数据库的方法和装置 | |
US7325003B2 (en) | Method and system for mapping datasources in a metadata model | |
CN106599241A (zh) | 一种gis软件中针对大数据的可视化管理方法 | |
Kuhn et al. | VIP-MDBS: A logic multidatabase system | |
US7574329B1 (en) | Object model for decision and issue tracking | |
CN104572047A (zh) | 一种基于Apache Tomcat的WEB数据库开发组件方法 | |
CN109753533A (zh) | 一种多源关系型数据库客户端开发方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WD01 | Invention patent application deemed withdrawn after publication | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20150429 |