ΚΕΡΑΜΟΠΟΥΛΟΣ ΕΥΚΛΕΙΔΗΣ
Σε ένα πρόγραμμα κατά την εκτέλεση του ένα ερώτημα SQL μπορεί δυναμικά να παίρνει διαφορετικές παραμέτρους μπορεί να πάρει πολλές παραμέτρους oι παράμετροι δηλώνονται με? Στις παραμέτρους περνάμε τιμές με τις μεθόδους set Επειδή ένα PreparedStatement είναι προμεταγλωτισμένο είναι γρηγορότερο. Η PreparedStatement είναι υποκλάση της Statement και γι αυτό κληρονομεί όλη τη λειτουργικότητα της. Οι δύο μέθοδοι που μελετήσαμε στην Statement υπερφορτώνονται στην PreparedStatement και χρησιμοποιούνται αποκλειστικά χωρίς παραμέτρους executequery executeupdate Δρ. Κεραμόπουλος Ευκλείδης 2
PreparedStatement pstmt = con.preparestatement( "UPDATE table4 SET m =? WHERE x =?"); όπου m και l δύο long μεταβλητές. pstmt.setlong(1, 123456789); pstmt.setlong(2, 100000000); int rowcount = 0 pstmt.setstring(1, "Hi"); for (int i = 0; i < 10; i++) { pstmt.setint(2, i); rowcount = pstmt.executeupdate(); } Δρ. Κεραμόπουλος Ευκλείδης 3
1. import java.sql.*; 2. class Jdbc_mini_update2_db2 3. { 4. static String driverclassname = " org.postgresql.driver " ; 5. static String url = "jdbc:postgresql://aetos.it.teithe.gr:5432/dblab6" ; 6. static Connection dbconnection = null; 7. static PreparedStatement prestatement = null; 8. public static void main (String[] argv) throws Exception 9. { 10. Class.forName (driverclassname); 11. dbconnection = DriverManager.getConnection (url, "db399", "07O17"); 12. 13. String updatestring = "UPDATE Sailors " + 14. "SET rating =? " + 15. "WHERE age >?"; 16. prestatement = dbconnection.preparestatement(updatestring); 17. prestatement.setint(1,20); 18. prestatement.setint(2,35); 19. int n = prestatement.executeupdate(); 20. System.out.println(n + " records updated"); 21. prestatement.close(); 22. dbconnection.close(); 23. } 24. } Δρ. Κεραμόπουλος Ευκλείδης 4
1. import java.sql.*; 2. import java.io.*; 3. class Jdbc_mini_insert2_db2 4. { 5. static String driverclassname = " org.postgresql.driver " ; 6. static String url = "jdbc:postgresql://aetos.it.teithe.gr:5432/dblab6" ; 7. static Connection dbconnection = null; 8. public static void main (String[] argv) throws Exception 9. { 10. Class.forName (driverclassname); 11. dbconnection = DriverManager.getConnection (url, "db399", "07O17"); 12. PreparedStatement insertboats; 13. String insertstring = "insert into Boats (bid, bname, color) values (?,?,?)"; 14. insertboats = dbconnection.preparestatement(insertstring); 15. int[] BoatBid = {105, 106, 107}; 16. String[] BoatBname = {"Maria", "Sofia", "George }; 17. String[] BoatColor = {"red", "green", "blue"}; 18. for(int i=0; i < 3; i++){ 19. insertboats.setint(1, BoatBid[i]); 20. insertboats.setstring(2, BoatBname[i]); 21. insertboats.setstring(3, BoatColor[i]); 22. insertboats.executeupdate(); 23. } 24. BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in)); Δρ. Κεραμόπουλος Ευκλείδης 5
25. int boatbid2 = 0; 26. String temp2 = ""; 27. String boatbname2 = ""; 28. String boatcolor2 = ""; 29. while(boatbid2!= 999) { 30. System.out.print("Enter boad code : "); 31. temp2 = keyboard.readline(); 32. boatbid2 = Integer.parseInt(temp2); 33. if (boatbid2!= 999) { 34. System.out.print("Enter boad name : "); 35. boatbname2 = keyboard.readline(); 36. System.out.print("Enter boad color: "); 37. boatcolor2 = keyboard.readline(); 38. insertboats.setint(1, boatbid2); 39. insertboats.setstring(2, boatbname2); 40. insertboats.setstring(3, boatcolor2); 41. insertboats.executeupdate(); 42. } 43. } 44. insertboats.close(); 45. dbconnection.close(); 46. } 47. } Δρ. Κεραμόπουλος Ευκλείδης 6
Μπορούμε να έχουμε πρόσβαση ταυτόχρονα σε όσες πηγές δεδομένων χρειαζόμαστε. Χρειαζόμαστε ένα driver ανά DBMS και ένα url ανά πηγή. Δρ. Κεραμόπουλος Ευκλείδης 7
1. import java.sql.*; 2. class Jdbc_two_drivers { 3. static String driverclassname1 = " org.postgresql.driver" ; 4. static String driverclassname2 = "com.ibm.db2.jcc.db2driver" ; 5. static String url1 = " jdbc:postgresql://aetos.it.teithe.gr:5432/dblab6"; 6. static String url2 = " jdbc:db2://192.168.16.99:50000/db2lab" ; 7. static Connection dbconnection1 = null; 8. static Connection dbconnection2 = null; 9. static Statement statement1 = null; 10. static Statement statement2 = null; 11. static ResultSet rs1 = null; 12. static ResultSet rs2 = null; 13. public static void main (String[] argv) throws Exception { 14. Class.forName (driverclassname1); 15. dbconnection1 = DriverManager.getConnection (url1, "db399", "07Ο17"); 16. statement1 = dbconnection1.createstatement(); 17. Class.forName (driverclassname2); 18. dbconnection2 = DriverManager.getConnection (url2, db399", "07Ο17"); 19. statement2 = dbconnection2.createstatement(); Δρ. Κεραμόπουλος Ευκλείδης 8
20. statement1.executeupdate("insert into Sailors (sid, sname, rating, age) values (22, 'Dustin', 7, 45.0)"); 21. statement1.executeupdate("insert into Boats(bid, bname, color) values (101, 'Interlake', 'blue')"); 22. statement1.executeupdate("insert into Reserves(sid, bid, day1) values (22, 101, '10/10/1998')"); 23. statement2.executeupdate("insert into Sailors (sid, sname, rating, age) values (22, 'Dustin', 7, 45.0)"); 24. statement2.executeupdate("insert into Boats(bid, bname, color) values (101, 'Interlake', 'blue')"); 25. statement2.executeupdate("insert into Reserves(sid, bid, day1) values (22, 101, '10/10/1998')"); 26. statement1.close(); 27. dbconnection1.close(); 28. statement2.close(); 29. dbconnection2.close(); 30. } 31. } Δρ. Κεραμόπουλος Ευκλείδης 9
2o παράδειγμα Δρ. Κεραμόπουλος Ευκλείδης 10
1. import java.sql.*; 2. class Jdbc_two_drivers 3. { 4. static String driverclassname1 = " org.postgresql.driver" ; 5. static String driverclassname2 = "com.ibm.db2.jcc.db2driver" ; 6. static String url1 = " jdbc:postgresql://aetos.it.teithe.gr:5432/dblab4"; 7. static String url2 = " jdbc:db2://192.168.16.99:50000/db2lab1" ; 8. static Connection dbconnection1 = null; 9. static Connection dbconnection2 = null; 10. static Statement statement1 = null; 11. static Statement statement2 = null; 12. static ResultSet rs1 = null; 13. static ResultSet rs2 = null; 14. public static void main (String[] argv) throws Exception 15. { 16. Class.forName (driverclassname1); 17. dbconnection1 = DriverManager.getConnection (url1, db320", 66Y91"); 18. statement1 = dbconnection1.createstatement(); 19. Class.forName (driverclassname2); 20. dbconnection2 = DriverManager.getConnection (url2, db320", 66Y91"); 21. statement2 = dbconnection2.createstatement(); 22. String selectstring1 = "SELECT sid, sname " + 23. "From Sailors"; 24. String selectstring2 = "SELECT sid" + 25. "From Reserves R, Boats B" + 26. "Where R.bid = B.Bid and B.color = red "; Έστω ο πίνακας Sailor βρίσκεται στο url1 και οι πίνακες reserves και boats βρίσκονται στο url2. Δρ. Κεραμόπουλος Ευκλείδης 11
27. rs2 = statement2.executequery(selectstring2); 28. while(rs2.next()) { 29. int reserves_sid = rs2.getint( sid"); 30. rs1 = statement1.executequery(selectstring1); 31. while(rs1.next()) { 32. int sailors_sid = rs1.getint( sid"); 33. if (sailors_sid == reserves_sid) { 34. String sailors_sname = rs1.getstring( sname"); 35. System.out.println("sailors name: " + sailors_sname); 36. } 37. } 38. } 39. statement1.close(); 40. dbconnection1.close(); 41. statement2.close(); 42. dbconnection2.close(); 43. } 44. } Δρ. Κεραμόπουλος Ευκλείδης 12
Κάθε αντικείμενο SQLException περιέχει τα παρακάτω είδη πληροφορίας: Μία περιγραφή του σφάλματος. Eνα αντικείμενο String και χρησιμοποιείται ως Java Exception message. Mε τη μέθοδο getmessage μπορούμε να το διαβάσουμε SQLState SQLException.getSQLState SQLError geterrorcode getnextexception Δρ. Κεραμόπουλος Ευκλείδης 13
try { } catch(sqlexception ex) { ex.getmessage ex.getsqlstate ex.geterrorcode ()); ex = ex.getnextexception(); Δρ. Κεραμόπουλος Ευκλείδης 14
1. import java.sql.*; 2. public class Jdbc_dblab2_create { 3. static String driverclassname = "com.ibm.db2.jcc.db2driver" ; 4. static String url = "jdbc:db2://192.168.16.99:50000/db2lab" ; 5. static String username = "db397"; 6. static String passwd = "85J93"; 7. static Connection dbconnection = null; 8. static Statement statement = null; 9. 10. public static void main (String[] argv) throws Exception { 11. Class.forName (driverclassname); 12. dbconnection = DriverManager.getConnection (url, username, passwd); 13. statement = dbconnection.createstatement(); 14. try { 15. statement.executeupdate("drop TABLE PARTICIPATES"); 16. statement.executeupdate("drop TABLE HELPS"); 17. statement.executeupdate("drop TABLE GAMES"); 18. statement.executeupdate("drop TABLE ATHLETE"); 19. statement.executeupdate("drop TABLE SPORT"); 20. statement.executeupdate("drop TABLE TRAINER"); 21. statement.executeupdate("drop TABLE JUDGE"); 22. statement.executeupdate("drop TABLE STADIUM"); 23. statement.executeupdate("drop TABLE VOLUNTEER"); Δρ. Κεραμόπουλος Ευκλείδης 15
24. } catch(sqlexception ex) { 25. System.out.println("\n -- SQL Exception --- \n"); 26. while(ex!= null) { 27. System.out.println("Message: " + ex.getmessage()); 28. System.out.println("SQLState: " + ex.getsqlstate()); 29. System.out.println("ErrorCode: " + ex.geterrorcode()); 30. ex = ex.getnextexception(); 31. System.out.println(""); 32. } } 33. statement.close(); dbconnection.close(); 34. } } run: -- SQL Exception --- Message: DB2 SQL error: SQLCODE: -204, SQLSTATE: 42704, SQLERRMC: DB397.PARTICIPATES SQLState: 42704 ErrorCode: -204 BUILD SUCCESSFUL (total time: 4 seconds) Δρ. Κεραμόπουλος Ευκλείδης 16
2o παράδειγμα Δρ. Κεραμόπουλος Ευκλείδης 17
1. import java.sql.*; 2. public class CreateCoffees { 3. static String driverclassname = "com.ibm.db2.jcc.db2driver" ; 4. static String url = "jdbc:db2://192.168.16.99:50000/db2lab"; 5. static Connection con; 6. static String createstring; 7. static Statement stmt; 8. public static void main (String[] argv) throws Exception { 9. try { 10. Class.forName(driverClassName); 11. con = DriverManager.getConnection(url, "mylogin", "mypassword"); 12. stmt = con.createstatement(); 13. createstring = "create table COFFEES (COF_NAME VARCHAR(32), SUP_ID INTEGER, " + 14. "PRICE FLOAT, SALES INTEGER, TOTAL INTEGER)"; 15. stmt.executeupdate(createstring); stmt.close(); con.close(); 16. } catch(sqlexception ex) { 17. System.err.print("ClassNotFoundException: "); 18. System.err.println(ex.getMessage()); 19. System.out.println("Message: " + ex.getmessage()); 20. System.out.println("SQLState: " + ex.getsqlstate()); 21. System.out.println("ErrorCode: " + ex.geterrorcode()); 22. } 23. } 24. } run: ClassNotFoundException: Connection authorization failure occurred. Reason: User ID or password invalid. Message: Connection authorization failure occurred. Reason: User ID or password invalid. SQLState: null ErrorCode: -99999 BUILD SUCCESSFUL (total time: 2 seconds) Δρ. Κεραμόπουλος Ευκλείδης 18
SQLWarning δίνει πληροφορίες σχετικά με προειδοποιήσεις της βάσης. Κάθε SQLWarning αντικείμενο περιέχει τα παρακάτω: Μία περιγραφή SQLState SQLerror next SQLWarning Δρ. Κεραμόπουλος Ευκλείδης 19
1. Statement stmt = con.createstatement(); 2. ResultSet rs = stmt.executequery("select COF_NAME from COFFEES"); 3. SQLWarning warning = stmt.getwarnings(); 4. if (warning!= null) { 5. System.out.println("\n---Warning---\n"); 6. while (warning!= null) { 7. System.out.println("Message: " + warning.getmessage()); 8. System.out.println("SQLState: " + warning.getsqlstate()); 9. System.out.print("Vendor error code: "); 10. System.out.println(warning.getErrorCode()); 11. System.out.println(""); 12. warning = warning.getnextwarning(); 13. } 14. } 15. while (rs.next()) { 16. String coffeename = rs.getstring("cof_name"); 17. System.out.println("Coffees available at the Coffee Break: "); 18. System.out.println(" " + coffeename); 19. SQLWarning warn = rs.getwarnings(); 20. if (warn!= null) { 21. System.out.println("\n---Warning---\n"); 22. while (warn!= null) { 23. System.out.println("Message: " + warn.getmessage()); 24. System.out.println("SQLState: " + warn.getsqlstate()); 25. System.out.print("Vendor error code: "); 26. System.out.println(warn.getErrorCode()); 27. System.out.println(""); 28. warn = warn.getnextwarning(); 29. } 30. } Δρ. Κεραμόπουλος Ευκλείδης 20
Με χρήση του scroll ο δρομέας του resultset μπορεί να κινηθεί ευέλικτα προς οποιαδήποτε κατεύθυνση και με βήμα που ορίζεται από τον προγραμματιστή ή τον χρήστη. Πρώτα πρέπει να δημιουργηθεί ένα αντικείμενο ResultSet που υποστηρίζει την ιδιότητα scroll. Statement stmt = con.createstatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet srs = stmt.executequery("select SNAME " + "FROM SAILORS"); Δρ. Κεραμόπουλος Ευκλείδης 21
TYPE_FORWARD_ONLY Μόνο μπροστά TYPE_SCROLL_INSENSITIVE όσο ο δρομέας είναι ανοιχτός δεν γίνονται οι αλλαγές στη βάση TYPE_SCROLL_SENSITIVE όσο ο δρομέας είναι ανοιχτός γίνονται οι αλλαγές στη βάση CONCUR_READ_ONLY Μόνο για ανάγνωση CONCUR_UPDATABLE Ανανεώσιμη default TYPE_FORWARD_ONLY, CONCUR_READ_ONLY Δρ. Κεραμόπουλος Ευκλείδης 22
next Previous first Last afterlast beforefirst (προσοχή δεν δουλεύει στην IBM DB2) absolute no relative no getrow Δίνει τη θέση του δρομέα Παράδειγμα srs.absolute(4); int rownum = srs.getrow(); // θέση 4 srs.relative(-3); rownum = srs.getrow(); // θέση 1 srs.relative(2); rownum = srs.getrow(); // θέση 3 Δρ. Κεραμόπουλος Ευκλείδης 23
isfirst, islast, isbeforefirst isafterlast if (!srs.isafterlast()) { String name = srs.getstring("cof_name"); float price = srs.getfloat("price"); System.out.println(name + " " + price); } Δρ. Κεραμόπουλος Ευκλείδης 24
Statement stmt = con.createstatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet srs = stmt.executequery( "SELECT COF_NAME, PRICE FROM COFFEES"); srs.afterlast(); float price while (srs.previous()) { } String name = srs.getstring("cof_name"); price = srs.getfloat("price"); System.out.println(name + " " + price); Δρ. Κεραμόπουλος Ευκλείδης 25
1. package newpackage; 2. import java.sql.*; 3. public class Jdbc_mini_select_scroll_various_postgres1 { 4. static String driverclassname = "org.postgresql.driver" ; 5. static String url = "jdbc:postgresql://localhost:5432/postgres" ; 6. static Connection dbconnection = null; 7. static Statement statement = null; 8. static ResultSet rs = null; 9. public static void main (String[] argv) throws Exception 10. { 11. Class.forName (driverclassname); 12. dbconnection = DriverManager.getConnection (url, "postgres", "postgres"); 13. statement = dbconnection.createstatement(resultset.type_scroll_sensitive, ResultSet.CONCUR_UPDATABLE); Δρ. Κεραμόπουλος Ευκλείδης 26
14. String selectstring = "SELECT sid, sname, rating, age " + 15. "From Sailors " + 16. "Order by sid"; 17. rs = statement.executequery(selectstring); 18. rs.first(); 19. System.out.println("sid sname rating age " ); 20. rs.absolute(6); 21. int id = rs.getint("sid"); 22. String name = rs.getstring("sname"); 23. int vrating = rs.getint("rating"); 24. float vage = rs.getfloat("age"); 25. System.out.println("absolute 6"); 26. System.out.println( id + " " + name + " " + vrating + " " + vage ); 27. rs.relative(-3); 28. id = rs.getint("sid"); 29. name = rs.getstring("sname"); 30. vrating = rs.getint("rating"); 31. vage = rs.getfloat("age"); 32. System.out.println("relative -3"); 33. System.out.println( id + " " + name + " " + vrating + " " + vage ); Δρ. Κεραμόπουλος Ευκλείδης 27
34. rs.relative(2); 35. id = rs.getint("sid"); 36. name = rs.getstring("sname"); 37. vrating = rs.getint("rating"); 38. vage = rs.getfloat("age"); 39. System.out.println("relative 2"); 40. System.out.println( id + " " + name + " " + vrating + " " + vage ); 41. rs.beforefirst(); 42. System.out.println("before first"); 43. rs.beforefirst(); 44. while(rs.next()) { 45. id = rs.getint("sid"); 46. name = rs.getstring("sname"); 47. vrating = rs.getint("rating"); 48. vage = rs.getfloat("age"); 49. System.out.println( id + " " + name + " " + vrating + " " + vage ); 50. } 51. statement.close(); 52. dbconnection.close(); 53. } 54. } Δρ. Κεραμόπουλος Ευκλείδης 28
run: sid sname rating age absolute 6 64 Horatio 7 35.0 relative -3 31 Lubber 8 55.5 relative 2 58 Rusty 10 35.0 before first 22 Dustin 7 45.0 29 Brutus 1 33.0 31 Lubber 8 55.5 32 Andy 8 25.5 58 Rusty 10 35.0 64 Horatio 7 35.0 71 Zorba 10 16.0 74 Horatio 9 40.0 85 Art 3 25.5 95 Bob 3 63.5 BUILD SUCCESSFUL (total time: 0 seconds) Δρ. Κεραμόπουλος Ευκλείδης 29
ΕΠΟΜΕΝΗ ΕΝΟΤΗΤΑ