Presentation is loading. Please wait.

Presentation is loading. Please wait.

JDBC Java Data Base Connectivity נערך ע"י: אורי רוטנברג הנחיה: ד"ר תמר בניה קורס: סדנא ב-Java.

Similar presentations


Presentation on theme: "JDBC Java Data Base Connectivity נערך ע"י: אורי רוטנברג הנחיה: ד"ר תמר בניה קורס: סדנא ב-Java."— Presentation transcript:

1 JDBC Java Data Base Connectivity נערך ע"י: אורי רוטנברג הנחיה: ד"ר תמר בניה קורס: סדנא ב-Java

2 נושאים JDBC ? מסדי נתונים SQL אופן עבודה עם מסד נתונים Dirvers JDBC צלילה לעומק סיכום

3 JDBC ? הדרך בא תכנית java מתקשרת עם מסדי נתונים. אוסף מחלקות וממשקים – package java.sql.*;. ממשק שקוף בין תכנית java למסד הנתונים.

4 מסדי נתונים ייצוג לוגי של נתונים. התפתחות מסדי נתונים - קצת הסטוריה... קבצים xBase DBMS פשוטים – Microsoft Access SQL Server, Oracle, Sybase, DB2, Informix, MySQL

5 DBMS Data Base Management System מסדי נתונים יחסיים – Relational DataBase דרך לוגית לייצוג נתונים. מספק אמצעים לטיפול, ארגון ואחסון הנתונים. מבנה מסד נתונים: טבלאות - Tables מפתחות- Keys קשרים - Relations

6 טבלאות - Tables שדה - Field פריט מידע בודד: ת.ז., שם, ת. לידה... מייוצג ע"י עמודה בטבלה. רשומה - Record ישות. אוסף שדות – רלוונטיים לישות במערכת המידע מיוצג ע"י שורה בטבלה.

7 מפתחות - Keys מפתח ראשי – Primary Key שדה או קבוצת שדות המזהים רשומה באופן חד ערכי. מפתח זר – Foreign Key שדה בטבלה המקושר לשדה בטבלה אחרת בה משמש השדה כמפתח ראשי.

8 קשרים - Relations מטרת הקשרים לדאוג לשלמות הנתונים – Data Integrity. סוגי קשרים יחיד ליחיד – One to One1:1 יחיד לרבים – One to ManyN:1 רבים לרבים – Many to Many M:N

9 SQL Structured Query Language שפת שאילתות אחידה לביצוע מניפולציות על הנתונים פקודות עיקריות: Select- שליפת נתונים מטבלה/טבלאות. Insert- הוספת רשומה לטבלה. Update - שינוי נתונים בטבלה. Delete - מחיקת נתונים מטבלה.

10 SELECT Select * From table_name – All fields & records Select field1, field2 [,field3…] From table_name Select T1.field1, T1.field2, T2.field3 [,…..] From table1 as T1, table2 as T2 Where T1.field1 = T2.field2

11 SELECT - המשך Select * From table_name Where criteria Select * From table_name Order By field1, field2 [,field3…] ACS/DESC Select * From table_name Group By field1, field2 [,field3…]

12 INSERT Insert Into table_name (field1, field2 [,field3…]) values (value1, value2 [,value3…])  ניתן לביצוע גם ע"י אובייקט מטיפוס ResultSet

13 UPDATE Update table_name set field1 = value1 [,field2 = value2…] [where criteria]  ניתן לביצוע גם ע"י אובייקט מטיפוס ResultSet

14 DELETE Delete From table_name [where criteria]  ניתן לביצוע גם ע"י אובייקט מטיפוס ResultSet

15 סדר פעולות במסד נתונים פתיחת מסד הנתונים – Connection Connection String Provider – מנוע מסד הנתונים שם הקובץ ומיקומו שם משתמש סיסמא ביצוע פעולות על מסד הנתונים Command/Statement סגירת מסד הנתונים סגירת ה-Command/Statement סגירת ה-Connection

16 עבודה מול מסד נתונים באמצעות JDBC JDBC – Java Data Base Connectivity הדרך בא תכנית java מתקשרת עם מסדי נתונים. אוסף ממשקים – package java.sql.*;. ממשק שקוף בין תכנית java למסד הנתונים. Driver - תוכנת גישה למסד נתונים מקשר בין תכנית Java למסד הנתונים. מאפשר כתיבת קוד אחיד לטיפול בכל מסדי הנתונים. קיימים Dirvers לרוב מסדי הנתונים.

