📄 cloudscapedataaccess.java
字号:
// Fig. 8.36: CloudscapeDataAccess.java
// An implementation of interface AddressBookDataAccess that
// performs database operations with PreparedStatements.
package com.deitel.advjhtp1.jdbc.addressbook;
// Java core packages
import java.sql.*;
public class CloudscapeDataAccess
implements AddressBookDataAccess {
// reference to database connection
private Connection connection;
// reference to prepared statement for locating entry
private PreparedStatement sqlFind;
// reference to prepared statement for determining personID
private PreparedStatement sqlPersonID;
// references to prepared statements for inserting entry
private PreparedStatement sqlInsertName;
private PreparedStatement sqlInsertAddress;
private PreparedStatement sqlInsertPhone;
private PreparedStatement sqlInsertEmail;
// references to prepared statements for updating entry
private PreparedStatement sqlUpdateName;
private PreparedStatement sqlUpdateAddress;
private PreparedStatement sqlUpdatePhone;
private PreparedStatement sqlUpdateEmail;
// references to prepared statements for updating entry
private PreparedStatement sqlDeleteName;
private PreparedStatement sqlDeleteAddress;
private PreparedStatement sqlDeletePhone;
private PreparedStatement sqlDeleteEmail;
// set up PreparedStatements to access database
public CloudscapeDataAccess() throws Exception
{
// connect to addressbook database
connect();
// locate person
sqlFind = connection.prepareStatement(
"SELECT names.personID, firstName, lastName, " +
"addressID, address1, address2, city, state, " +
"zipcode, phoneID, phoneNumber, emailID, " +
"emailAddress " +
"FROM names, addresses, phoneNumbers, emailAddresses " +
"WHERE lastName = ? AND " +
"names.personID = addresses.personID AND " +
"names.personID = phoneNumbers.personID AND " +
"names.personID = emailAddresses.personID" );
// Obtain personID for last person inserted in database.
// [This is a Cloudscape-specific database operation.]
sqlPersonID = connection.prepareStatement(
"VALUES ConnectionInfo.lastAutoincrementValue( " +
"'APP', 'NAMES', 'PERSONID')" );
// Insert first and last names in table names.
// For referential integrity, this must be performed
// before sqlInsertAddress, sqlInsertPhone and
// sqlInsertEmail.
sqlInsertName = connection.prepareStatement(
"INSERT INTO names ( firstName, lastName ) " +
"VALUES ( ? , ? )" );
// insert address in table addresses
sqlInsertAddress = connection.prepareStatement(
"INSERT INTO addresses ( personID, address1, " +
"address2, city, state, zipcode ) " +
"VALUES ( ? , ? , ? , ? , ? , ? )" );
// insert phone number in table phoneNumbers
sqlInsertPhone = connection.prepareStatement(
"INSERT INTO phoneNumbers " +
"( personID, phoneNumber) " +
"VALUES ( ? , ? )" );
// insert email in table emailAddresses
sqlInsertEmail = connection.prepareStatement(
"INSERT INTO emailAddresses " +
"( personID, emailAddress ) " +
"VALUES ( ? , ? )" );
// update first and last names in table names
sqlUpdateName = connection.prepareStatement(
"UPDATE names SET firstName = ?, lastName = ? " +
"WHERE personID = ?" );
// update address in table addresses
sqlUpdateAddress = connection.prepareStatement(
"UPDATE addresses SET address1 = ?, address2 = ?, " +
"city = ?, state = ?, zipcode = ? " +
"WHERE addressID = ?" );
// update phone number in table phoneNumbers
sqlUpdatePhone = connection.prepareStatement(
"UPDATE phoneNumbers SET phoneNumber = ? " +
"WHERE phoneID = ?" );
// update email in table emailAddresses
sqlUpdateEmail = connection.prepareStatement(
"UPDATE emailAddresses SET emailAddress = ? " +
"WHERE emailID = ?" );
// Delete row from table names. This must be executed
// after sqlDeleteAddress, sqlDeletePhone and
// sqlDeleteEmail, because of referential integrity.
sqlDeleteName = connection.prepareStatement(
"DELETE FROM names WHERE personID = ?" );
// delete address from table addresses
sqlDeleteAddress = connection.prepareStatement(
"DELETE FROM addresses WHERE personID = ?" );
// delete phone number from table phoneNumbers
sqlDeletePhone = connection.prepareStatement(
"DELETE FROM phoneNumbers WHERE personID = ?" );
// delete email address from table emailAddresses
sqlDeleteEmail = connection.prepareStatement(
"DELETE FROM emailAddresses WHERE personID = ?" );
} // end CloudscapeDataAccess constructor
// Obtain a connection to addressbook database. Method may
// may throw ClassNotFoundException or SQLException. If so,
// exception is passed via this class's constructor back to
// the AddressBook application so the application can display
// an error message and terminate.
private void connect() throws Exception
{
// Cloudscape database driver class name
String driver = "COM.cloudscape.core.RmiJdbcDriver";
// URL to connect to addressbook database
String url = "jdbc:cloudscape:rmi:addressbook";
// load database driver class
Class.forName( driver );
// connect to database
connection = DriverManager.getConnection( url );
// Require manual commit for transactions. This enables
// the program to rollback transactions that do not
// complete and commit transactions that complete properly.
connection.setAutoCommit( false );
}
// Locate specified person. Method returns AddressBookEntry
// containing information.
public AddressBookEntry findPerson( String lastName )
{
try {
// set query parameter and execute query
sqlFind.setString( 1, lastName );
ResultSet resultSet = sqlFind.executeQuery();
// if no records found, return immediately
if ( !resultSet.next() )
return null;
// create new AddressBookEntry
AddressBookEntry person = new AddressBookEntry(
resultSet.getInt( 1 ) );
// set AddressBookEntry properties
person.setFirstName( resultSet.getString( 2 ) );
person.setLastName( resultSet.getString( 3 ) );
person.setAddressID( resultSet.getInt( 4 ) );
person.setAddress1( resultSet.getString( 5 ) );
person.setAddress2( resultSet.getString( 6 ) );
person.setCity( resultSet.getString( 7 ) );
person.setState( resultSet.getString( 8 ) );
person.setZipcode( resultSet.getString( 9 ) );
person.setPhoneID( resultSet.getInt( 10 ) );
person.setPhoneNumber( resultSet.getString( 11 ) );
person.setEmailID( resultSet.getInt( 12 ) );
person.setEmailAddress( resultSet.getString( 13 ) );
// return AddressBookEntry
return person;
}
// catch SQLException
catch ( SQLException sqlException ) {
return null;
}
} // end method findPerson
// Update an entry. Method returns boolean indicating
// success or failure.
public boolean savePerson( AddressBookEntry person )
throws DataAccessException
{
// update person in database
try {
int result;
// update names table
sqlUpdateName.setString( 1, person.getFirstName() );
sqlUpdateName.setString( 2, person.getLastName() );
sqlUpdateName.setInt( 3, person.getPersonID() );
result = sqlUpdateName.executeUpdate();
// if update fails, rollback and discontinue
if ( result == 0 ) {
connection.rollback(); // rollback update
return false; // update unsuccessful
}
// update addresses table
sqlUpdateAddress.setString( 1, person.getAddress1() );
sqlUpdateAddress.setString( 2, person.getAddress2() );
sqlUpdateAddress.setString( 3, person.getCity() );
sqlUpdateAddress.setString( 4, person.getState() );
sqlUpdateAddress.setString( 5, person.getZipcode() );
sqlUpdateAddress.setInt( 6, person.getAddressID() );
result = sqlUpdateAddress.executeUpdate();
// if update fails, rollback and discontinue
if ( result == 0 ) {
connection.rollback(); // rollback update
return false; // update unsuccessful
}
// update phoneNumbers table
sqlUpdatePhone.setString( 1, person.getPhoneNumber() );
sqlUpdatePhone.setInt( 2, person.getPhoneID() );
result = sqlUpdatePhone.executeUpdate();
// if update fails, rollback and discontinue
if ( result == 0 ) {
connection.rollback(); // rollback update
return false; // update unsuccessful
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -