Abstract:
A method for communicating between an application and a database by using a lightweight stored procedure data-binding framework for applications written in object oriented programming languages such as Java, significantly reduces the coding effort required to communicate with a relational database. Once the developer specifies the needed tabular data, the inventive framework generates all needed data objects and stored procedures to accomplish the interaction with that database data. The automatically generated code is then used by the application via a run-time component. This means the developer need only make simple calls in a few lines of code for database interaction. The encapsulated data model deals only with persistence and retrieval issues and is therefore de-coupled from the business model. The developer can therefore concentrate on implementing a complex business object model. And, changes to the business object models have no direct impact on the underlying persistence model. Automatic code generation reduces a developer&#39;s coding time by up to 90%. Moreover, coding errors are virtually eliminated since the generated code is not prone to manual coding errors. Thus, testing time is reduced as well.

Description:
FIELD OF THE INVENTION  
         [0001]    This invention relates to a method for the exchange of data between an application program and a database using a framework, and in particular to a method, using a databinding framework, that automatically generates computer code for reducing the number of lines of application code that need to be written by the developer for database operations. The method is particularly useful with complex business and financial application programs.  
         BACKGROUND OF THE INVENTION  
         [0002]    Computer programs (applications) can be very complex. Such applications might perform calculations needed for financial transactions. For example, financial applications can facilitate the buying or selling of business or financial instruments such as derivatives. The complexity involves the number and type of calculations performed by the application, the large volume of data on which the application bases those calculations and the computed data representing the results of the application&#39;s computations. Software developers generally write these applications in a high level computer programming language. Object Oriented languages, such as Sun&#39;s Java and its various versions as J2EE (the “enterprise edition”) are particularly well suited for very large complex applications.  
           [0003]    The data that represents the inputs and outputs of the application can be voluminous. And, in large companies and financial institutions, it is likely that the data is shared by several applications. In such large and complex systems, the data representing all of the information needed by the application (inputs) and processed information (outputs) is generally stored on one or more databases that are semiautonomous of the application, i.e. the application does not directly read and write information to the databases. It communicates with the database through a database management program. Sybase, Microsoft SQL Server, and Oracle are exemplary of such commercial database products.  
           [0004]    One aspect of database programs is that the data is stored, read, and written in the form of tables. Database data is typically grouped in tables by similar characteristics, and the database program maintains the relationships between the tables. For example, the characteristics of a particular financial instrument might be found in one table while it&#39;s trading history can be found in another table. These tables can be then be related by the identifier of the instrument. Table based database systems are known as relational databases. Relational database programs are optimized for searching, for reporting selected data from the database, and for writing data to selected data tables.  
           [0005]    Communication with commercial databases is typically done via a structured query language (SQL). SQL lines can use variable input parameters, such as the name of a financial instrument, or a date, or range of dates. Many lines of SQL code may be required for a given database operation. Stored procedures are lists of SQL code that allow for input parameters and generate tabular result sets. The stored procedures are generally stored in the database.  
           [0006]    By contrast, applications are usually written in high level object oriented languages. Object oriented languages such as J2EE offer very powerful and computationally efficient computing environments for solving business calculations. (The calculations are typically presented to the application developer as a set of rules known as the business model). Object Oriented languages are designed to work with objects. Objects are programming structures of the application that contain both functions and the corresponding data for a given computational task. They are generally focused on solving a particular problem.  
           [0007]    An application runs on one or more computers. During “runtime” it typically reads and writes large volumes of information in the form of data. After a particular run, the program needs to save a great deal of information so that the next time it runs, it continues one or more calculations from the previous ending state. Also, some data within objects simply needs to be saved in the database. Persistence refers to the ability of the application to save various conditions of the application and data at the end of a run so that it is available to the application at the beginning of the next run.  
           [0008]    Object oriented languages are becoming ever more rich in their ability to interact with other systems and programs such as commercial database programs. They do this by offering a suite of libraries that provide pre-written application programming interfaces (API) for application developers. For example J2EE offers tools to communicate with database programs such as Sybase. Even with these tools, the Java programmer still must write many lines of Java code and then many lines of SQL code (stored procedures) to perform a given database operation. Depending on the complexity of the interaction, it can literally take weeks for a programmer to write all of the needed code for an interaction between the application and the database, as between Java and Sybase. And, because the stored procedures can comprise many lines of very detailed SQL code, there is a very good chance for coding errors. Proof reading such code is difficult and time consuming.  
           [0009]    Because the application handles information as part of its objects, and the database handles information as tables, the data structures must be converted for the two programs to communicate with each other. One approach is to provide a system that maps tabular data to objects in a way that is transparent to the programmer writing the application. This system of binding tabular data to objects is called databinding. In databinding, objects can be written that deal only with the information to be exchanged. Similarly, stored procedures can be written to only carry out the corresponding database interactions. The stored procedures are “lightweight” in the sense that they do not perform any business calculations. A method, or framework, to manage data for an application is ideally “encapsulated”. That is, it is isolated from the application&#39;s business calculations (the business model).  
           [0010]    What is needed is a method that implements a lightweight stored procedure framework whereby the applications programmer solving a business model need only specify a few simple lines of code to communicate with the tabular data in a relational database.  
         SUMMARY OF THE INVENTION  
         [0011]    A method for communicating between an application and a database by using a lightweight stored procedure data-binding framework for applications written in object oriented programming languages such as Java. The method significantly reduces the coding effort required to communicate with a relational database. Once the developer specifies the needed tabular data, the inventive framework generates all needed data objects and stored procedures to accomplish the interaction with that database data. The automatically generated code is then used by the application via a run-time component. This means the developer need only make simple calls in a few lines of code for database interaction.  
           [0012]    The encapsulated data model deals only with persistence and retrieval issues and is therefore de-coupled from the business model. The developer can therefore concentrate on implementing a complex business object model. And, changes to the business object models have no direct impact on the underlying persistence model. The encapsulated method provides a generic configurable means of persisting and retrieving objects to and from a relational database. While it is described in a Java-Sybase environment embodiment, the method is applicable to other object oriented languages and database programs.  
           [0013]    Automatic code generation reduces a developer&#39;s coding time by up to 90%. Moreover, coding errors are virtually eliminated since the generated code is not prone to manual coding errors. Thus, testing time is reduced as well.  
       
    
    
     BRIEF DESCRIPTION OF THE DRAWINGS  
       [0014]    The advantages, nature and various additional features of the invention will appear more fully upon consideration of the illustrative embodiments now to be described in detail in connection with the accompanying drawings. In the drawings:  
         [0015]    [0015]FIG. 1 is a simplified block diagram showing the databinding framework.  
         [0016]    [0016]FIG. 2 is a simplified block diagram of the framework&#39;s generator component.  
         [0017]    [0017]FIG. 3 is a simplified block of the framework&#39;s run-time components. 
     
    
       [0018]    It is to be understood that the drawings are for the purpose of illustrating the concepts of the invention, and except for the graphs, are not to scale. It is also understood that all application code, other framework code, the database program, and data reside on tangible computer readable media and run on one or more computer systems.  
       DESCRIPTION  
       [0019]    The application is divided into two parts. Part I discusses the invention as a general framework solution for object oriented applications that access data from database programs using a structured query language (SQL) and groups of SQL calls as stored procedures. Part II of the application, for those skilled in the art, is an example of the inventive framework for the Java J2EE and Sybase programming environments.  
         [0020]    Part I: A Lightweight Stored Procedure Data-Binding Framework For Business And Financial Applications  
         [0021]    The inventive framework comprises two distinct components. A code generator is used during program development to automatically generate required stored procedures, Java code, and an XML data exchange and documentation middle layer. A second component, the run-time component integrates the generated code into the running business application as library routines so that the business program can retrieve, store, and persist data with very minimal Java code, usually with only one or two lines of Java code.  
         [0022]    The method of databinding database relational tables to application objects shown in FIG. 1. In Block A, the application is provided and in Block B, the database. The framework discussed in Parts I and II is provided in Block C. Using the method, first databinding files are generated in Block D, and finally those databinding files are integrated into the application at run-time by the run-time component of the framework provided in Block E.  
         [0023]    The Code Generator of the Framework:  
         [0024]    The code generator is shown in FIG. 2. The developer supplies a list  101  of needed data specified as database table names. By way of example, the developer here is interacting with table “table_one”  102 . The data (information) corresponding to table_one resides in relational database  103 . The generating tool initially parses the required tabular data and generates table meta-data  104  in the form of database  102  primary keys, columns, and data types.  
         [0025]    Based on meta-data  104 , the code generator creates three types of output files, all of which are used later during the running of the business or financial application (hereinafter “application”) via the framework&#39;s run-time component. The generated stored procedures  105  are the part of the framework that communicate most directly with the relational database.  
         [0026]    The generated XML files  106  create a “middle layer” of the framework. They are written in the eXtensible Markup Language (XML). These files act as the “glue” by defining what each stored procedure is called, and what its input and output parameters are. At run-time, the XML documents (configuration files) reside between the stored procedures that directly access database  102  and the Java code of the application. The XML documents can be read directly as text documents. Because XML documents are structured and nested, they are also self-explanatory and self-documenting.  
         [0027]    The code generator also writes value objects  107 . The value objects, generated “beans” in Java, are part of an object class for exchanging data with the database. They provide the final links that ultimately map the tables of relational database  102  to the application written in an object oriented language such as Java. Following the philosophy of frameworks created in object oriented programming environments, the value objects perform only functions related to information exchange between database  102  and the application. No business rules are calculated in these objects. Business rules can be computed solely by the application.  
         [0028]    Blocks  108  to  110  further illustrate the roles of the each of the three generated sections of code. Block  108  shows the generated stored procedures  105 . The stored procedures  105  of block  108  communicate via the generated XML configuration files of XML code  106 , as shown by block  109 , with the application. The generated value objects  107 , for example JavaBeans, complete the databinding by providing the final mapped data in a form suitable for use in the run-time object oriented environment of the application, as shown by block  110 . Thus the stored procedures of block  108  are “connected” to the value objects of block  110  by the generated XML middle layer  109 .  
         [0029]    The Run-Time Component of the Framework:  
         [0030]    [0030]FIG. 3 shows the run-time component  200  of the framework. It illustrates the method by which the code generated by the code generation component is used during the running (run-time) of application. Computations of business rules  205  are done as part of objects  206  in the Business Model Tier  207 . Information (data) exchange is done in Data Access Tier  208 .  
         [0031]    Data Access Tier  208  comprises the code generated by the code generator. Run-time component  200  integrates the generated code into the application. The generated stored procedures  108 , generated XML middle layer  109 , and generated value objects  110  are tied together by run-time component  200 . Data Access Objects (DAOs)  204  are the simplified lines of code (calls) from the objected oriented application. DAOs  204  are hand written into the application by the developer.  
         [0032]    Run-time component  200  comprises subcomponents  201 - 204 . Caller  201  provides interaction to the database via a unique identifier for each XML binding document. Connection manager  202  provides for physical connections to the database. Binder Manager  203  maps the stored procedures to the value objects during application startup. And, Cache Manager  204  can cache store procedure results as list of value objects in memory for a time for quicker application access.  
         [0033]    Using the inventive framework, the developer starts with an existing relational data model. Then the tables that will be used to persist the application&#39;s data are identified. A table of metadata is generated from the list of table names by the code generator from which the code generator creates the Load, Save, Delete, LoadList Stored Procedures, the Value Objects (i.e. JavaBeans) and, XML binding definitions. Finally, the developer writes the Data Access Objects business model interface by-hand in just a few lines of application code.  
         [0034]    The benefits of the inventive framework are manifold. It generates both application code and stored procedures. In the best practices of object oriented programming, the stored procedures and value objects contain no business logic. And, the business model is de-coupled from the underlying persistence model. There is simplified data access interface i.e. load, loadList, save, delete. In the case of a Java solution, it wraps the clunky Java DataBase Connectivity (JDBC) Stored Procedure interface. And, a very important feature is that the framework significantly reduces error-prone, mundane data access, stored procedure development. Thus, the development effort gains more time to focus on the business model code because the data access build effort and cost are now 10% of what they would have been without the inventive framework. Also, stored procedure logging can be easily implemented in this framework. And finally, run-time can be improved by built-in memory caching.  
         [0035]    Furthermore, since routing human coding errors are virtually eliminated there is far less required data access testing. As will be shown in the example, the framework is easily integrated into standalone Java applications or J2EE enterprise applications.  
         [0036]    While the inventive framework can be adapted to all known-business class object oriented languages and commercial database systems, the embodiment of the example was coded using Java (JavaBean, JDBC, Reflection), XML, XML schema, Castor, Sybase database, Apache Commons, and Apache Log4J.  
         [0037]    Part II:  
       An Example Framework in Java and Sybase with an XML Middle Layer  
       [0038]    The embodiment described here is called SPBinder. SPBinder is a lightweight Stored Procedure data-binding framework for Java. Its main function is to significantly reduce the coding effort required to call database Stored Procedures by encapsulating the clunky Java DataBase Connectivity (JDBC) interface and providing a generic configurable means of persisting/retrieving Java objects to/from a relational database. The main advantage of encapsulating the data model is that it purely deals with persistence and retrieval and therefore becomes de-coupled from the business model. This means the developer can concentrate on implementing a complex business object model without directly impacting the underlying persistence model. The SPBinder framework has two main components—a code generation component for developers called GenUtils and run-time component called SPBinder.  
         [0039]    GenUtils  
         [0040]    The GenUtils component is set of code generation utilities that take a list of database table names (new or legacy) as input and extracts the table metadata directly from a database where the tables are defined to generate associated, JavaBeans (Value Objects), stored procedures (loadList, load, save and delete), and XML data-binding definition documents.  
         [0041]    The XML data-binding document (see Appendix for schema) describes the relationship between stored procedure input/output parameters, resultsets and associated JavaBeans (Value Objects). This means that at run-time, Stored Procedure input parameters can be mapped directly from Java Object attributes, and stored procedure resultsets can be mapped to a list of Java Objects.  
         [0042]    Example of XML Data-Binding Definition Document:  
                                                                                                                         &lt;?xml version=“1.0” encoding=“UTF-8”?&gt;       &lt;!-- edited with XML Spy v4.0.1 U (http://www.xmlspy.com) by       John Mangan (JPMorganChase) --&gt;       &lt;!--Sample XML file generated by XML Spy v4.0.1 U       (http://www.xmlspy.com)--&gt;       &lt;StoredProcBinder&gt;                &lt;StoredProcs jdbcConnectionResource=           “com.jpmorgan.eqeis.spbinder.database.test.jdbc_conn”&gt;                &lt;StoredProc name=“sp_who” id=“Who”&gt;                &lt;InputParams&gt;                &lt;Param column=“ ®loginname”           property=“name” javaType=“java.lang.String”/&gt;                &lt;/InputParams&gt;           &lt;ResultSetParams model=           “com.jpmorgan.eqeis.spbinder.database.test.IdObject”&gt;                &lt;Param column=“spid” property=“id”/&gt;           &lt;Param column=“loginname” property=“name”/&gt;                &lt;/ResultSetParams&gt;                &lt;/StoredProc&gt;            &lt;/StoredProcBinder&gt;                  
 
         [0043]    SPBinder  
         [0044]    SPBinder is the run-time component, which uses the XML binding document and JavaBean (Value Objects) and encapsulates communication to the database via JDBC.  
         [0045]    It consists of four main components, SPBinderManager, SPConnection, SPCaller and SPCacheManager.  
         [0046]    SPBinderManager  
         [0047]    SPBinderManager normally reads in the XML binding document once during application start-up and builds a data-binding mapping in memory using the unique identifier to reference each Stored Procedure and associated data-binding JavaBean (Value Object). This unique identifier can then be used by SPCaller to do the actual database access.  
         [0048]    Example:  
                                                   static SPBinderManager spBM = SPBinderManager.getInstance( );           spBM.loadXMLConfigResource           (“com/jpmorgan/eqeis/spbinder/database/test/SPBindings.xml”);                      
 
         [0049]    SPConnection  
         [0050]    The SPConnection component handles the physical database connections and associated transaction management. It can also handle connection pooling in a J2EE environment.  
         [0051]    SPCaller  
         [0052]    SPCaller uses the unique identifier defined in the XML binding document to access the database and load, save or delete data. The data is automatically extracted from or populated in the JavaBean (Value Objects) where appropriate. Using the XML definition above, the example below shows how to load a list of users and their spids (Sybase process Id&#39;s):  
         [0053]    Example:  
                                                                                                                                   try {                SPCaller spCaller = new SPCaller( );           List list = spCaller.loadList (“Who”, null); //           execute sp_who and returns a list of                spids &amp; names                Iterator iter = list.iterator ( );           while (iter.hasNext ( )) {                IdObject idObj = (IdObject) iter.next ( );           System.out.println(“Spid:” + idObj.getId( ) +           “ Name: ” + idObj.getName ( ));                }                }           catch (SPBinderException e) {                System.error.println(e.getMessage ( ));                }                      
 
         [0054]    The SPCaller component has built-in logging, which can be used to trace Stored Procedure calls, input parameters and resultsets.  
         [0055]    SPCacheManager  
         [0056]    SPCacheManager is a component, which manages a read-only time-expiry cache of list based data. This can be used to cache Stored Procedure resultsets as lists of JavaBean (Value Beans) in memory for a period of time. The time to expire variable can be configured per Stored Procedure in the XML data-binding document.  
       Appendix  
       [0057]    StoredProcBinder.xsd  
                                                                                                                                                                                                                                                                                                                                                 &lt;?xml version=“1.0” encoding=“UTF-8”?&gt;       &lt;!-- edited with XML Spy v4.0.1 U (http://www.xmlspy.com) by John Mangan (JPMorganChase) --&gt;       &lt;!--W3C Schema generated by XML Spy v3.5 NT (http://www.xmlspy.com)--&gt;       &lt;xs:schema xmlns:xs=“http://www.w3.org/2001/XMLSchema” elementFormDefault=“qualified”       attributeFormDefault=“unqualified”&gt;                &lt;xs:annotation&gt;                &lt;xs:documentation&gt;SPBinder (Stored Proc to JavaBean databinding definition) Castor generation -            com.jpmorgan.eqeis.spbinder.database.xml&lt;/xs:documentation&gt;                &lt;/xs:annotation&gt;           &lt;xs:element name=“StoredProcBinder”&gt;                &lt;xs:complexType&gt;                &lt;xs:sequence&gt;                &lt;xs:element ref=“StoredProcs” minOccurs=“0”/&gt;                &lt;/xs:sequence&gt;                &lt;/xs:complexType&gt;                &lt;/xs:element&gt;           &lt;xs:element name=“StoredProcs”&gt;                &lt;xs:complexType&gt;                &lt;xs:sequence&gt;                &lt;xs:element ref=“StoredProc” minOccurs=“0” maxOccurs=“unbounded”/&gt;                &lt;/xs:sequence&gt;           &lt;xs:attribute name=“jdbcConnectionResource” type=“xs:string” use=“required”/&gt;                &lt;/xs:complexType&gt;                &lt;/xs:element&gt;           &lt;xs:element name=“StoredProc”&gt;                &lt;xs:complexType&gt;                &lt;xs:sequence&gt;                &lt;xs:element name=“InputParams” type=“Params” minOccurs=“0”/&gt;           &lt;xs:element name=“ResultSetParams” type=“Params” minOccurs=“0”/&gt;                &lt;/xs:sequence&gt;           &lt;xs:attribute name=“name” type=“xs:string” use=“required”/&gt;           &lt;xs:attribute name=“id” type=“xs:string” use=“optional”/&gt;           &lt;xs:attribute name=“jdbcConnectionResource” type=“xs:string” use=“optional”/&gt;           &lt;xs:attribute name=“cacheable” type=“xs:boolean” use=“optional”/&gt;           &lt;xs:attribute name=“cachetimeout” type=“xs:integer” use=“optional”/&gt;                &lt;/xs:complexType&gt;                &lt;/xs:element&gt;           &lt;xs:complexType name=“Params”&gt;                &lt;xs:sequence&gt;                &lt;xs:element ref=“Param” minOccurs=“0” maxOccurs=“unbounded”/&gt;                &lt;/xs:sequence&gt;           &lt;xs:attribute name=“model” type=“xs:string” use=“optional”/&gt;                &lt;/xs:complexType&gt;           &lt;xs:element name=“Param”&gt;                &lt;xs:complexType&gt;                &lt;xs:attribute name=“column” type=“xs:string” use=“required”/&gt;           &lt;xs:attribute name=“property” type=“xs:string” use=“required”/&gt;           &lt;xs:attribute name=“output” type=“xs:boolean” use=“optional”/&gt;           &lt;xs:attribute name=“value” type=“xs:string” use=“optional”/&gt;           &lt;xs:attribute name=“javaType” type=“xs:string” use=“optional”/&gt;                &lt;/xs:complexType&gt;                &lt;/xs:element&gt;            &lt;/xs:schema&gt;