CS 430/630 Homework 4 Intro to JDBC

Homework 4 due Tuesday midnight Nov. 27.

 1. Run JdbcCheckup.java (in the jdbc directory of our home page) using your Oracle account while logged in on pe07 and also from your development system. Specifically, copy the jdbc directory from /data/htdocs/cs630 to your cs630 homework directory:

cp -r /data/htdocs/cs630/jdbc cs630          (assuming your current directory is your login directory on pe07 or users)

That will give you the needed driver jar files as well as JdbcCheckup.java itself. Don't forget you need the driver jar file on the command line when you run the program, as detailed in the header comment in JdbcCheckup.java. Put the script of the pe07 run in hw4/JdbcCheckup_pe07.txt in your cs630/hw4 directory. To make a script, run "script", then run JdbcCheckup, then exit and rename typescript to JdbcCheckup_pe07.script.  Optionally, run it using mysql on pe07 as well.

Transfer the whole jdbc directory to your development system. Note that you will need a tunnel to access Oracle from your dev system. See DatabaseSetup. Compile and run JdbcCheckup using the command line. Put the text of your dev system run in JdbcCheckup_devsys.txt and transfer it back to your cs630/hw4 directory. If you have decided to do the program development on pe07 rather than on your own development system, say so in a README file and explain how you will be editing files for use on pe07. In this case, your "pe07" script will be enough. Optionally, run JdbcCheckup to mysql on pe07.

Once you have JdbcCheckup working on the command line, you could try running it an IDE (Netbeans, eclipse, etc.) if that is how you develop Java programs. Note that each IDE has some way to add jar files (i.e. libraries) to a project. If you don't want to use an IDE, that's fine too. In that case use a text editor as described in DevelopmentSetup.

2. Consider the flights-aircraft-employees-certified database of our createdb.sql. The times (using SQL datatype timestamp) are assumed to all be using one timezone, so we don't have to worry about timezones. Read about the timestamp datatype for Oracle on pp. 531-545 of Murach, and, optionally, here for MySQL. FYI: Oracle can handle timezones, so we could handle data that specified various timezones, as shown on pg. 549 of Murach.

Write a small Java program FindFlights that accepts database credentials like JdbcCheckup, and then accepts two cities (Los-Angeles and Chicago for example) and finds the flights from the first to the second in the flights table. For the selected flights, print out the flight number, distance, and duration of the flight, computed by time difference (and displayed in hours:min:sec or days hours:min:sec). Note that one of the time differences is negative: just report it that way. Note: don't use LIKE where equals (=) can be used to match the city name. Equals is much faster in general.

First write the query in query2.sql (output in query2.txt) to display the information for Los-Angeles and Chicago. It's easier to debug a query outside the program.

A timestamp difference like arrives-departs has SQL type INTERVAL DAY TO SECOND (from SQL92, so hopefully portable), described in Murach, pg. 561. Unfortunately, JDBC will not map a SQL interval value to a time-related datatype of Java (and in fact Java has no specific time-interval type), but it will map it to String type, so one way to get the time difference is to form the difference in SQL in the select list, give it an alias, and use getString on that column of SQL output. You will receive a string in "days hr:min:sec" format. Alternatively, get JDBC to map the individual timestamps to java.sql.Timestamp values and then use Timestamp methods such as getTime() to convert to seconds, and then to minutes, hours and days.

Provide a typescript FindFlights.txt showing FindFlights reports on Los-Angeles to Honolulu, Los-Angeles to Sydney, and Madison to Chicago (3 runs of the program). The same program should work on both Oracle and Mysql, so use either one for output.

3. Recall that Las Vegas is well-represented in the YelpDB data that we have. I have added a table yelp_db.apartments that lists 215 locations in Las Vegas for (supposed) apartments for rent. Each apartment has a listing number, address, neighborhood, etc., and latitude and longitude.  Since each business also has longitude/latitude information, we can get the database to calculate distances to various useful points close by to each apartment. Note that although the set of apartment locations (longitude, latitude) is the same on Oracle and mysql, they are numbered with somewhat different listing numbers on the two systems due to a quirk in how they were generated.

Oracle and Mysql code to compute a distance between two given longitude/latitude points is provided in the jdbc directory in files OracleDistanceExample.sql and MysqlDistanceExample.sql and the results agree well enough for our purposes.

Write a Java program FindRestaurants that accepts database credentials like JdbcCheckup, and then accepts a listing number for one apartment. The program then queries the businesses in Las Vegas, NV and, for each restaurant within 200 meters of the apartment, displays the name, rating, and number of reviews of each such restaurant, but only if there are at least 10 reviews. A restaurant is a business with category 'Restaurants' assigned to it. Be sure to restrict the query to businesses in Las Vegas, NV to get decent performance by avoiding useless distance calculations to businesses outside this city.

First write the query for apartment listing 25 that displays this information and put it in query3.sql. Provide a typescript FindRestaurants_oracle.txt or FindRestaurants_mysql.txt depending on which database you focused on, showing listing 25 again. In fact, Mysql is easier to use for this, as will be evident by looking at the *DistanceExample.sql files.

4. Database rows and Java objects. Study the emaillist example (partly from Murach's Java Servlets and JSP book) available in the emaillist subdirectory of the class home. See its README. This example uses a User object to hold information on one user, and holds the information on emaillist users in a database table userdb. The provided program EmailList.java accepts new emaillist users for the database. Write a Java program EditUser.java to allow changes to information on one emaillist user. EditUser should accept database credentials and connect to the database as EmailList does, then additionally request a emailList user email via readEntry, then call UserDB.selectUser to get that user's User object. Then output the firstname, ask for changed firstname or nullstring for no change, and similarly for lastname. Then use UserDB calls to change the database to reflect the edit. Use delete and insert or provide an update method and use that. Provide a typescript EmailList.txt that shows execution of dropuserdb.sql, createuserdb.sql, then a run of EmailList like that in README, followed by a run of EditUser editing information on swong@gmail.com, specifically changing Sue to Susan.

Files to deliver in cs630/hw4: (the .class and .jar driver files are also expected.)

README: explanations to grader.

1. JdbcCheckup_pe07.txt, JdbcCheckup_devsys.txt
2. query2.sql, query2.txt, FindFlights.java, FindFlights.txt
3. query3.sql, query3.txt, FindRestaurants.java, FindRestaurants_oracle.txt or FindRestaurants_mysql.txt
4. files from emaillist directory except its README, plus EditUser.java, EmailList.txt