וובמאסטר - תיכנות ובניית אתרים

תקשורת עם מאגרי נתונים בעזרת JDBC

הדר פורת/‏ 11 ספטמבר, 2004
F+
F-

הקדמה

כאשר מתחברים לשרת מאגר נתונים בשפת Java, התהליך מחולק לארבעה שלבים בסיסיים:

  1. טעינה של דרייבר ה- JDBC
  2. פתיחת החיבור (Connection)
  3. יצירת משפט (Statement)
  4. קבלת התוצאות (ResultSet)

טעינה של דרייבר ה- JDBC

כל שרת מאגר נתונים עובד קצת אחרת. כלומר לא ניתן לצפות כי MySQL יעבוד עם אותו דרייבר של Oracle. ממש כמו בכרטיסי מסך, הדרייברים הם אחראים לדבר עם השרתים ולתרגם את הפקודות ל- Java ובחזרה. לכן, תצטרך להשיג את הדרייבר המתאאים לשרת שלך.

אם עדיין לא התקנת שרת מאגר נתונים ואת ה- JDBC Driver שלו, עבור למאמר על התקנת סביבת עבודה.

טעינת דרייבר JDBC של שרת MySQL מבצעים בעזרת השורה הבאה:

1
2
3  
Class.forName("com.mysql.jdbc.Driver");


אם אתה משתמש בשרת אחר, יש להיעזר בתיעוד של הדרייבר הנמצא בד"כ באתר השרת.

פתיחת החיבור (Connection)

לאחר הטעינה של הדרייבר, ניתן ליצור חיבור למאגר עצמו. החיבור הוא אובייקט של Java, הנמצא ב- java.sql.Connection.
את האובייקט יוצרים בשימוש במנהל הדרייברים (DriverManager).

1
2
3  
Connection connection = DriverManager.getConnection
("jdbc:mysql://localhost:3306/test", "root", "");


כאן בדוגמא אנחנו מתחברים לשרת מקומי העובד בפורט רגיל (localhost:3306).
שם המאגר נתונים הוא test, ושם והסיסמא הוא ברירת המחדל של MySQL: משתמש root ללא סיסמא

יצירת משפט (Statement)

בשלב זה ניתן כבר להשתמש במאגר נתונים. כל מה שצריך לעשות זה ליצור משפטי SQL הנקראים Statement ולשלוח דרכם את השאילתות (Query).
המשפט מאפשר לך להשתמש במספר פונקציות, הכוללות:

stat.executeUpdate() - משמשת להכנסת נתונים או עדכון (UPDATE, INSERT, CREATE). מחזירה את מספר השורה שבה נעשה העדכון.
stat.executeQuery() - הפונקציה העיקרית, שבה מוחזר ResultSet משאילתת SELECT.

1
2
3  
Statement statement = connection.createStatement();


קבלת התוצאות (ResultSet)

ה- ResultSet כולל את התוצאות משאילתת ה- SELECT שבוצעה. התוצאות מסודרות במין סוג של טבלה, הדומה לטבלת מאגר הנתונים.
העברה משורה לשורה נעשית ע"י פונקציית next(), וכדי להוציא מידע מהשורה, יש לקרוא לפונקציות הקבלה getXXX.
פונקציות הקבלה כוללות את getString(), getInt(), getBytes() ועוד. לכל סוג משתנה בסיסי יש פונקציה כזאת.
פונקציית הקבלה חייבת לקבל את האינדקס של העמודה, או את שמו, כלומר אם הוצאת נתונים בטור של name, תוכל לקבל את הערך בטור ע"י resultset.getString("name").

הקטע הבא כולל קבלת ResultSet ולולאת while אשר מאפשרת הדפסה של כל שורות התוצאות:

1
2
3
4
5
6
7
8  
String sql = "SELECT firstName, lastName FROM members";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
out.println(resultSet.getString(1) + ":" +
resultSet.getString("lastName") );
}


השתמשנו כאן בשתי השיטות להוצאת מחרוזת (String), גם באמצעות המיקום המספרי (1) וגם באמצעות שם הטור (lastName).

הכל ביחד

יש בקטע המלא מספר ביטויים חדשים המוגשים אשר יוסברו לאשר קטע הקוד.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23  
<%@ page contentType="text/html; charset=windows-1255" import="java.sql.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Untitled</title>
</head>
<body>
<%
try {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection
("jdbc:mysql://localhost:3306/test", "root", "");
Statement statement = connection.createStatement();
String sql = "SELECT firstName, lastName FROM members";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
out.println(resultSet.getString(1) + ":" +
resultSet.getString("lastName") );
}
}
catch (SQLException e) {
out.println("SQL FAILED:" + e.getMessage());
}
%>


שורה 1: משום שאנחנו בעמוד jsp, ישנו צורך לייבא (import) את הפונקציות המאפשרות לנו להשתמש במאגרי הנתונים.
לכן, אנחנו מייבאים לתוך העמוד את java.sql.* הכולל את כל הפונקציות לטפל במאגרי נתונים.

שורה 9: זהו ביטוי הכולל לטיפול השגיאות של Java. אנחנו בעצם אומרים כאן שיכול להיווצר מצב שבו קטע הקוד לא יבוצע בהצלחה.
אם הקטע שאחרי ביטוי try יגרום לשגיאה, אז הקוד ייבצע את הכתוב בשורות 20-22.

שורות 20-22:: כל שגיאה (SQLException) שתיגרם בקטע try "תיתפס" כאן ואנחנו נבצע הדפסה של הודעת השגיאה לדפדפן.

שימוש בעברית

אם מבצעים את התקשורת דרך עמוד jsp או servlet, יש להגדיר למאגר הנתונים את השפה שבה נשתמש בה.
כלומר, בפתיחת החיבור לאחר שם מאגר הנתונים יש להוסיף את הביטוי הבא: ?useUnicode=true&characterEncoding=ISO8859_8

1
2
3  
Connection connection = DriverManager.getConnection
("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=ISO8859_8"", "root", "");


כמו-כן, הוצאת המידע ע"י פונקצייה getString לא תעבוד, אלא באמצעות getBytes() והפיכת ה- bytes אל מחרוזת חדשה.
תופעה זאת נגרמת מכיוון ששפת java עובדת כברירת מחדל על unicode, והיא לא מזהה את השפה שבה מועברים הנתונים.

1
2
3  
out.println(new String(resultSet.getBytes(1));

סיכום

בעזרת דוגמא בסיסית זאת תוכל לתקשר למאגרי נתונים, אבל ישנו עוד חומר רב בנושא זה.
כמו-כן, לא כדאי להכניס את קטע הקוד של תקשורת לתוך דפי ה- jsp, אלא להשתמש ב- Beans או באמצעים אחרים.



המאמר נכתב ע"י הדר פורת
Keynetik – בניית אתרים
תגיות: JDBC‏  /  JSP‏  /  DB‏  /  Database‏  

תגובות בפייסבוק

תגובות למאמר



תגיות פופולאריות

X
הצטרף לעמוד שלנו בפייסבוק להישאר מעודכן!
וובמאסטר © כל הזכויות שמורות