DATABASE PROGRAMMING WITH JDBC AND JAVA PDF
As I mentioned a moment ago, JDBC stands for Java Database . the Java program if a different type of database is used (assuming that the. Java Database Programming with JDBC: Discover the Essentials for Developing Databases for Internet and Intranet Applications. Read more. Title: When the Moon Split: A biography of Prophet Muhammad (Peace be upon him) Author: Safiur-Rahman al-Mubarkpuri Subj.
|Language:||English, Spanish, Portuguese|
|Genre:||Politics & Laws|
|ePub File Size:||30.56 MB|
|PDF File Size:||17.28 MB|
|Distribution:||Free* [*Regsitration Required]|
(JDBC) is the foundation for all your Java/Oracle applications. major area and cover it exhaustively -- for example, Database Programming with JDBC and. definitely appreciate this aspect of Java. When you write a Java database program, that same program will run against Oracle, MySQL, Sybase. 𝗣𝗗𝗙 | From the Java Database Connectivity (JDBC) Specification: Using the JDBC API, applications written in the Java programming.
For example, a library database may contain tables such asbooks, authors, publisher, borrowing, and so forth. But, before we create the database, we must log in to MySQL with the new user we have just created if you have not created any, use the default root user.
Log in again with the new user account. Because we have used "set password" for this user, -p will prompt for it. Here, testdbis like a folder, a container that will contain all the tables we will create. This will help in testing the application later. From the next step onwards, we'll deal with Java and NetBeans. Click Next. In the New Java Application window, enter the name location of the project.
It does not matter, at least for our current project, but the purpose is clearly stated in the help section; let's not restate it here.
Figure 1: Assigning a project name and location Click Finish.
This will create a Java project environment in NetBeans. It is basically a vendor-specific Type 4 driver that bridges the communication gap between our application and the database. If you want to connect to any other database, look for that database-specific JDBC driver. These sites manage millions of queries each day. While installing the package, we are prompted to enter a password for the MySQL root account.
Next, we are going to create a new database user and a new database. We use the mysql client. If not, we need to start the server. On Ubuntu Linux, this can be done with the sudo service mysql start command. All rights reserved. Other names may be trademarks of their respective owners. We connect to the database using the root account.
We will use this database throughout the tutorial. We grant all privileges to this user for all tables of the testdb database. Maven file We use the following Maven file: pom. We also include the exec-maven-plugin for executing Java programs from Maven. We check the version of the MySQL server. Connection; import java. DriverManager; import java. ResultSet; import java. SQLException; import java.
Statement; import java. Level; import java. Each driver has a different syntax for the URL. In our case, we provide a host, a port, and a database name. The connection is established with the getConnection method. The createStatement method of the connection object creates a Statement object for sending SQL statements to the database. The executeQuery method of the connection object executes the given SQL statement, which returns a single ResultSet object.
The try-with-resources syntax ensures that the resources are cleaned up in the end. Initially the cursor is positioned before the first row. The next method moves the cursor to the next row. If there are no rows left, the method returns false. The getString method retrieves the value of a specified column.
The first column has index 1. For this console example, the message is displayed in the terminal. The Manen's -q option runs Maven in quiet mode; i. Creating and populating tables Next we are going to create database tables and fill them with data.
These tables will be used throughout this tutorial. The tables are of InnoDB type.
InnoDB databases support foreign key constraints and transactions. We place a foreign key constraint on the AuthorId column of the Books table. We fill the Authors and Books tables with initial data. We use the source command to execute the tables.
When we write prepared statements, we use placeholders instead of directly writing the values into the statements. Prepared statements increase security and performance. PreparedStatement; import java. Prepared statements are faster and guard against SQL injection attacks. We use the executeUpdate method of the statement object when we don't expect any data to be returned.
We will execute a normal statement and a prepared statement times. We check if there is some difference in execution time. We saved 20 seconds. The code for this technique, however, is quite simple and worth mentioning: The subname is based solely on the subprotocol.
The subprotocol is also used by the DriverManager to match the proper driver to a specific subprotocol. The subname can contain additional information used by the satisfying subprotocol i.
JavaSoft suggests that a network name follow the URL syntax: The DriverManager. The direct way of using the getConnection method involves passing these attributes in the constructor. The following is an example of how to create a Connection object from the DriverManager. This method returns a Connection object which is to be assigned to an instantiated Connection class: Chapter 4 shows a complete example of how to use the DriverManager and Connection classes, as well as how to execute queries against the database server and get the results.
Although Chapter 5 covers the inner workings of the Bridge, I would like to show you how to install it here. Uncompress the package. Move JdbcOdbc. You can also: For Unix: For Windows One of the great features of the Bridge is that it allows you to use existing data sources to start developing database- aware Java applications.
Click on 32 bit ODBC. Click on the Add button and choose the Access Driver. Type in a Data Source Name and Description anything you like.
In the Database area, click on Select. However, you can specify any Access database you want. You may want to click on the Advanced button and set the Username and Password.
Click on OK and then on Close to complete the configuration. That is all you need to do to set up the ODBC data source. Now you can write Java applications to interact with the data source on the machine in which you performed the configuration; the ODBC driver is not directly accessible over the network.
You can access the data source by using the name you supplied in Step 5.
Writing and Reading MySQL BLOB Using JDBC
DataSourceName and the statement Class. Our Interactive Query applet will accomplish a number of tasks. It will: I know, plans take time to develop, and you want to get into the good stuff right away.
This section covers some applet basics, at a high level. The Blueprint The applet structure has a well-defined flow, and is an event-driven development. First, we want to connect to a database, which requires some user input: Next, we want to let the user enter an SQL query, which will then be executed on the connected data source.
Finally, we need to retrieve and display the results of the query. Our next task is to fill in some of the technical details of our plan. The absolute first thing we need to do, besides setting up the constructors for the various objects we use, is design and layout the user interface. We need to get some preliminary input from the user; we need to have some event handlers to signal the applet that the user has entered some information that needs to be processed, like the SQL query.
Figure 4. As you can see, we do most of our real work in the Select method. The dispatcher is the event handler method, handleEvent. This approach also adds to the overall efficiency; the code shows how to deal with some of the events directly in the event handler. Why does an applet have this flow? The interpreter handles the allocation of memory and resources for the applet, thus the applet must live within the context of the JVM.
Note that Java applications do not follow this life-cycle, as they are not bound to run in the context of Java applets. It is only called once, and it is the place where the initialization of objects via construction or assignment should be done.
It is also a good place to set up the user interface. If you are using threads, this is the ideal place to begin threads that you create to use in the applet. This method is called when the Web browser or appletviewer becomes active; that is, when the user brings up the window or focuses attention to the window.
For instance, iconifying the Web browser calls this method. This is a great place to flush buffers and close connections, and generally to clean house. In this applet, we are only looking for keystrokes and mouse clicks.
We override the handleEvent method to allow us to program for these events. We use the target property of the Event object, which is passed into the event handler, to look for a specific object. Then we can look for more specific events.
Listing 4. We use the target property to see which object the event occurred in, then we look at the key property to see if the Enter key was pressed. The rest of the code shown in the listing is fairly straightforward: We primarily use the destroy method to close the database connection that we open in the applet. The JDBC driver that we used to connect to the data source is alerted to the fact that the program is exiting, so it can gracefully close the connection and flush input and output buffers.
The complete source code is shown in Listings 4. But wait! In Listing 4. We loaded the necessary classes and the specific driver we will use in the applet. We use GridBagLayout, a Java layout manager, to position the components in the applet window. GridBagLayout is flexible and offers us a quick way of producing an attractive interface.
NONE; Con. The weightx and weighty properties determine how the space in the respective direction is distributed. If either weight property is set to 0, the default, any extra space is distributed around the outside of the components in the corresponding direction.
The components are also centered automatically in that direction. If either weight property is set to 1, any extra space is distributed within the spaces between components in the corresponding direction.
Take a look at Figure 4. We also set the anchor property to tell the GridBagLayout to position the components on the center, relative to each other.
Follow Us On Facebook
The fill property is set to NONE so that the components are not stretched to fill empty space. You will find this technique to be useful when you want a large graphics area Canvas to take up any empty space that is available around it, respective to the other components.
The last detail associated with GridBagLayout involves assigning the properties to the component. This is done via the setConstraints method in GridBagLayout. Notice that we assign properties for the TextArea, but not for the Labels. We also set the colors for it. Now we can move on to handling events.
Handling Events We want to watch for four events when our applet is running: Earlier in the chapter, we saw how to watch for events, but now we get to see what we do once the event is trapped, as shown in Listing 4. The event handling code is contained in the generic handleEvent method. We will return the results of the query as a string because we only want to pipe all of the results into the OutputField TextArea. We cast all of the returned results into a String—however, if the database contains binary data, we could get some weird output, or even cause the program to break.
When I tested the applet, the data source that I queried contained numerical and strings only. This is done in the destroy method of the applet. We have to catch an exception, if one occurs, while the close method is called on the connection. Not too shabby for our first try. We learned how to: See Chapter 3 for more help on this topic. The Bridge works great, but there are some things you need to understand before you can implement it properly.
There is no other magic happening within this library; all processing, including memory management, is contained within the Java side of the Bridge.
Unfortunately, this means that there is a library containing C code that must be ported to each of the operating systems that the Bridge will execute on. So, instead of being able to download Java class files and execute on the fly, you must first install and configure additional software in order to use the Bridge. I have pursued countless reported problems that ended up being nothing more than an ODBC configuration issue.
Make sure you setup your data sources properly, and then test them to make sure you can connect and perform work. You can accomplish this by either using an existing tool or writing your own sample ODBC application. The Bridge Is Great, But But wait, there are a few limitations that I need to make you aware of before you start.
First, as I mentioned before, a lot of software must be installed and configured on each system that will be using the Bridge. Unfortunately, this task can be a major limitation, not only from the standpoint of getting the software installed and configured properly, but ODBC drivers may not be readily available or may be quite costly for the operating system that you are using. Second, understand the limitations of the ODBC driver that you will be using.
One of the most frequently asked questions I get is: Third, keep in mind the quality of the ODBC driver. Finally, there are Java security considerations. For untrusted applets, the prognosis is bleak. Untrusted applets can only access databases on the server from which they were downloaded. If the Bridge could determine the hostname that it will be connected to, a call to the Java Security Manager could easily check to ensure that a connection is allowed.
Unfortunately, it is not always possible to determine the hostname for a given ODBC data source name. For this reason, the Bridge always assumes the worst. An untrusted applet is not allowed to access any ODBC data source. For the Bridge, the specific URL structure is: The subname specifies the ODBC data source name to use, followed by any additional connection string attributes.
Accounting", "dept12", "Julie" ; An alternative way of connecting to this same data source would be to pass the user name and password as connection string attributes: Properties object.
Properties info ; The third method listed here is by far the most elegant way of connecting to any JDBC driver. The Java program can then prompt the user for this information, and then create a java. Properties object that contains an element for each of the driver properties to be used for the JDBC connection. The following code shows how to setup the java. Properties object: I can hear you now: What if someone takes this information to write another Bridge? And second, the Bridge is provided for free.
No one could possibly take this information to create a better Bridge at a lower price. I provide this information in an effort to help you better understand how the Bridge operates, and, if you are well versed in ODBC, to give you the direct correlation between the Bridge and ODBC. This should enable you to write advanced JDBC applications right off the starting line. Table 5. To overcome this deficiency, you must map SQL data types into Java.
You need to know how to properly retrieve equivalent Java data types—like int, long, and String—from their SQL counterparts and store them in your database. This can be especially important if you are working with numeric data which requires careful handling of decimal precision and SQL timestamps which have a well-defined format. The mechanism for handling raw binary data is touched on in this chapter, but it is covered in more detail in Chapter 8.
Table 6. Note that the types beginning with java. Date DATE java. Time TIME java. These types are used to store images, raw document files, and so on. To store or retrieve this data from the database, you would use the stream methods available in the JDBC: Date TIME java. These methods, shown in Table 6. The parameters int and String allow you to specify the column you want by column number or column name. After a query has been executed, you can call the ResultSet.
Such an integration would also relieve the necessity of constant translation between database tables and object- oriented data structures, which can be an arduous task. Suppose we create the following table in a database: Moreover, there are several solutions being developed to work specifically with Java. If you would like to investigate this topic further, check out The Coriolis Group Web site http: The ODMG Object Database Management Group is a consortium that is working on a revised standard for object database technology and the incorporation of this concept into programming languages such as Java.
We covered a few of the more important methods you will use to retrieve data from a database. The end user of your JDBC applets or applications will want to see more than just rows and rows of data. This object will provide a usable interface to the actual query results so they can be plugged into a Java graphics library. Between these chapters, I will be providing plenty of examples, complete with code, to help you work up your own JDBC programs.
At the very least, these chapters will give you some ideas for dealing with raw table data and displaying it in an effective manner. The smart way to do this is in a re-usable fashion by implementing a generic object or class which allows you to re-use the same class you develop to retrieve data from a query in any of your JDBC programs. The code snippet in Listing 7. Remember that the ResultSet allows us to retrieve data in a row-by-row, column-by-column fashion; it simply gives us sequential access to the resulting table data.
Table 7. The data object we will create is shown here: Listing 7. Close the statement object.
The code in Listing 7. We simply loop through the array and print the data. The package on the CD is only an evaluation copy. Stop by http: Figure 7. Applet; import java. We have to define the labels and corresponding values, but this is generally straightforward. In the next example the pie chart example , we do have to parse it to put it in the proper format for the charting class to recognize it. StringTokenizer; public class example72 extends java.
See this class defined below. In the next chapter, we will continue to discuss working with database query results, and we will provide a complete code example for showing SQL BLOB data types. It shows you how to get an image from the ResultSet, as well as how to add images or binary data to a table in a database. Tables 8. The user can select an image category from this menu to display the proper list of image descriptions in a list box.
As you can see, IconStore will not be too complicated, but it will serve as a very good foundation for developing database-driven applications. Listing 8. Driver Class. Convert it into a SQLException. Also note that the image data is coming out of GIF files stored on disk.
Application Essentials The source code for the IconStore application is shown throughout the rest of this chapter, broken across the various sections. See Chapter 3, if you have trouble getting the application to run. This entry point is the main method, which is shown in Listing 8.
For the IconStore application, main simply processes any command line arguments, creates a new instance of the IconStore class which extends Frame, a top-level window class , and sets up the window attributes. The IconStore application accepts one command line argument: Establishing The Database Connection Listing 8.
In reality, the SimpleText driver stores each database table as a file, and the Directory property specifies the directory in which these files are kept. If there is any reason a database connection cannot be established, the pertinent information will be displayed and the application will be terminated. First, we need to read the database table and store the query results, as shown in Listing 8.
Dump the exception contents. First, we create a Statement object; then, we submit an SQL statement to query the database; next, we process each of the resulting rows; and finally, we close the Statement. Note that a Hashtable object containing a list of all the categories is returned; the category description is the key and the category ID is the element.
In this way, we can easily cross-reference a category description to an ID. Now that all of the category information has been loaded, we can create our menu. The only way to examine the contents of a Hashtable without knowing each of the keys is to create an Enumeration object, which can be used to get the next key value of the Hashtable.
Figure 8. Creating The Lists Next on our agenda: At the same time, we add each description to a list for the category. In addition to building the menu, we also build the CardLayout. It is important to note that the IconStore application is totally database-driven; no code will have to be modified to add or remove categories or images.
Each of the lists is added to the CardLayout with a description as a title, which, in our case, is the name of the category. When the user selects a category from the Icons menu, we can use the category description to set the new CardLayout list.
As with the Interactive SQL applet we discussed in Chapter 4, the event handling code is contained in the handleEvent method, as shown in Listing 8. GIF if saveFile. Returns true if successful. Of interest here is how the CardLayout is managed. When a user makes a selection from the Icons menu, the selected item which is the category description is used to change the CardLayout.
Remember that when the CardLayout was created, the title of each list was the category description. When the user selects Exit from the menu, the temporary image file which is discussed later is deleted from disk, and the application is terminated. This is the perfect time to close the Connection that was in use. I purposefully omitted this step to illustrate a point: The JDBC specification states that all close operations are purely optional.
It is up to the JDBC driver to perform any necessary clean-up in the finalize methods for each object. I strongly recommend, though, that all JDBC applications close objects when it is proper to do so. The number of bytes read is returned. When the user selects an item from the list, we can get the image description. This description is used to get the icon ID from the image Hashtable.
For the most part, we follow the same steps we have seen several times before in getting results from a database. The image is retrieved from the database as a binary InputStream, and it is from this InputStream that we need to draw the image on our canvas.
This technique seems like it should be a simple matter, but it turns out to be impossible as of the writing of this book. To get around this problem, the IconStore application uses the InputStream to create a temporary file on disk, from which an image can be loaded and drawn on the canvas. Hopefully, a method to draw images from an InputStream will be part of Java in the future. We saw previously how to handle the Save As menu event, so we just need to be able to create the disk file.
Our workaround approach for drawing an image from an InputStream will be used to our advantage. Because an image file has already been created, we can simply make a copy of the temporary file.
Therefore, anyone with access to a computer attached to your LAN can check out all transactions as they occur. Of course, a well-managed network and users you can trust are the best methods of preventing an inside job. Unfortunately, you must also consider another possibility: The possibility that someone from outside your LAN might break into a computer inside your LAN is another issue altogether; you must make sure that the other computers on your LAN are properly secured.
To prevent such a situation, a firewall is often the best remedy. Though not completely foolproof, it does not allow indiscriminate access to any computers that are behind the firewall from outside. One solution is to limit the IP addresses from which connections to the database server can be made. Some folks with too much time on their hands take great pleasure in hacking through CGI scripts to seek out unauthorized information.
Are you vulnerable to this type of attack? Consider this situation: You have a CGI script that searches a table. The HTML form that gives the CGI its search information uses a field containing a table name; if a hacker realizes that you are directly patching in the table name from the HTML page, it would be easy to modify the CGI parameters to point to a different table.
For in-house distribution of Java programs that access database servers, many of these security considerations are minimal.
H2 Database Engine
But for Internet applications, such as a merchandising applet where a user enters a credit card number to purchase some goods, you not only want to send this data encrypted to the Web server, but you want to protect the actual database server that this sensitive data is stored on.
Finding A Solution So how do we deal with these security holes? The most straightforward way is to use a database server that implements secure login encryption. The other solution, which is more viable, is to use an application server in a three-tier system. First, the Java program uses encryption to send login information to the application server. Then, the application server decodes the information.
And finally, the application server sends the decoded information to the database server, which is either running on the same machine or on a machine attached to a secure local network.
This API, which provides classes that perform encryption and authentication, will be a standard part of the Java API and will allow you to use plug-in classes to perform encryption on a remote connection. The Java Commerce API addresses the security issue of determining whether an applet is from a legitimate source by using digital signatures, authorization, and certification.
At the time this manuscript was written, however, these APIs were still under construction. Applet Security: However, applet security is an entirely different issue. This aspect of security, where an applet that has been downloaded to your computer is running in your Web browser, has been under scrutiny since Java-enabled Web browsers appeared. For instance, the security mangager does not allow applets downloaded from remote Web pages to access the local disk; it restricts network connections attempted by the applet to only the machine from which the applet came from; and it restricts applets from gaining control of local system devices.
These restrictions are in place to protect users from rogue applets or should I say rogue applet programmers attempting to break into your computer. The user does not need to worry about the applet formatting the hard disk or reading password files. So how does this relate to the JDBC? The immediate concern for you as the developer is that your JDBC applet can only connect to the same machine that served the applet initially i.
This means that you must run a Web server on the same machine as your database server. However, if you choose the application server route that we will discuss in Chapter 11, you must run the application server alongside the Web server, but then you are free to run the database server on another machine. If the user installs the applet locally and runs it, these security restrictions do not apply.
But unfortunately, that defeats the purpose behind an applet: When you receive certification, simply attach it to applets that are served from your Web site. The Commerce and Security APIs allow for the fetching of trusted applets, so if the user uses a Java interpreter that incorporates the Java Commerce API and Security API, you the developer can serve applets that can connect to an application server or database server running on a different machine than the Web server.
In fact, you can even attach to different database servers simultaneously if necessary. The exact security restrictions of trusted applets are not set in stone, and they may differ depending on the Web browser the applet is run on. Also, the Java Commerce and Security specifications and related APIs have not been finalized as of the writing of this book, so much may change from the preliminary details of the security scheme by the time the APIs are released and implemented.
Summary Security in data transactions is a top priority in the Internet community. Now we can put some of your newly gained knowledge to use. In this chapter, we will explore what it takes to develop a JDBC driver. In doing so, we will also touch on some of the finer points of the JDBC specification.
This driver allows you to manipulate simple text files; you will be able to create and drop files, as well as insert and select data within a file. It is not a full-blown relational database system, so I would not recommend attempting to use it as one. If you are looking for a good way to prototype a system, or need a very lightweight database system to drive a simplistic application or applet, then SimpleText is for you.
It may not seem like much, but this grammar is the foundation that will allow us to create a table, insert some data, and select it back. The first line contains a signature, followed by each one of the column names and optional data types.
Any subsequent lines in the text file are assumed to be comma-separated data. There is no size limit to the text file, but the larger the file, the longer it takes to retrieve data the entire file is read when selecting data; there is no index support. The data file extension is hard coded to be. SDF, with the following initial data: SDF is the file signature this is how the SimpleText driver validates whether the text file can be used , followed by a comma-separated list of column names.
The first character of the column name can specify the data type of the column. A column name starting with a indicates a numeric column, while a column name starting with an indicates a binary column. Binary data in a text file? Well, not quite. A binary column actually contains an offset pointer into a sister file. This file, with an extension of. SBF Simple Binary File , contains any binary data for columns in the text file, as well as the length of the data maximum length of bytes.
Any other column name is considered to be character data with a maximum length of bytes. The following statement shows how data is inserted into the TEST table: SDF will contain the following data: This is the offset from within the TEST.
SBF table in which the binary data resides. Starting at the given offset, the first four bytes will be the length indicator, followed by the actual binary data that was inserted. Note that any character or binary data must be enclosed in single quotation marks. The DriverManager is provided by JavaSoft and does not require the driver developer to perform any implementation.
Its main purpose is to assist in loading and initializing a requested JDBC driver. Other than using the DriverManager to register a JDBC driver registerDriver to make itself known and to provide the logging facility which is covered in detail later , a driver does not interface with the DriverManager.
In fact, once a JDBC driver is loaded, the DriverManager drops out of the picture all together, and the application or applet interfaces with the driver directly. When created, an SQLException can have three pieces of information: The following code shows how an SQLException is thrown: The main difference is in semantics.
If an SQLException is thrown, it is considered to be a critical error one that needs attention. If an SQLWarning is thrown, it is considered to be a non-critical error a warning or informational message. Because they are put on a list, it is up to the application to poll for warnings after the completion of an operation.
Listing Add the new warning chain. A DataTruncation object indicates that a data value that was being read or written was truncated, resulting in a loss of data.
The DataTruncation class has attributes that can be set to specify the column or parameter number, whether a truncation occurred on a read or a write, the size of the data that should have been transferred, and the number of bytes that were actually transferred. We can modify our code from Listing The data types are defined in Types.
In other words, you can get data as some type of object and put it back into a database as that same type of object, but the application has no idea what type of data is actually contained within. Character Data: Data of type CHAR is represented as a fixed-length String, and may include some padding spaces to ensure that it is the proper length.
If data is being written to a database, the driver must ensure that the data is properly padded. Exact Numeric Data: These data types are often used to represent currency values. Binary Data: Data of type BINARY is represented as a fixed-length byte array, and may include some padding zeros to ensure that it is the proper length. Boolean Data: Integer Data: Data of type BIGINT is represented as a Java long data type 8 bytes , with a minimum value of -9,,,,,, and a maximum value of 9,,,,,, Floating-Point Data: Data of type REAL supports seven digits of mantissa precision, and is represented as a Java float data type.
Be aware of date limitations. One important note about Date and Timestamp objects: The Java calendar starts at January 1, , which means that you cannot represent dates prior to This class is ideal for representing monetary values, allowing accurate arithmetic operations and comparisons.
Another aspect is the ability to change the rounding value. Rounding is performed if the value of the scale the number of fixed decimal places plus one digit to the right of the decimal point is greater than the rounding value.
By default, the rounding value is 4. For example, if the result of an arithmetic operation is 2. Imagine that you are a devious retailer investigating ways to maximize your profit by adjusting the rounding value.
Date class setting the hour, minutes, and seconds to zero and, most importantly, adds two methods to convert Strings into dates, and vice-versa: If an invalid date string is passed to the valueOf method, a java. IllegalArgument-Exception is thrown:The IconStore application accepts one command line argument: The user does not need to worry about the applet formatting the hard disk or reading password files.
Data is retrieved from the database using a database query mechanism. JDBC manages these three main programming activities: connecting to a database; sending queries and update statements to the database; retrieving and processing the results received from the database in answer to the query. The data is loaded from the file called db.
- CANDACE BUSHNELL LIPSTICK JUNGLE EBOOK
- ECOLOGY CONCEPTS AND APPLICATIONS MOLLES PDF
- PROGRAMA PARA ABRIR ARQUIVO PDF
- WEB SERVICE PATTERNS JAVA EDITION PDF
- PHOTOVOLTAIC DESIGN AND INSTALLATION MANUAL PDF
- JAVA PROGRAM TO PDF FILE
- FORENSIC MEDICINE AND TOXICOLOGY PDF
- ISO 14001 STANDARDS PDF
- THIRUKKURAL IN ENGLISH WITH MEANING PDF
- IELTS ON TRACK GENERAL TRAINING ING EBOOK
- MOBILE PDF VIEWER
- MAHABHARATA RK NARAYAN EBOOK
- DEATH MASKS EPUB