Chapter 15 Creating More Complex Database Applications Chapter 15 - Creating More Complex Database Applications 1 15 One to One Relationships There is a one-to-one relationship between Customer and Boat A customer always owns exactly one boat and a boat always belongs to just one customer Use a database to implement the one-toone association using a relational database Chapter 15 - Creating More Complex Database Applications 2 15 Understanding Tables in CustomerAndBoatDatabase 1. Create Chapter15Example1 folder 2. Locate CustomerAndBoatDatabase.mdb on the CD 3. Open CustomerAndBoatDatabase using Microsoft Access 4. View the contents of the BoatTable The primary key of BoatTable is StateRegistrationNo 5. View the contents of the CustomerTable The primary key of CustomerTable is PhoneNo Chapter 15 - Creating More Complex Database Applications 3 Understanding Tables in CustomerAndBoatDatabase Chapter 15 - Creating More Complex Database Applications 15 4 Understanding Tables in CustomerAndBoatDatabase Chapter 15 - Creating More Complex Database Applications 15 5 15 Understanding Tables in CustomerAndBoatDatabase Chapter 15 - Creating More Complex Database Applications 6 Understanding Tables in CustomerAndBoatDatabase Chapter 15 - Creating More Complex Database Applications 7 Understanding Tables in CustomerAndBoatDatabase Chapter 15 - Creating More Complex Database Applications 15 8 15 Using SQL to Join Table in Database The SQL statement to find and display the state registration number and manufacturer of all boats in BoatTable together with the name and phone number of each boats owner: SELECT StateRegistration, Manufacturer, CustomerName, PhoneNo FROM BoatTable, CustomerTable WHERE CustomerPhoneNo = PhoneNo; Chapter 15 - Creating More Complex Database Applications 9 15 Using SQL to Join Table in Database The SQL statement displays the state registration number, name, and address of the owner of the boat with state registration number MO98765: SELECT StateRegistration, Manufacturer, CustomerName, PhoneNo FROM BoatTable, CustomerTable WHERE CustomerPhoneNo = PhoneNo AND StateRegistrationNo = ‘MO98765’; Chapter 15 - Creating More Complex Database Applications 10 Establishing a Common Connection Need a new class named CustomerAndBoatDatabaseConnect It is responsibility of this class is to manage the connection to the database The initialize method establishes a connection of the database Chapter 15 - Creating More Complex Database Applications 11 Modifying the Customer PD Include a boat reference attribute Initialize boat reference to null in constructor Include setter and getter methods to set and retrieve boat reference Use the common database connection established by CustomerAndBoatDatabaseConnect Chapter 15 - Creating More Complex Database Applications 12 15 The BoatDA Class Adds find, add, delete, and update methods Defines a boat reference variable and a Vector of boat reference variables Chapter 15 - Creating More Complex Database Applications 13 15 The BoatDA Class – Initialize and Terminate Initialize uses the database connection established by CustomerAndBoatDatabaseConnect to create a Statement Terminate closes the Statement instance Chapter 15 - Creating More Complex Database Applications 14 15 The BoatDA Class – find and getAll Methods The find method defines a SELECT statement that retrieves a particular record from BoatTable Find throws a NotFoundException if the record is not found The getAll method returns a Vector of boat references Chapter 15 - Creating More Complex Database Applications 15 The BoatDA Class – addNew Method Similar to the addNew method of the Customer class Extracts boat attributes from the boat instance received Create a SQL INSERT statement Before executing INSERT need to confirm that the database does not already contain a duplicate – using the find method If a duplicate is found a DuplicateException is thrown Chapter 15 - Creating More Complex Database Applications 16 The BoatDA Class – update and delete Methods The update and delete methods extract attributes from the boat instance received in the argument list, then define the appropriate SQL statements Before executing UPDATE and DELETE need to confirm that the database already contains the record – using the find method If a record is not found a NotFoundException is thrown Chapter 15 - Creating More Complex Database Applications 17 15 Modifying the Boat Class to Work with BoatDA Can extend the functionality of the Boat PD to use the BoatDA class The Boat class needs four static methods: Initialize Find getAll Terminate Three instance methods: addNew Update delete Chapter 15 - Creating More Complex Database Applications 18 15 Modifying the CustomerDA Class Change the CustomerDA class to support joining information from the BoatTable and CustomerTable Now includes a reference to a Boat object Chapter 15 - Creating More Complex Database Applications 19 CustomerDA Class – find and getAll Methods Change the SQL statement WHERE clause to specify both the join condition and the primary key for the customer of interest Chapter 15 - Creating More Complex Database Applications 20 CustomerDA Class – find and getAll Methods Chapter 15 - Creating More Complex Database Applications 21 CustomerDA Class – addNew Method The is a mandatory one-to-one relationship between Customer and Boat Must be a customer record for every boat record – the addNew method must enforce this requirement After inserting a customer record into CustomerTable, a record must be inserted into the BoatTable Preserves the integrity of the database Chapter 15 - Creating More Complex Database Applications 22 15 CustomerDA Class – delete and update Methods The delete method must also preserve the integrity of the database When a customer record is deleted, the corresponding boat record must be deleted as well The update method is unchanged Chapter 15 - Creating More Complex Database Applications 23 Testing the CustomerAndBoatDatabase Application 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 15 Declare necessary reference variables Invoke the initialization method Attempt to retrieve customer and boat information for customer whose phone number is 123-4567 Use the printDetails method to display the results Try to retrieve a record that doesn’t exist Call the getAll method Create a new Customer and Boat instance Call the addNew method Verify records have been added Test the delete method Test the update method Call the terminate method Chapter 15 - Creating More Complex Database Applications 24 Implementing a One-To-Many Relationship 15 The relationship between Dock and Slip is a one-to-many relationship A dock contains many slips A slip belongs to one dock Chapter 15 - Creating More Complex Database Applications 25 Understanding the Tables in DockAndSlipDatabase 1. 2. 3. 4. Create a Chapter15Example2 folder Copy the DockAndSlipDatabase from the CD Open the database in Microsoft Access View the DockTable DockID is the primary key 5. View the SlipTable SlipNo and DockID form the concatenated primary key DockID is a foreign key for DockTable Chapter 15 - Creating More Complex Database Applications 26 Understanding the Tables in DockAndSlipDatabase Chapter 15 - Creating More Complex Database Applications 27 Understanding the Tables in DockAndSlipDatabase Chapter 15 - Creating More Complex Database Applications 28 Common Connection to DockAndSlipDatabase 15 Need a separate DA class to establish a connection Same as CustomerAndBoatDatabaseConnect class except: Different data source is used Chapter 15 - Creating More Complex Database Applications 29 15 Modifying the Dock and Slip Classes Dock class must be modified to support object persistence in a relational database Implement the initialize, terminate, find, and getAll methods Implement a tellAboutSelf method Don’t need to modify the Slip class nor create a SlipDA class -- WHY? See Figure 15-25 on pp. 557-558 Chapter 15 - Creating More Complex Database Applications 30 15 Introducing the DockDA Class Similar to other DA classes, except it does not require insert, update, or delete methods Methods used to terminate and initialize are similar to other DA classes See pp. 559-563 Chapter 15 - Creating More Complex Database Applications 31 DockDA Class – find Method Needs SQL statement to extract dock and slip information from the database WHERE clause specifies both the join condition and the primary key for the dock of interest ORDER BY clause specifies the information returned by the query is sorted by slip number Chapter 15 - Creating More Complex Database Applications 32 DockDA Class – find Method Chapter 15 - Creating More Complex Database Applications 15 33 DockDA Class – getAll Method Similar to find method Returns dock and slip information for all slips in the marina, sorted by dock and then slip Dock information is repeated for each slip Creates only one dock instance however Control-break logic is used to manage this See Figure 15-26 on pp. 563 Chapter 15 - Creating More Complex Database Applications 34 DockDA Class – getAll Method Chapter 15 - Creating More Complex Database Applications 15 35 Testing the DockAndSlipDatabase Application 1. Define necessary variable and establish the connection to the database 2. Attempt to find Dock 1 3. printDetails method displays information about the dock and slips 4. Attempt to find Dock 2 and slips 5. Invoke the getAll method Chapter 15 - Creating More Complex Database Applications 36 Testing the DockAndSlipDatabase Application Chapter 15 - Creating More Complex Database Applications 37 Implementing an Association Class The Lease class has associated AnnualLease and DailyLease subclasses Implement the Lease association class in a relational database application Chapter 15 - Creating More Complex Database Applications 38 Understanding Tables in CustomerLeaseSlipDatabase 15 Create a Chapter15Example3 folder Open the CustomerLeaseSlipDatabase View the CustomerTable, LeaseTable, and SlipTable Customer phone number is primary key for LeaseTable Slip number and dock ID are foreign keys in LeaseTable Chapter 15 - Creating More Complex Database Applications 39 Understanding Tables in CustomerLeaseSlipDatabase Chapter 15 - Creating More Complex Database Applications 40 Understanding Tables in CustomerLeaseSlipDatabase Chapter 15 - Creating More Complex Database Applications 15 41 15 Modifying the Customer Class Need to associate a customer instance with a lease instance Need to add a lease reference to the CustomerPD class Include getter and setter methods for the lease reference See Figure 15-31 on pp. 569-570 Chapter 15 - Creating More Complex Database Applications 42 15 Modifying the Lease and AnnualLease Class Must associate the lease with a customer’s slip Need to add a slip reference and customer reference Include getter and setter references to manage these references See Figures 15-32 and 15-33 Chapter 15 - Creating More Complex Database Applications 43 15 Modifying the Slip Class Must associate a slip with its corresponding lease and customer Need to add an annual lease reference to the attribute list and set its value to null Three DA methods are needed: Initialize Terminate Find – requires two parameters – slip number and dock ID Chapter 15 - Creating More Complex Database Applications 44 15 The SlipDA Class You must find a particular slip so it can be leased to a customer Need a SlipDA class Initialize and Terminate methods are identical to other DA classes Find method defines a SELECT statement that returns information from the SlipTable for a particular slip Chapter 15 - Creating More Complex Database Applications 45 The AnnualLeaseDA Class Must find and insert information about annual leases in the database Define variables for annual lease attributes Uses standard initialize and terminate methods Chapter 15 - Creating More Complex Database Applications 46 AnnualLeaseDA Class - find Query retrieves information from three tables: CustomerTable, LeaseTable, and SlipTable The WHERE clauses uses the relationships between these tables to create the join conditions The setCustomer method establishes a link with the annual lease instance Chapter 15 - Creating More Complex Database Applications 47 AnnualLeaseDA Class - addNew Receives a reference to the annual lease instance that will be added Lease amount, balance, payment, and start date are extracted Before executing SQL statement that inserts into LeaseTable – checks to see if primary key already exists in the database Chapter 15 - Creating More Complex Database Applications 48 Testing CustomerLeaseSlipDatabase Application 1. 2. 3. 4. 5. 6. 7. Declare instances of AnnualLease, Customer, and Slip Add a new record to LeaseTable Locate customer 123-4567 Find Slip 1 on Dock 1 Create a new annual lease instance Retrieve newly added information Close the database connection Chapter 15 - Creating More Complex Database Applications 49 Testing CustomerLeaseSlipDatabase Application Chapter 15 - Creating More Complex Database Applications 15 50