17 JDBC - Drivers JDBC-to-ODBC - Type 1 (bridge) גישה למסדי נתונים באמצעות ממשק ODBC של חברת Microsoft. מאפשר גישה למסדי נתונים שעדיין אין עבורם Drivers מטיפוס 3 ו-4. Native-API – Type 2 Driver הכתוב בד"כ ב-C/C++. מתרגם פקודות Java-API לפקודות מסדי הנתונים.

18 JDBC – Driver - המשך JDBC-Net – Type 3 מאפשר העברת פקודות JDBC ברשת. מתרגם פקודות JDBC לפרוטוקל תקשורת. השרת מתרגם את הפקודות לפקודות מסד הנתונים הספציפי. Native-Protocol – Type 4 כתוב ב-Java טהור. מאפשר גישה ישירה למסד הנתונים.

19 JDBC – Driver - המשך לכל טיפוס מסד נתונים קיים Driver שלו המסופק ע"י יצרן מסד הנתונים Java Application Driver Manager SQL Server Oracle JDBC-ODBC ODBC Access SQL Server Oracle Drivers

20 JDBC – צלילה לעומק סקירה כללית Connection Statement ResultSet דוגמת קוד Prepared Statements Transactions Stored Procedures Batch Processing Multiple ResultSets/Update Counts Updatable ResultSets JDBC 2.0

21 יצירת Connection טעינת Driver Class.forName(“driverName”) throws ClassNotFoundException (checked) יצירת Connection Connection con = DrivareManager.getConnection(connectionString)  connectionString = “url”, “userID”, “password” throws SQLException (checked)

22 הפקת שאילתא יצירת Statement Statement statement = conn.createStatment() הפקת השאילתא ResutSet resultSet = statement.executeQuery(“SQL_Statement”) כל הפעולות מול מסד הנתונים "זורקות" SQLException

23 ביצוע פעולות וסגירה עיבוד הנתונים while (resultSet.next()) resultSet.getXXX(fieldNumber/”fieldName”);  fieldNumber = 1…N סגירת מסד הנתונים resultSet.Close() con.Close() כל הפעולות מול מסד הנתונים "זורקות" SQLException

24 Connections SQLServer Driver : “com.jnetdirect.jsql.JSQLDriver” URL : "jdbc:JSQLConnect://localhost:1433;databaseName=myDB” MySQL Driver : "org.gjt.mm.mysql.Driver" URL : "jdbc:mysql://localhost/myDB” Access Driver : "sun.jdbc.odbc.JdbcOdbcDriver" URL : “ jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\\myDB.mdb;DriverID=22”

