Java Database Connectivity (JDBC)

advertisement
EXAMPLE I
An application showing JDBC
access to Cloudscape.
http://www-306.ibm.com/software/data/cloudscape/
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import com.ibm.db2j.drda.DB2jServer;
public class SimpleApp {
/* the default framework is embedded*/
public String framework = "embedded";
public String driver = "com.ibm.db2j.jdbc.DB2jDriver";
public String protocol = "jdbc:db2j:";
public static void main (String[] args) {
new SimpleApp().go( args);
}
void go (String args[]) {
/* parse the arguments to determine which framework is desired*/
parseArguments( args);
System.out.println ("SimpleApp starting in " + framework + "
mode.");
try {
/* The driver is installed by loading its class. In an embedded
environment, this will start up Cloudscape, since it is not already
running. */
Class.forName(driver).newInstance();
System.out.println ("Loaded the appropriate driver.");
Connection conn = null;
Properties props = new Properties();
props.put ("user", "user1");
props.put ("password", "user1");
/* The connection specifies create=true to cause the database to be
created. To remove the database, remove the directory db2jDB and its
contents. The directory db2jDB will be created under the directory that
the system property db2j.system.home points to, or the current directory
if db2j.system.home is not set. */
if (framework.equals ("embedded")) {
conn = DriverManager.getConnection (protocol +
"db2jDB;create=true", props);
}
else { // jccjdbc framework
DB2jServer server = new DB2jServer(null);
server.testConnection("db2jDB;create=true", null, null, "localhost",
1527);
conn = DriverManager.getConnection(protocol +
"//localhost:1527/db2jDB", props);
}
System.out.println ("Connected to and created database db2jDB");
conn.setAutoCommit(false);
/* Creating a statement lets us issue commands against
the connection. */
Statement s = conn.createStatement();
// We create a table, add a few rows, and update one.
s.execute ("create table db2jDB(num int, addr varchar(40))");
System.out.println ("Created table db2jDB");
s.execute ("insert into db2jDB values (1956,'Webster St.')");
System.out.println ("Inserted 1956 Webster");
s.execute ("insert into db2jDB values (1910,'Union St.')");
System.out.println ("Inserted 1910 Union");
s.execute( "update db2jDB set num=180, addr='Grand Ave.'
where num=1956");
System.out.println ("Updated 1956 Webster to 180 Grand");
s.execute( "update db2jDB set num=300, addr='Lakeshore Ave.'
where num=180");
System.out.println ("Updated 180 Grand to 300 Lakeshore");
// We select the rows and verify the results.
ResultSet rs = s.executeQuery ("SELECT num, addr
FROM db2jDB ORDER BY num");
if (!rs.next())
throw new Exception ("Wrong number of rows");
if (rs.getInt(1)!=300)
throw new Exception ("Wrong row returned");
if (!rs.next())
throw new Exception ("Wrong number of rows");
if (rs.getInt(1)!=1910)
throw new Exception ("Wrong row returned")
if (rs.next())
throw new Exception ("Wrong number of rows");
System.out.println ("Verified the rows");
s.execute ("drop table db2jDB");
System.out.println ("Dropped table db2jDB");
// We release the result and statement resource
rs.close();
s.close();
System.out.println ("Closed result set and statement");
// We end the transaction and the connection.
conn.commit();
conn.close();
System.out.println ("Committed transaction and closed
connection");
/* In embedded mode, an application should shut down Cloudscape.
If the application fails to shut down Cloudscape explicitly, the
Cloudscape does not perform a checkpoint when the JVM shuts down,
which means that the next connection will be slower.
Explicitly shutting down Cloudscape with the URL is preferred. This style
of shutdown will always throw an "exception". */
boolean gotSQLExc = false;
if (framework.equals ("embedded")) {
try {
DriverManager.getConnection("jdbc:db2j:;shutdown=true");
} catch (SQLException se) {
gotSQLExc = true;
}
if (!gotSQLExc)
System.out.println ("Database did not shut down normally");
else
System.out.println( "Database shut down normally");
}
}
catch (Throwable e) {
System.out.println ("exception thrown:");
if (e instanceof SQLException)
printSQLError( (SQLException) e);
else
e.printStackTrace();
}
System.out.println ("SimpleApp finished");
}
static void printSQLError (SQLException e) {
while (e != null) {
System.out.println (e.toString())
e = e.getNextException();
}
}
private void parseArguments(String[] args) {
int length = args.length;
for (int index = 0; index < length; index++)
{
if (args[index]. equalsIgnoreCase ("jccjdbcclient"))
{
framework = "jccjdbc";
driver = "com.ibm.db2.jcc.DB2Driver";
protocol = "jdbc:db2j:net:"; // localhost:1527
}
}
}
}
This program accomplishes the
following tasks:









starts up the Cloudscape engine, if necessary
creates and connects to a database
creates a table
inserts data
updates data
selects data
drops a table
disconnects
shuts down Cloudscape, if necessary
Run in the Embedded Environment
 The simplest Cloudscape environment.
 The application starts up an instance of
Cloudscape within the current JVM and shuts
down the instance before it completes.
 No network access is involved. In an
embedded environment, only one application
at a time can access a database.
New Files and Directories: after
running the application
 db2jDB (directory) The directory that makes up the db2jDB
database.
We must not modify anything in this directory, or we will corrupt
the database.
The directory was created when the application connected with
Cloudscape, using the attribute create=true in the database
connection URL.
The database name, db2jDB, was also set in the database
connection URL.
 db2jDB\log (directory) The directory that holds the database
log for the db2jDB database.
 db2jDB\seg0 (directory) The directory that holds the data for
the db2jDB database.
 db2jDB\service.properties An internal file that holds boottime configuration parameters for the db2jDB database; do
not edit.
 db2j.LOG The log file with Cloudscape progress and error
messages.
Setting Class Path for an
Embedded Environment
 Cloudscape provides a script to help us
get started setting class path in
%DB2J_INSTALL%bin
 This script is called setCP and
comes for Windows environment with .bat
For users working in this environment, copying the
commands in this file will help us get started
setting the class path.
Running the Application in an
Embedded Environment
 Open a command window and change directory in
which the application files are copied
For example: C:\Cloudscape_5.1\bin
 DB2J_INSTALL environment variable is set to the
the directory we installed the Cloudscape software
(C:\Cloudscape_5.1)
 Run Cloudscape's utility for testing the class path
for an embedded environment
java com.ibm.db2j.tools.sysinfo -cp arguments
or
java com.ibm.db2j.tools.sysinfo -cp embedded
SimpleApp.class
com.ibm.db2j.tools
public class sysinfo extends java.lang.Object
This class (sysinfo) displays system information to system
out.
 This class displays system information to system out. To
run from the command-line, enter the following:
java com.ibm.db2j.tools.sysinfo
 Also available on this class are methods which allow us
to determine the version of the code for the system
without actually booting a database.
 This is the Cloudscape version of the .jar files, not of our databases.
If the environment is set up
correctly
 The utility shows output indicating success.
 It looks like the following:
FOUND IN CLASS PATH:
Cloudscape primary library (db2j.jar)
Valid Cloudscape license (Cloudscape primary
library, or for evaluation copies of the software
only, license.jar)
user-specified class (SimpleApp)
SUCCESS: All Cloudscape-Related classes for
embedded environment found in class path.
If something is missing from class
path environment
 The utility indicates what is missing
 For example, if we neglected to add the directory containing
the SimpleApp class to our class path, the utility would
indicate as such:
Testing for presence of Cloudscape-related libraries for
embedded environment.
FOUND IN CLASS PATH:
Cloudscape primary library (db2j.jar)
Valid Cloudscape license (Cloudscape primary library, or for
evaluation copies of the software only, license.jar)
NOT FOUND IN CLASS PATH:
user-specified class (SimpleApp)
(SimpleApp not found.)
If we have our environment set
up correctly
 we can execute the application from the same directory
java SimpleApp
 A successful run produces the following output:
SimpleApp starting in embedded mode.
Loaded the appropriate driver.
Connected to and created database db2jDB
Created table db2jDB
Inserted 1956 Webster
Inserted 1910 Union
Updated 1956 Webster to 180 Grand
Updated 180 Grand to 300 Lakeshore
Verified the rows
Dropped table db2jDB
Closed result set and statement
Committed transaction and closed connection
Database shut down normally
create=true
function
 Creates the standard database specified
within the database connection URL
 Cloudscape system and then connects to
it.
 If the database cannot be created, the
error appears in the error log and the
connection attempt fails with an
SQLException indicating that the database
cannot be found.
EXAMPLE II
An application showing JDBC
access to MySQL
import java.sql.*;
public class JdbcExam2 {
public static void main(String args[]) {
Connection con = null;
Statement st = null;
ResultSet rs = null;
try {
Class.forName ("com.mysql.jdbc.Driver"). newInstance();
con = DriverManager.getConnection ("jdbc:mysql:///examples", "root", "secret");
st = con.createStatement();
rs = st. executeQuery ("SELECT user_id, first_name, last_name,
country_code FROM users");
while (rs.next()) {
int userId = rs.getInt(1);
String firstName = rs.getString(2);
String lastName = rs.getString(3);
String countryCode = rs.getString(4);
System.out.println(userId + ". " + lastName + ", " +
firstName + " (" + countryCode + ")");
}
} catch (Exception e) {
System.err.println ("Exception: " + e.getMessage());
} finally {
try {
if(rs != null)
rs.close();
if(st != null)
st.close();
if(con != null)
con.close();
} catch (SQLException e) {
}
}
}
}
Step by Step Explanations
 We create 3 variables to hold Connection,
Statement and ResultSet objects for us
which we'll create later in a try/catch/finally
block.
Connection con = null;
Statement st = null;
ResultSet rs = null;
 Then, we enter a try/catch/finally block.
Our data access code will reside in the try block
Exception notification code in the catch block
Code to close the connection in the finally block
Step by Step Explanations
cont’d
 First thing we do to display records is to
obtain a connection to MySQL database
 we do that my first loading it's JDBC (Connector/J) driver and then
using DriverManager to obtain a connection to our "examples"
database.
 We might want to change the password from
"secret" to whatever is our password for
'root' account.
Class.forName ("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection
( "jdbc:mysql:///examples", "root", "secret");
Step by Step Explanations
cont’d
 Once we are connected, we create a new
SQL Statement object.
st = con.createStatement();
 We then execute this statement to obtain a
ResultSet which contains all the records from the
"users" table and we do that by executing a
SELECT SQL statement.
rs = st.executeQuery("SELECT user_id,
first_name, last_name, " + "country_code FROM
users");
Step by Step Explanations
cont’d
 We then iterate through that ResultSet to obtain values for
each field of the "users" table. We then print these values on
the user console
 In the finally block we close off our ResultSet, Statement
and Connection objects.
Finally:
 Compile the example,
 Before running the Java program, make sure that
MySQL server is running
 properly created and setup "examples" database and "users" table.
 Now to run our Java program, execute following
command at the command prompt from the folder
Download