25 דוגמת קוד try { // load Driver Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // set this to a MS Access DB you have on your machine String filename = "c:\\java\\mmTable.mdb"; String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="; database+= filename + ";DriverID=22"; // add on to the end // now we can get the connection from the DriverManager Connection connection = DriverManager.getConnection( database,"",""); Interface Connection מטודה סטטית getConnection של המחלקה DriverManager.

26 דוגמת קוד - המשך Statement statement = connection.createStatement(); statement.executeQuery("Select * From Madad"); ResultSet rs = statement.getResultSet(); Interface Statement האובייקט נוצר ע"י המטודה createStatement של ה-Interface Connection. על האובייקט שנוצר מפעילים את המטודה executeQuery המקבלת משפט SQL. Interface ResultSet האובייקט נוצר ע"י המטודה getResulSet של האובייקט מטיפוס Statement. מכיל את תוצאת השאילתא.

27 דוגמת קוד - המשך if (rs != null) while (rs.next()){ date = rs.getDate(1); rate = rs.getFloat("Rate"); System.out.println(date + " - " + rate); } האובייקט ResultSet מטודה next() מאחזרת את הרשומה הבאה (מחזירה boolean) מטודה getDate(1) מאחזרת תאריך משדה ראשון (מהיר יותר) מטודה getFloat(“Rate”) מאחזרת מס' ממשי משדה Rate (קריא יותר)

28 דוגמת קוד - המשך ResultSetMetaData metaData = rs.getMetaData(); for(int I = 1 ; I <= metaData.getColumnCount(); i++){ System.out.println( "Column Name:"+metaData.getColumnName(i)+"-"+ "Type Name:"+metaData. getColumnTypeName(i) +"-"+ "Type Num:"+metaData.getColumnType(i)); } Interface ResultSetMetaData מספק מידע על מבנה השאילתא. האובייקט נוצר ע"י המטודה getMetaData של האובייקט resultSet.

29 קבועי - ResultSet קובעים - התנהגות ה-ResultSet אפשרות תנועה על גבי ה-ResultSet. אפשרות עדכון ה-DataBase. TYPE_FORWARD_ONLY מאפשר תנועה ב-ResultSet קדימה בלבד. מרשומה ראשונה עד לאחרונה.

30 קבועי – ResultSet - המשך TYPE_SCROLL_INSENSITIVE מאפשר תנועה דו כיוונית ב-ResultSet. שינויים אפשריים אך אינם באים לידי ביטוי אלא לאחר ריענון. TYPE_SCROLL_SENSITIVE מאפשר תנועה דו כיוונית ב-ResultSet. שינויים אפשריים ובאים לידי ביטוי מייד עם השינוי.

31 קבועי – ResultSet - המשך CONCUR_READ_ONLY שינויים ב-ResultSet לא יבואו לידי ביטוי ב-DataBase. CONCUR_UPDATEABLE שינויים ב-ResultSet יבואו לידי ביטוי ב-DataBase באמצאות המטודה update() של ה-ResultSet. דוגמת שימוש: Statement = connection.createStatement( ResutSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY (

32 ביצוע שינויים ב-DataBase המטודה executeUpdate מופעלת באמצעות אובייקט מטיפוס Statement. מאפשרת ביצוע כל סוגי השינויים ב-DataBase: insert update delete מחזירה int המציין את מספר הרשומות שהושפעו מהפעולה. דוגמא statement = connection.createStatement(); statement.executeUpdate("Insert into MADAD (T_DATE, RATE) values (02/01/2007, 1200)");

33 PreparedStatement Interface PreparedStatement מאפשר ליצור שאילתות עם פרמרטים. השאילתא נשמרת בצורה מקומפלת. מאפשר טיפול נוח בפרמטרים מחרוזתיים. נוצרת באמצעות המטודה prepareStatement(“SQL”) של האובייקט connection. מכיל מטודות setXXX(paramNo, value) לכל טיפוס משתנה.

34 PreparedStatement - המשך במקום Select * from Names where “FirstName=‘Amnon ’” Select * from Names where “FirstName=‘Tamar’” יבוא Select * from Names where “FirstName = ? ” setString(1, “Amnon”) setString(1, “Tamar”)

35 PreparedStatement - המשך PreparedStatement prepared = connection.prepareStatement("Select * From Madad Where Rate = ? "); prepared.setDouble(1, 43.0); rs = prepared.executeQuery(); if(rs != null) while(rs.next()) System.out.println(rs.getDate(1) + " - " + rs.getDouble(2)); prepared.setDouble(1, 40.0); rs = prepared.executeQuery(); if(rs != null) while(rs.next()) System.out.println(rs.getDate(1) + " - " + rs.getDouble(2));

36 Transactions מהו Transaction דומה במהותה ל-synchronized בתהליכים. מאפשרת להגדיר מספר פעולות DB כפעולה אטומית. דוגמא - העברת כספים בין בנקאית התחלת Transaction. משיכת כספים מחשבון A. הפקדת כספים בחשבון B. הצלחה ? כן – רישום הפעולה כסופית ועדכון ה-DB- commit לא – מניעת רישום העדכונים ב-DB- rollback

37 Transacion - המשך מימוש ב-JDBC המימוש מתבצע באמצעות מטודות של הממשק Connection. מצב default של ה-connection – autoCommit. בחינת מצב ה-autoCommit – conn.getAutoCommit() סדר הפעולות קביעת autoCommit ל-false - conn.setAutoCommit(false) ביצוע סידרת פקודות SQL. בחינת ההצלחה לאחר הפעולה האחרונה הצלחה – conn.commit() כישלון – conn.rollBack()

38 Transaction – דוגמת קוד try { // Disable auto commit connection.setAutoCommit(false); // Do SQL() // Commit updates connection.commit(); } catch(SQLException e){ // Rollback update connection.rollback(); }

39 Stored Procedures פונקציות שמורות ב- DB ומופעלות באמצעותו מאפשרות: שליחת פרמטרים לפונקציה. קבלת פרמטרים מהפונקציה. שימוש ב-JDBC באמצעות הממשק CallAbleStatement. יורש מ-PreparedStatement. מאפשר ביצוע פעולות דומות ל- Prepared Statement ישירות ב- DB. מאפשר שקיפות מול DB שונים.

40 Stored Procedure – דוגמת קוד יצירת Stored Procedure String createProcedure = "create procedure SHOW_SUPPLIERS " + "as " + "select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME " + "from SUPPLIERS, COFFEES " + "where SUPPLIERS.SUP_ID = COFFEES.SUP_ID; הכנסת ה-Stored Procedure ל-DB Statement stmt = con.createStatement(); stmt.executeUpdate(createProcedure); הפעלת ה- Stored Procedure CallableStatement cs = con.prepareCall("{call SHOW_SUPPLIERS}"); ResultSet rs = cs.executeQuery();

41 Stored Procedure – דוגמת קוד import java.sql.*; public class UpdateCar { public static void UpdateCarNum(int carNo, int empNo) throws SQLException { Connection con = null; PreparedStatement pstmt = null; try { con = DriverManager.getConnection("jdbc:default:connection"); pstmt = con.prepareStatement( " UPDATE EMPLOYEES SET CAR_NUMBER = ? " + "WHERE EMPLOYEE_NUMBER = ?"); pstmt.setInt(1, carNo); pstmt.setInt(2, empNo); pstmt.executeUpdate(); } finally {I f (pstmt != null) pstmt.close(); } }

42 Batch Processing מאפשר לצבור מספר פקודות עדכון לביצוע מאוחד. מתאים לפקודות insert, delete ו-update בלבד. מתאים לכל סוגי Statements Statement PreparedStatement CallableStatement כישלון "זורק" BatchUpdateException יורש מ-SQLException

43 Batch Processing - המשך מטודות הוספת פקודות SQL. addBatch(“SQL”) – מתאים ל-Statement בלבד. addBatch() – מתאים ל:  PreparedStatement  CallableStatement clearBatch() – מנקה את אוסף פקודות ה-SQL.

44 Batch Processing - המשך executeBatch() – מבצע את אוסף פקודות העדכון. המטודה מחזירה מערך int לבדיקת הצלחת הפעולה. אורך המערך – כמספר פקודות העדכון שהיו ב-Batch. ערכים אפשריים: הצלחה  >=0 – הצלחה – המספר מבטא את מספר הרשומות שטופלו.  -2 - הצלחה - לא ניתן לדעת את מספר הרשומות שטופלו.

45 Batch Processing - המשך 3- כישלון  ניתן לבדיקה ע"י המטודה getUpdateCounst() של BatchUpdateException.  אם ה-DB מאפשר להמשיך לאחר כישלון יוחזר -3 עבור כל פעולה שלא הצליחה.  אם ה-DB איננו מאפשר להמשיך לאחר כישלון יוחזרו ערכי ההצלחה בלבד.

46 Batch Processing – דוגמת קוד עבור Statement Statement stmt = con.getStatement( ); stmt.addBatch( “SQL_Statement” );.. stmt.executeBatch( ) ;

47 Batch Processing – דוגמת קוד עבור PreparedStatement PreparedStatement ps= db.prepareStatement("INSERT INTO test VALUES (?);"); for(int i=0;i<37;i++) { ps.setInt(1,i); ps.addBatch(); } ps.executeBatch();

48 Multiple ResultSets or Update Counts במקרים מסויימים ה- Statements, PreparedStatements וה- CollableStatement מחזירות מספר ResultSet או מספר פקודות עדכון (update counts). במיקרה זה תופעל המטודה execute() במקום executeQuery() או executeUpdate(). המטודה מחזירה: true – אם הוחזר ResultSet. false – אם הוחזר update count.

49 Multiple ResultSets or Update Counts מטודות נוספות getResultSet() המחזירה ResultSet. null- אם איננו ResultSet או אין תוצאות נוספות ל-execute. getUpadteCount() המחזירה >=0 – אם הפעולה הצליחה (מבטא מספר רשומות שטפלו). -1 -- אם בפעולה לא הצליחה או אין תוצאות נוספות ל-execute. getMoreResults() השולפת את התוצאה הנוספת ומחזירה true – אם הוחזר ResultSet. false – אם הוחזר update count.

50 Updatable ResultSets עדכון ה-DB באמצעות ה-ResultSet. ה-DB צריך לאפשר זאת. יש ליצור Statement עם אפשרות לתנועה דו-כיוונית ועדכון. פעולות אפשריות: הוספה שינוי ביטול

51 Updatable ResultSets - המשך סדר פעולות יצירת Statement המאפשר תנועה דו-כיוונית ועדכון. Prepared Statement, Callable. יצירת ResultSet – executeQuery(“SQL”). פעולות על ה-ResultSet: הוספה שינוי ביטול עדכון ה-DB. ניתן לבצע פעולות נוספות.

52 Updatable ResultSets - המשך הוספת רשומה התמקמות על “insert row” - moveToInsertRow() עדכון השדות - updateXXX(col_no, value) הוספת הרשומה ל-DB – insertRow() Statement stmt = connection.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet resultSet = stmt.executeQuery("SELECT * FROM my_table"); resultSet.moveToInsertRow(); resultSet.updateString("col_string", "new data"); resultSet.insertRow(); resultSet.moveToCurrentRow(); // תקף רק בהוספת רשומה

53 Updatable ResultSets - המשך עדכון רשומה התמקמות על רשומה – move(), moveAbsolute()…. עדכון השדות - updateXXX(col_no, value) עדכון הרשומה ב-DB – updateRow() Statement stmt = connection.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE ); ResultSet resultSet = stmt.executeQuery("SELECT * FROM my_table"); resultSet. moveAbsolute(5) ; resultSet. updateStri ng ("col_string", "new data"); resultSet. updateRow() ;

54 Updatable ResultSets - המשך ביטול רשומה התמקמות על רשומה – first(), last(), next(), previous()…. ביטול הרשומה ב-DB – delateRow() Statement stmt = connection.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE ); ResultSet resultSet = stmt.executeQuery("SELECT * FROM my_table"); resultSet. first() ; resultSet. deleteRow() ;

55 JDBC 2.0 דור חדש של טיפול במסדי נתונים. נכלל בגירסת Java 2E. package javax.sql. יצרני Data Base שונים פיתחו ממשקי גישה ל- JDBC 2.0. מימוש ב-JavaBeans. תמיכה באירועים. מתאים לעבודה ברשת האינטרנט. מאפשר עבודה במצב disconnectes.

56 JDBC 2.0 - המשך DataSource גישה חדשה ליצירת Connection. מממש Java Naming and Directory Interface (JNDI) לאיתור דינאמי של משאבי המידע והקישור למסד הנתונים. Connection Pooling מאפשר איגוד Connections למסדי נתונים. מימוש שיתופי ברשת הטינטרנט. מאפשר יצירת Statement, PreparedStatement ו-CallableStatement לביצוע שאילתות SQL.

57 JDBC 2.0 - המשך RowSet מקביל ונורש מ-ResultSet ב-JDBC. ממומש כ-JavaBean ותומך באירועי תנועה ועדכון ה-RowSet. מאפשר את כל פעולות ה-ResultSet ללא קשר לתמיכה של ה-DB - עבודה במצב disconnected. מאפשר קישור ל-DB ועדכונו גם אם ה-driver לא תומך בזאת. מממש ממשק Serializable המאפשר עבודה מקומית והעברת ה-RowSet ברשת תקשורת. מאפשר עבודה עם Web Services ומסמכי XML.

58 JDBC 2.0 - המשך

59 סיכום JDBC – מאפשר לאפליקציות Java לטפל ב-DB שקיפות מלאה מול הממשק של ה-DB אפשרות עבודה ב-SQL או באמצעות ResultSet PreparedStatement – שאילתות מקומפלות Multiple ResultSets עיבוד אצווה – Batch JDBC 2.0 ממשק מתקדם לאפלקציות Web, XML

60 מקורות ספר הלימוד Advanced Java 2 Platform HOW TO PROGRAM Deitel & Deitel Santry Prentince Hall Chapter 8 אתר Java Sun http://java.sun.com/docs/books/tutorial/reallybigindex.html#jdbc

61 מקורות - המשך בוחן מהאתר של Java Sun http://java.sun.com/developer/Quizzes/JDBC דוגמאות http://www.datadirect.com/developer/code_library/index.ssp http://www.troobloo.com/tech/jdbc.shtml JDBC 2.0 http://www.oracle.com/technology/sample_code/tech/java/sqlj_jdbc/f iles/jdbc20/jdbc20.html http://www.oracle.com/technology/sample_code/tech/java/sqlj_jdbc/f iles/jdbc20/jdbc20.html http://www.oracle.com/technology/sample_code/tech/java/sqlj_jdbc/f iles/jdbc20/jdbc20.html http://www.oracle.com/technology/sample_code/tech/java/sqlj_jdbc/f iles/jdbc20/jdbc20.html

62 תודות תודה לכל הקהל. מקווה שמצגת זו תהיה לכם לעזר. המשך סמסטר פורה. אורי רוטנברג


Download ppt "JDBC Java Data Base Connectivity נערך ע"י: אורי רוטנברג הנחיה: ד"ר תמר בניה קורס: סדנא ב-Java."

Similar presentations


Ads by Google