java jdbc transaction management with example
Αυτό το σεμινάριο εξηγεί τους τύπους συναλλαγών JDBC, τους τύπους δεδομένων, τις μεθόδους διαχείρισης συναλλαγών και τον τρόπο χρήσης τους στο πρόγραμμα Java:
Στο JDBC ResultSet φροντιστήριο του Εκμάθηση σειράς JDBC , μάθαμε να χρησιμοποιούμε το JDBC ResultSet για την ανάκτηση δεδομένων.
Σε αυτό το σεμινάριο, θα συζητήσουμε τους τύπους συναλλαγών στο JDBC. Έχουμε δει μια σύντομη εισαγωγή στους τύπους συναλλαγών στα προηγούμενα σεμινάρια μας. Εδώ θα δούμε αναλυτικά. Θα καλύψουμε επίσης ποιοι είναι οι τύποι δεδομένων στο JDBC και πώς να το χρησιμοποιήσετε στο πρόγραμμα Java.
Η βάση δεδομένων θα έχει διαφορετικούς τύπους δεδομένων και η Java θα έχει διαφορετικούς τύπους δεδομένων. Η JDBC θα διαχειριστεί αυτήν τη διαφοροποίηση. Ας ετοιμαστούμε να μάθουμε το σημαντικό θέμα στο JDBC.
Τι θα μάθετε:
Διαχείριση συναλλαγών JDBC
Η ακολουθία ενεργειών (δηλώσεις SQL) αντιμετωπίζεται ως μία μονάδα που είναι γνωστή ως συναλλαγή. Η Διαχείριση συναλλαγών είναι σημαντική για εφαρμογές με προσανατολισμό το RDBMS για τη διατήρηση της ακεραιότητας και της συνοχής των δεδομένων.
Κατά την εκτέλεση της συναλλαγής, θα χρησιμοποιήσουμε τις μεθόδους getXXX και setXXX για την ανάκτηση και ρύθμιση των δεδομένων στο αντικείμενο ResultSet. Το XXX αντιπροσωπεύει τους τύπους δεδομένων των στηλών. Σε αυτό το σεμινάριο θα συζητήσουμε τους τύπους συναλλαγών και δεδομένων του JDBC.
Τύποι συναλλαγών
Στο JDBC κάθε ερώτημα SQL θα θεωρείται συναλλαγή. Όταν δημιουργούμε μια σύνδεση βάσης δεδομένων στο JDBC, θα εκτελείται σε λειτουργία αυτόματης δέσμευσης (η τιμή αυτόματης δέσμευσης είναι ΑΛΗΘΕΙΑ). Μετά την εκτέλεση της δήλωσης SQL, θα δεσμευτεί αυτόματα.
Μερικές φορές, ενδέχεται να θέλουμε να πραγματοποιήσουμε τη συναλλαγή μετά την εκτέλεση ορισμένων ακόμη δηλώσεων SQL. Εκείνη τη στιγμή, πρέπει να ορίσουμε την τιμή αυτόματης δέσμευσης σε False. Επομένως, αυτά τα δεδομένα δεν θα δεσμευτούν πριν από την εκτέλεση όλων των ερωτημάτων. Εάν λάβουμε μια εξαίρεση στη συναλλαγή, μπορούμε να επαναφέρουμε τις αλλαγές () και να την κάνουμε όπως πριν. Η διαχείριση συναλλαγών μπορεί να εξηγηθεί καλά - χρησιμοποιώντας ιδιότητες ACID.
ΟΞΥ σημαίνει
- Α – Ατομικότητα -> Εάν όλα τα ερωτήματα εκτελούνται με επιτυχία, τα δεδομένα θα δεσμευτούν, αλλιώς δεν θα.
- C – Συνοχή -> Το DB πρέπει να βρίσκεται σε σταθερή κατάσταση μετά από οποιαδήποτε συναλλαγή.
- I– Απομόνωση -> Η συναλλαγή απομονώνεται από άλλες συναλλαγές.
- D – Ανθεκτικότητα -> Εάν η συναλλαγή πραγματοποιηθεί μία φορά, θα παραμείνει πάντα δεσμευμένη.
Υπάρχουν τρεις πιο σημαντικές λειτουργίες στη Διαχείριση συναλλαγών. Αυτοί είναι:
είναι το κλειδί δικτύου ο κωδικός πρόσβασης wifi
- Διαπράττω: Μετά την εκτέλεση των δηλώσεων SQL, θέλουμε να κάνουμε τις αλλαγές μόνιμες στη βάση δεδομένων. Πρέπει να ονομάσουμε τη μέθοδο commit (). Κανονικά, αυτό που δεσμεύεται σημαίνει ότι θα κάνει τις αλλαγές μόνιμα στη βάση δεδομένων. Δεν μπορούμε να αναιρέσουμε / ανακαλέσουμε τις αλλαγές. Αλλά μπορούμε να αλλάξουμε τα δεδομένα στη βάση δεδομένων.
- Επιστροφή: Η επαναφορά αναιρεί τις αλλαγές μέχρι την τελευταία δέσμευση ή το σημείο αποθήκευσης που αναφέρεται. Μερικές φορές μπορεί να θέλουμε να αναιρέσουμε τις αλλαγές. Για παράδειγμα, έχουμε ένα ένθετο ερώτημα, το ένα μέρος έχει εκτελεστεί με επιτυχία και το άλλο έχει κάνει κάποια εξαίρεση. Εκείνη τη στιγμή, θέλουμε να αναιρέσουμε τις αλλαγές που έγιναν από το πρώτο μέρος, θα πρέπει να καλέσουμε τη μέθοδο Rollback () για να το κάνουμε αυτό εάν έχει συμβεί εξαίρεση.
- Αποθήκευση: Το Savepoint βοηθά στη δημιουργία σημείου ελέγχου σε μια συναλλαγή και επιτρέπει την επαναφορά στο συγκεκριμένο σημείο αποθήκευσης. Οποιοδήποτε σημείο αποθήκευσης που έχει δημιουργηθεί για μια συναλλαγή θα καταστραφεί αυτόματα και θα καταστεί άκυρο μετά την πραγματοποίηση ή επαναφορά της συναλλαγής.
Μέχρι τώρα έχουμε δει τι είναι η δέσμευση, η επαναφορά και το σημείο αποθήκευσης και οι λειτουργίες του. Παρακάτω, θα δούμε τις μεθόδους και τον τρόπο χρήσης του στο πρόγραμμα.
Μέθοδοι διαχείρισης συναλλαγών
Η διασύνδεση σύνδεσης παρέχει 5 μεθόδους για τη διαχείριση συναλλαγών. Έχουν ως εξής:
# 1) μέθοδος setAutoCommit ()
Από προεπιλογή, η τιμή της τιμής AutoCommit είναι TRUE. Μετά την εκτέλεση της δήλωσης SQL, θα δεσμευτεί αυτόματα. Χρησιμοποιώντας τη μέθοδο setAutoCommit () μπορούμε να ορίσουμε την τιμή σε AutoCommit.
# 2) Μέθοδος Commit ()
Η μέθοδος δέσμευσης χρησιμοποιείται για τη δέσμευση των δεδομένων. Μετά την εκτέλεση της δήλωσης SQL, μπορούμε να καλέσουμε τη δέσμευση (). Θα δεσμεύσει τις αλλαγές που γίνονται από τη δήλωση SQL.
Σύνταξη: conn.commit ();
# 3) Μέθοδος επαναφοράς ()
Η μέθοδος επαναφοράς χρησιμοποιείται για την αναίρεση των αλλαγών έως ότου πραγματοποιηθεί η τελευταία δέσμευση. Εάν αντιμετωπίζουμε οποιοδήποτε ζήτημα ή εξαίρεση στη ροή εκτέλεσης των δηλώσεων SQL, ενδέχεται να επαναφέρουμε τη συναλλαγή.
Σύνταξη: conn.rollback ();
# 4) Μέθοδος setSavepoint ()
Το Savepoint σας δίνει πρόσθετο έλεγχο της συναλλαγής. Όταν ορίζετε ένα σημείο αποθήκευσης στη συναλλαγή (μια ομάδα δηλώσεων SQL), μπορείτε να χρησιμοποιήσετε τη μέθοδο επαναφοράς () για να αναιρέσετε όλες τις αλλαγές μέχρι το σημείο αποθήκευσης ή μετά το σημείο αποθήκευσης (). Η μέθοδος setSavepoint () χρησιμοποιείται για τη δημιουργία ενός νέου σημείου αποθήκευσης.
# 5) μέθοδος ReleaseSavepoint ()
Χρησιμοποιείται για τη διαγραφή του αποθηκευμένου σημείου αποθήκευσης.
Στο παρακάτω πρόγραμμα, θα μάθετε περισσότερα για αυτές τις μεθόδους και θα μάθετε επίσης πώς να το χρησιμοποιείτε στο πρόγραμμα Java.
Σε αυτό το σεμινάριο, όλα τα προγράμματα είναι γραμμένα σε Java. Έχουμε χρησιμοποιήσει την έκδοση Java 8 και το Oracle DB.
>> Κάντε κλικ εδώ για λήψη του λογισμικού Oracle.
>> Κάντε κλικ εδώ για λήψη της έκδοσης Java 8.
Έχει τη διαδικασία εγκατάστασης Java βήμα προς βήμα.
Πρόγραμμα συναλλαγών
package com.STH.JDBC; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Savepoint; import java.sql.Statement; public class Transaction_Management { public static void main(String() args) throws ClassNotFoundException { // TODO Auto-generated method stub //Select Query to get the Data from employee_details table String QUERY = 'select * from employee_details where empNum = 2001'; String QUERY1 = 'select * from employee_details where empNum = 2002'; Boolean autoCommit; String update_query = 'update employee_details set salary = 41000 where empNum = 2001'; String update_query1 = 'update employee_details set salary = 42000 where empNum = 2002'; //Update query to set the email id for the employee whose empNUM is 1001 Class.forName('oracle.jdbc.driver.OracleDriver'); try(Connection conn = DriverManager.getConnection('jdbc:oracle:thin:system/pass123@localhost:1521:XE')) { Statement statemnt1 = conn.createStatement(); ResultSet rs1 =null; //Checking whether the SELECT query is executed successfully or not rs1 = statemnt1.executeQuery(QUERY); //Executed the SELECT Query System.out.println('Getting the data from employee_details table'); displayData(rs1); //Set the autoCommit value of the connection to FALSE System.out.println('Setting the AutoCommit value as FALSE'); conn.setAutoCommit(false); autoCommit = conn.getAutoCommit(); System.out.println('AutoCommit value of the Connection = '+ autoCommit); //Creating Statement to execute the update query statemnt1 = conn.createStatement(); System.out.println('Executing Update query to update salary of EMPNUM = 2001'); System.out.println('Update Query is ' + update_query); int return_rows = statemnt1.executeUpdate(update_query); System.out.println('Updated the data but didn't commit'); //Getting data after Updation Connection conn1 = DriverManager.getConnection('jdbc:oracle:thin:system/pass123@localhost:1521:XE'); System.out.println('Opening new connection'); System.out.println('EMPNUM = 2001 data'); Statement statement2 = conn1.createStatement(); ResultSet rs; rs = statement2.executeQuery(QUERY); displayData(rs); System.out.println('Commit has been done'); conn.commit(); Savepoint s1 = conn.setSavepoint(); System.out.println('SavePoint has been created'); System.out.println('Displaying data of EMPNUM = 2001'); System.out.println('Using The Second Connection'); rs = statement2.executeQuery(QUERY); displayData(rs); rs = statemnt1.executeQuery(QUERY); //Rollback the transaction System.out.println('Data of EMPNUM = 2002'); rs1 = statemnt1.executeQuery(QUERY1); displayData(rs1); System.out.println('Updating the salary of EMPNUM = 2002'); System.out.println('Update Query is ' + update_query1); statemnt1.executeUpdate(update_query1); System.out.println('Data of EMPNUM = 2002 but didn't commit'); rs1 = statemnt1.executeQuery(QUERY1); displayData(rs1); System.out.println('Rollback is done... so updated data won't be reflected'); conn.rollback(s1); System.out.println('Data of EMPNUM = 2002 after Rollback till the last savepoint'); rs1 = statemnt1.executeQuery(QUERY1); displayData(rs1); } catch (SQLException e) { e.printStackTrace(); } } public static void displayData(ResultSet rs1) throws SQLException { while(rs1.next()) { int empNum = rs1.getInt('empNum'); String lastName = rs1.getString('lastName'); String firstName = rs1.getString('firstName'); String email = rs1.getString('email'); String deptNum = rs1.getString('deptNum'); String salary = rs1.getString('salary'); System.out.println(empNum + ',' +lastName+ ',' +firstName+ ',' +email +','+deptNum +',' +salary); } } }
Παραγωγή:
Εξήγηση:
Αυτό που κάναμε στο παραπάνω πρόγραμμα διαχείρισης συναλλαγών είναι να ενημερώσουμε τις τιμές του συγκεκριμένου υπαλλήλου στον πίνακα EMPLOYEE_DETAILS και να δεσμεύσουμε τα δεδομένα. Εάν έχει προκύψει κάποιο σφάλμα ή εξαίρεση, τότε έχουμε κάνει τη λειτουργία επαναφοράς (). Τώρα θα δούμε την πλήρη εξήγηση του προγράμματος.
# 1) Δημιουργήθηκε ερώτημα 2 Select για 2 υπαλλήλους με βάση το EMPID τους
Ακολουθούν τα 2 επιλεγμένα ερωτήματα.
String QUERY = 'select * from employee_details where empNum = 2001'; String QUERY1 = 'select * from employee_details where empNum = 2002';
#δύο) Δημιούργησαν δύο ερωτήματα ενημέρωσης για 2 υπαλλήλους με βάση το EMPID τους
Δύο ενημερωμένα ερωτήματα:
String update_query = 'update employee_details set salary = 41000 where empNum = 2001'; String update_query1 = 'update employee_details set salary = 42000 where empNum = 2002';
# 3) Ανοίξτε το Connection, εκτελέστε το επιλεγμένο ερώτημα και εμφανίστηκε τα δεδομένα του EMPNUM = 2001.
# 4) Χρησιμοποιώντας τη μέθοδο setAutoCommit (), ορίστε την τιμή του autoCommit σε false.
# 5) Εκτέλεσε το ερώτημα ενημέρωσης του EMPNUM = 2001 και δημιούργησε μια άλλη σύνδεση για την ίδια βάση δεδομένων και επέλεξε την τιμή του EMPNUM = 2001.
# 6) Τα προκύπτοντα δεδομένα του υπαλλήλου του οποίου το EMPNUM = 2001 δεν είναι τα ενημερωμένα δεδομένα. Επειδή δεν έχουμε πραγματοποιήσει τη δέσμευση (). Εάν έχετε χρησιμοποιήσει την ίδια σύνδεση με την οποία την έχετε χρησιμοποιήσει για ενημέρωση, θα σας δείξει τα ενημερωμένα δεδομένα. Τώρα δεσμεύτηκαν τα δεδομένα. Τα δεδομένα αντικατοπτρίζονται στον πίνακα.
# 7) Δημιουργήθηκε ένα σημείο αποθήκευσης μετά τη λειτουργία δέσμευσης.
# 8) Χρησιμοποιώντας το επιλεγμένο ερώτημα για την εμφάνιση δεδομένων του EMPNUM = 2002. Άλλαξε τον μισθό αυτού του υπαλλήλου χρησιμοποιώντας ένα ερώτημα ενημέρωσης. Μετά από αυτό εμφανίστηκαν τα δεδομένα του EMPNUM = 2002, χρησιμοποιώντας την ίδια σύνδεση. Θα πρέπει να εμφανίζει τα ενημερωμένα δεδομένα.
# 9) Έγινε επαναφορά μέχρι το τελευταίο σημείο αποθήκευσης χρησιμοποιώντας τη μέθοδο επαναφοράς. Τώρα, όταν έχουμε εμφανίσει τα δεδομένα αυτού του υπαλλήλου χρησιμοποιώντας την ίδια σύνδεση, έχει τα παλιά δεδομένα, επειδή η επαναφορά αναιρεί τις αλλαγές μέχρι το τελευταίο σημείο αποθήκευσης, εάν αναφέρουμε άλλο σημείο αποθήκευσης στην τελευταία δέσμευση.
# 10) Έχουμε δημιουργήσει μια μέθοδο η οποία θα εμφανίζει τα δεδομένα επειδή προβάλλουμε δεδομένα πολλές φορές εδώ.
Τύποι δεδομένων JDBC
Οι βάσεις δεδομένων έχουν τύπους δεδομένων SQL και η Java έχει τύπους δεδομένων Java. Πρέπει να υπάρχει ένας μηχανισμός ανάγνωσης και γραφής δεδομένων μεταξύ μιας εφαρμογής Java και μιας βάσης δεδομένων. Διαφορετικές βάσεις δεδομένων υποστηρίζουν τύπους SQL, αλλά με κάποιες παραλλαγές στο όνομα.
Για παράδειγμα, οι περισσότερες από τις βάσεις δεδομένων υποστηρίζουν μεγάλες δυαδικές τιμές, το Oracle το ονομάζει LONG RAW, το Sybase το ονομάζει IMAGE, το Informix το ονομάζει ως BYTE και το DB2 το ονομάζει LONG VARCHAR FOR BIT DATA.
Κατά τη σύνταξη του προγράμματος JDBC, δεν χρειάζεται να ανησυχούμε για τους τύπους δεδομένων SQL που χρησιμοποιούνται από τη βάση δεδομένων προορισμού. Το JDBC διαθέτει ένα σύνολο γενικών αναγνωριστικών τύπου SQL στην κατηγορία java.sql.Types. Αυτοί οι τύποι έχουν σχεδιαστεί για να υποστηρίζουν τους περισσότερους από τους γενικούς τύπους δεδομένων SQL. Κατά τη σύνταξη ενός προγράμματος JDBC, θα χρησιμοποιούμε μόνο τύπους δεδομένων JDBC.
Το πρόγραμμα οδήγησης JDBC θα μετατρέψει τους τύπους δεδομένων Java σε τύπους δεδομένων βάσης δεδομένων μπρος-πίσω. Μπορείτε να χρησιμοποιήσετε τη μέθοδο java.sql.DatabaseMetaData.getTypeInfo για να ελέγξετε ποιοι τύποι SQL υποστηρίζονται πραγματικά από μια δεδομένη βάση δεδομένων και στη συνέχεια να γράψετε ένα πρόγραμμα. Το JDBC χρησιμοποιεί μια προεπιλεγμένη αντιστοίχιση για τους περισσότερους τύπους δεδομένων.
Για παράδειγμα, η συμβολοσειρά Java θα μετατραπεί σε τύπο SQL VARCHAR.
Θα δούμε πώς γίνεται η αντιστοίχιση στη μέθοδο setXXX, getXXX και updateXXX των διεπαφών προετοιμασμένουStatement ή CallableStatement ή ResultSet στον παρακάτω πίνακα:
ΤΥΠΟΣ SQL | ΤΥΠΟΣ JAVA / JDBC | setXXX | getXXX | ενημέρωσηXXX |
---|---|---|---|---|
ΑΚΕΡΑΙΟΣ ΑΡΙΘΜΟΣ | int | setInt | βαμμένο | ενημέρωσηInt |
ΑΠΑΝΘΡΑΚΩΝΩ | java.lang.String | setString | getString | updateString |
ΒΑΡΚΑΡ | java.lang.String | setString | getString | updateString |
ΛΟΝΓΚΑΡΧΑΡΙ | java.lang.String | setString | getString | updateString |
ΚΟΜΜΑΤΙ | boolean | setBoolean | getBoolean | ενημέρωσηBoolean |
ΑΡΙΘΜΗΤΙΚΟΣ | java.math.BigDecimal | setBigDecimal | getBigDecimal | ΕνημέρωσηBigDecimal |
SMALLINT | μικρός | setShort | getShort | updateShort |
ΜΕΓΑΛΟ | μακρύς | σετ Long | getLong | ενημέρωσηLong |
ΠΡΑΓΜΑΤΙΚΟΣ | φλοτέρ | setFloat | getFloat | ενημέρωσηFloat |
ΦΛΟΤΕΡ | φλοτέρ | setFloat | getFloat | ενημέρωσηFloat |
ΔΙΠΛΟ | διπλό | setDouble | getDouble | ενημέρωσηDouble |
ΔΥΑΔΙΚΟΣ | ψηφιόλεξη() | setBytes | getBytes | ενημέρωσηBytes |
ΗΜΕΡΟΜΗΝΙΑ | java.sql. Ημερομηνία | setDate | getDate | ενημέρωσηΗμερομηνία |
ΧΡΟΝΟΣ | java.sql. Ώρα | setTime | getTime | updateTime |
TIMESTAMP | java.sql.Timestamp | setTimestamp | getTimestamp | updateTimeStamp |
CLOB | java.sql.Clob | setClob | getClob | updateClob |
ΑΜΟΡΦΗ ΜΑΖΑ | java.sql.Blob | setBlob | getBlob | ενημέρωσηBlob |
ΠΙΝΑΚΑΣ | Πίνακας | setArray | getArray | updateArray |
XML | Xml | setSQLXML | getSQLXML | updateSQLXML |
Δομημένος τύπος | Αντικείμενο | setObject | getObject | ενημέρωσηObject |
Έχουμε ρυθμίσει τη μέθοδοXXX, getXXX και updateXXX για βασικούς τύπους δεδομένων στα προηγούμενα σεμινάρια μας. Μπορείτε να αναφερθείτε σε αυτό.
Εδώ, έχουμε εξηγήσει τους τύπους clob και blob στο ακόλουθο παράδειγμα.
Παράδειγμα προγράμματος BLOB
package com.STH.JDBC; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.sql.Blob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Blob_Example { @SuppressWarnings('resource') public static void main(String() args) throws ClassNotFoundException, IOException { // TODO Auto-generated method stub String QUERY = 'Create table Blob_Sample_Example ( PicName varchar2(30), picture BLOB)'; //Select Query to get the Data from employee_details table //Update query to set the email id for the employee whose empNUM is 1001 Class.forName('oracle.jdbc.driver.OracleDriver'); System.out.println('Establishing Connection'); try(Connection conn = DriverManager.getConnection('jdbc:oracle:thin:system/pass123@localhost:1521:XE')) { Statement statemnt1 = conn.createStatement(); //Executing the Create Query statemnt1.execute(QUERY); System.out.println('Table has been created for BLOB type'); System.out.println('Inserting data into Blob_Sample_Example table'); String insert_query = ' insert into Blob_Sample_Example values(?,?)'; //Passing the values for preparedStatement PreparedStatement pstmnt = conn.prepareStatement(insert_query); pstmnt.setString(1, 'Sotware Testing Help'); //Mention Image path to store the image in DB FileInputStream inputStream = new FileInputStream('D:\Bhakiya\Bhakiya\JDBC\Software Testing Pic.png'); pstmnt.setBlob(2, inputStream); //Executing the preparedStatement to insert the data pstmnt.execute(); System.out.println('Retrieving data'); ResultSet rs = statemnt1.executeQuery('select * from Blob_Sample_Example'); while(rs.next()) { //Getting Picture Name System.out.println('Picture Name:' + rs.getString(1)); Blob blob1 = rs.getBlob(2); //using blob retrieving the Image byte byteArray() = blob1.getBytes(1,(int)blob1.length()); FileOutputStream outPutStream = new FileOutputStream('D:\Bhakiya\Bhakiya\JDBC\Software Testing Pic output.png'); outPutStream.write(byteArray); System.out.println(' Go to the following path: D:\Bhakiya\Bhakiya\JDBC\Software Testing Pic output.png'); } } catch (SQLException e) { e.printStackTrace(); } } }
Παραγωγή:
Το αρχείο αποθηκεύτηκε με επιτυχία στη δεδομένη διαδρομή.
Εξήγηση:
Στο παραπάνω πρόγραμμα αυτό που κάναμε είναι Πρώτα έχουμε δημιουργήσει / αποθηκεύσει μία εικόνα στο φάκελο 'D: \ Bhakiya \ Bhakiya \ JDBC' . Αυτή η τοποθεσία είναι μόνο για παράδειγμα. Μπορείτε να δημιουργήσετε τη δική σας διαδρομή αρχείου στο σύστημά σας. Το όνομα του αρχείου είναι μια δοκιμή λογισμικού. Στη συνέχεια, δημιουργήσαμε ένα πρόγραμμα Java για να αποθηκεύσουμε αυτήν την εικόνα στον πίνακα DB και να ανακτήσουμε την εικόνα από τον πίνακα και να την αποθηκεύσουμε στο τοπικό σύστημα.
Μέχρι τώρα έχουμε συζητήσει την επισκόπηση της εργασίας. Τώρα θα δούμε πώς το καταφέραμε στο πρόγραμμα.
# 1) Δημιουργήστε έναν πίνακα στο DB για να αποθηκεύσετε την εικόνα.
Σύνταξη:
String QUERY = 'Create table Blob_Sample_Example ( PicName varchar2(30), picture BLOB)';
Στο παραπάνω ερώτημα, έχουμε 2 στήλες.
- PicName - varchar2 -> Χρησιμοποιείται για την αποθήκευση του ονόματος της εικόνας
- picture - BLOB -> Χρησιμοποιείται για την αποθήκευση της εικόνας στον πίνακα.
Ο τύπος δεδομένων BLOB χρησιμοποιείται για την αποθήκευση της εικόνας / εικόνας στον πίνακα DB.
#δύο) Η σύνδεση και η δήλωση έχουν δημιουργηθεί και ονομάζονται μέθοδος εκτέλεσης για την εκτέλεση του ερωτήματος CREATE.
statemnt1.execute(QUERY);
# 3) Στη συνέχεια, δημιουργήσαμε το ερώτημα εισαγωγής και το εκτελέσαμε χρησιμοποιώντας το PreparedStatement.
Σύνταξη PreparedStatement:
PreparedStatement pstmnt = conn.prepareStatement(insert_query);
# 4) Χρήση του setString () - ορίστε το όνομα της εικόνας.
# 5) Για να ορίσετε την εικόνα, χρησιμοποιήστε την κλάση FileInputStream για να περάσετε τη θέση της εικόνας.
Σύνταξη:
FileInputStream inputStream = new FileInputStream('Picture Full Path');
Στη συνέχεια, χρησιμοποιώντας τη μέθοδο setBlob (), μπορούμε να ορίσουμε την εικόνα στο αντικείμενο PreparedStatement. Μετά από αυτό, ονομάζεται μέθοδος εκτέλεσης του PreparedStatement. Αυτό θα εισαγάγει τα δεδομένα δεδομένα στον Πίνακα.
Μετά την εκτέλεση του ερωτήματος εισαγωγής, χρησιμοποιώντας το αντικείμενο ResultSet ανακτούμε τα δεδομένα από τον Πίνακα (χρησιμοποιώντας Επιλογή ερωτήματος).
# 6) Χρησιμοποιώντας τη μέθοδο getString, μπορούμε να πάρουμε την αξία της στήλης PicName.
# 7) Για να λάβετε την εικόνα, ακολουθήστε τα παρακάτω βήματα:
- Δημιουργήστε αντικείμενο Blob και εκχωρήστε τις τιμές επιστροφής της μεθόδου getBlob του αντικειμένου ResultSet.
- Η σύνταξη για αυτό είναι: Blob blob1 = rs.getBlob ();
- Δημιουργήστε ένα αντικείμενο πίνακα byte και λάβετε την τιμή του αντικειμένου Blob ως byte.
- Δημιουργήστε αντικείμενο FileOutputStream αντικείμενο και περάστε την πλήρη διαδρομή για να αποθηκεύσετε την εικόνα σε αυτήν τη διαδρομή. Μέθοδος κλήσης εγγραφής () του αντικειμένου FileOutputStream - που θα αποθηκεύσει την εικόνα.
- Μετά από αυτό το πρόγραμμα εκτελέστηκε με επιτυχία.
# 8) Μεταβείτε στη θέση της εικόνας εξόδου και ελέγξτε αν η είσοδος και η έξοδος είναι ίδια.
CLOB Παράδειγμα προγράμματος
package com.STH.JDBC; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.sql.Blob; import java.sql.Clob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Clob_Example { public static void main(String() args) throws ClassNotFoundException, IOException { // TODO Auto-generated method stub String QUERY = 'Create table Clob_Sample_Example ( FileName varchar2(30), StoreFile CLOB)'; //Create Query to create new table for CLOB example Class.forName('oracle.jdbc.driver.OracleDriver'); //Creating Connection System.out.println('Establishing Connection'); try(Connection conn = DriverManager.getConnection('jdbc:oracle:thin:system/pass123@localhost:1521:XE')) { Statement statemnt1 = conn.createStatement(); //Executing create query statemnt1.execute(QUERY); System.out.println('Table has been created for CLOB type'); System.out.println('Inserting data into Clob_Sample_Example table'); //Insert Query String insert_query = ' insert into Clob_Sample_Example values(?,?)'; //Passing Parameters for PreparedStatement PreparedStatement pstmnt = conn.prepareStatement(insert_query); pstmnt.setString(1, 'File1'); FileReader fileRead = new FileReader('D:\Bhakiya\Bhakiya\JDBC\file1.txt'); pstmnt.setClob(2, fileRead); //Executing the PreparedStatement pstmnt.execute(); System.out.println('Retrieving data'); ResultSet rs = statemnt1.executeQuery('select * from Clob_Sample_Example'); while(rs.next()) { System.out.println('File Name:' + rs.getString(1)); //Getting file data Clob clob1 = rs.getClob(2); Reader r = clob1.getCharacterStream(); //Using Reader - read the data and Writer - Write the data in file in the given location FileWriter fileWrite = new FileWriter('D:\Bhakiya\Bhakiya\JDBC\file1 output.txt'); int i; while((i=r.read())!=-1) fileWrite.write(i); fileWrite.close(); System.out.println(' Go to the following path: D:\Bhakiya\Bhakiya\JDBC\file1 output.txt'); } } catch (SQLException e) { e.printStackTrace(); } } }
Παραγωγή:
Αρχείο εισαγωγής:
Το αρχείο αποθηκεύτηκε με επιτυχία στη δεδομένη διαδρομή.
Αρχείο εξόδου:
Εξήγηση:
Στο παραπάνω πρόγραμμα αυτό που κάναμε είναι πρώτα να δημιουργήσουμε / αποθηκεύσουμε ένα αρχείο κειμένου 'file1.txt' στο φάκελο 'D: \ Bhakiya \ Bhakiya \ JDBC'. Αυτή η τοποθεσία είναι μόνο για παράδειγμα. Μπορείτε να δημιουργήσετε τη δική σας διαδρομή αρχείου στο σύστημά σας. Στη συνέχεια, δημιουργήσαμε ένα πρόγραμμα Java για να αποθηκεύσουμε αυτό το αρχείο στον πίνακα DB και να ανακτήσουμε αυτό το αρχείο από τον πίνακα και να το αποθηκεύσουμε στο τοπικό σύστημα.
Μέχρι τώρα έχουμε συζητήσει την επισκόπηση της εργασίας. Τώρα θα δούμε πώς το καταφέραμε στο πρόγραμμα.
# 1) Δημιουργήστε έναν πίνακα στο DB για να αποθηκεύσετε την εικόνα.
Ακολουθεί η σύνταξη του ερωτήματος ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑ:
String QUERY = 'Create table Clob_Sample_Example ( FileName varchar2(30), StoreFile CLOB)';
Στο παραπάνω ερώτημα, έχουμε 2 στήλες.
- FileName - varchar2 -> Χρησιμοποιείται για την αποθήκευση του ονόματος της εικόνας.
- StoreFile - CLOB -> Χρησιμοποιείται για την αποθήκευση του αρχείου στον πίνακα.
Ο τύπος δεδομένων CLOB χρησιμοποιείται για την αποθήκευση του τύπου χαρακτήρων δυαδικών δεδομένων στον πίνακα DB
#δύο) Η σύνδεση και η δήλωση έχουν δημιουργηθεί και ονομάζονται μέθοδος εκτέλεσης για την εκτέλεση του ερωτήματος CREATE.
statemnt1.execute(QUERY);
# 3) Στη συνέχεια, δημιουργήσαμε το ερώτημα εισαγωγής και το εκτελέσαμε χρησιμοποιώντας το PreparedStatement.
Σύνταξη PreparedStatement:
PreparedStatement pstmnt = conn.prepareStatement(insert_query);
# 4) Χρήση του setString () - ορίστε το όνομα του ονόματος αρχείου.
# 5) Για να ορίσετε / αποθηκεύσετε το αρχείο, χρησιμοποιήστε την κλάση FileReader για να περάσετε το αρχείο με τη θέση πλήρωσης.
Σύνταξη:
FileReader fileRead = new FileReader('D:\Bhakiya\Bhakiya\JDBC\file1.txt');
Στη συνέχεια, χρησιμοποιώντας τη μέθοδο setClob (), μπορούμε να ορίσουμε το αρχείο στο αντικείμενο PreparedStatement. Μετά από αυτό ονομάστηκε η μέθοδος εκτέλεσης του PreparedStatement. Αυτό θα εισαγάγει τα δεδομένα δεδομένα στον Πίνακα.
Αφού εκτελέσετε το ερώτημα εισαγωγής, χρησιμοποιώντας το αντικείμενο ResultSet ανακτούμε τα δεδομένα από τον Πίνακα (Χρήση Επιλεκτικού Ερώτημα).
Επιλογή ερωτήματος:
'select * from Clob_Sample_Example'
# 6) Χρησιμοποιώντας τη μέθοδο getString μπορούμε να πάρουμε την τιμή της στήλης FileName.
# 7) Για να λάβετε το αρχείο, ακολουθήσαμε τα παρακάτω βήματα:
- Δημιουργήστε αντικείμενο Clob και εκχωρήστε τις τιμές επιστροφής της μεθόδου getClob του αντικειμένου ResultSet.
- Η σύνταξη για αυτό είναι: Clob clob1 = rs.getClob ();
- Δημιουργήστε το αντικείμενο Reader και λάβετε την τιμή του αντικειμένου Clob ως Character.
- Δημιουργήστε αντικείμενο FileWriter αντικείμενο και περάστε την πλήρη διαδρομή για να αποθηκεύσετε το αρχείο σε αυτήν τη διαδρομή. Μέθοδος κλήσης εγγραφής () του αντικειμένου FileWrite - που θα γράψει τα δεδομένα στο αρχείο στην τοποθεσία.
- Μετά από αυτό το πρόγραμμα εκτελέστηκε με επιτυχία.
# 8) Μεταβείτε στη θέση του αρχείου εξόδου και ελέγξτε αν τα αρχεία εισόδου και εξόδου είναι τα ίδια.
Σημεία που πρέπει να θυμάστε:
- Το ACID Properties εξηγεί τη διαχείριση συναλλαγών στη βάση δεδομένων.
- Commit (), rollback () και savepoint είναι οι πιο σημαντικές λειτουργίες στη Διαχείριση συναλλαγών.
- Το Commit θα κάνει τις αλλαγές μόνιμα στο DB, το Rollback θα αναιρέσει τις αλλαγές μέχρι την τελευταία δέσμευση ή το αναφερόμενο σημείο αποθήκευσης και το Savepoint βοηθά στη δημιουργία σημείου ελέγχου.
- Η βάση δεδομένων διατηρεί τύπους δεδομένων SQL και η Java διατηρεί τύπους δεδομένων Java. Το πρόγραμμα οδήγησης JDBC χρησιμοποιείται για τη διαχείριση αυτής της μετατροπής.
- Το ίδιο το πρόγραμμα οδήγησης JDBC έχει ορισμένους τύπους αναγνωριστικών SQL, επομένως ο προγραμματιστής δεν χρειάζεται να ανησυχεί για τους τύπους δεδομένων.
Συχνές Ερωτήσεις
Q # 1) Τι είναι ο τύπος δεδομένων JDBC;
Απάντηση: Η Java έχει τους τύπους δεδομένων της και η βάση δεδομένων έχει τους τύπους δεδομένων της. Το πρόγραμμα οδήγησης JDBC μετατρέπει τον τύπο δεδομένων Java στον κατάλληλο τύπο δεδομένων SQL που θα αποδεχτεί η βάση δεδομένων. Τα αντικείμενα ResultSet παρέχουν επίσης μεθόδους setXXX () και getXXX () διαθέσιμες για τους κατάλληλους τύπους δεδομένων.
Q # 2) Ποιος είναι ο τύπος δεδομένων για την ημερομηνία στην Java;
Απάντηση: Η ημερομηνία στην Java δεν είναι μόνο ένας τύπος δεδομένων αλλά και μια κλάση. Η ημερομηνία στην Java περιέχει την ημερομηνία, την ώρα, το έτος, το όνομα της ημέρας, την ημέρα της εβδομάδας και τη ζώνη ώρας. Η τάξη ημερομηνίας έχει τις κατάλληλες μεθόδους για την ανάκτηση των σχετικών δεδομένων.
Q # 3) Ποια είναι η διαφορά μεταξύ java.util.Date και java.sql.Date;
Απάντηση: Η κύρια διαφορά είναι το java.util.Date έχει επίσης πληροφορίες για την ημερομηνία και την ώρα. Αλλά το java.sql.Date έχει τις πληροφορίες μόνο για την ημερομηνία. Αυτή είναι η κύρια διαφορά που δεν μπορούμε να χαρτογραφήσουμε το java.util.Date απευθείας με το java.sql.Date.
Q # 4) Έχουμε ένα μάθημα στην Java για να αντιπροσωπεύσουμε τον τύπο TIME και TIMESTAMP για SQL;
Απάντηση: Ναι, έχουμε μια τάξη για TIME και TIMESTAMP για SQL. java.sql.Time class αντιπροσωπεύει πληροφορίες που σχετίζονται με το TIME. Η κλάση java.sql.timestamp αντιπροσωπεύει πληροφορίες σχετικά με το TIMESTAMP.
Ε # 5) Πώς να ξεκινήσετε μια συναλλαγή στο JDBC;
Απάντηση: Η σύνδεση JDBC ξεκινά με ενεργοποιημένη τη λειτουργία αυτόματης δέσμευσης, όπου κάθε δήλωση SQL θεωρείται συναλλαγή. Δεν υπάρχει συγκεκριμένη διαδικασία για να ξεκινήσετε μια συναλλαγή στο JDBC. Όταν δημιουργείτε μια σύνδεση και αρχίζετε να εκτελείτε τη δήλωση SQL, εκεί είναι που ξεκίνησε η συναλλαγή.
Q # 6) Ποια είναι η μέθοδος komit () στην Java;
Απάντηση: Η μέθοδος Commit () στην Java χρησιμοποιείται για την αποθήκευση των αλλαγών που έχουν πραγματοποιηθεί από την τελευταία δέσμευση (). Η μέθοδος Commit () είναι διαθέσιμη στη διασύνδεση σύνδεσης. Χρησιμοποιώντας ένα αντικείμενο σύνδεσης, μπορούμε να καλέσουμε τη δέσμευση ().
Q # 7) Ποια είναι η μέθοδος επαναφοράς στην Java;
Απάντηση: Μετά την τελευταία δέσμευση (), εάν έχουν προκύψει προβλήματα, μπορούμε να καλέσουμε τη μέθοδο επαναφοράς () για να επαναφέρουμε όλες τις αλλαγές που έγιναν έως ότου η τελευταία μέθοδος komit.rollback () είναι διαθέσιμη στη διεπαφή σύνδεσης. Χρησιμοποιώντας ένα αντικείμενο σύνδεσης, μπορούμε να καλέσουμε τη μέθοδο επαναφοράς ().
συμπέρασμα
Εδώ, έχουμε καλύψει τύπους δεδομένων σε Java και DB και πώς χειρίζεται το πρόγραμμα οδήγησης JDBC. Έχουμε συζητήσει τις ιδιότητες ACID. Αυτό είναι πιο σημαντικό για τον τραπεζικό τομέα. Θα είναι πολύ χρήσιμο για την καριέρα σας. Στην ενότητα Διαχείριση συναλλαγών, έχουμε συζητήσει μεθόδους δέσμευσης και επαναφοράς όπως commit (), rollback (), setAutoCommit (), setSavepoint () και releaseSavepoint ().
Συνιστώμενη ανάγνωση
- Εκμάθηση Java JDBC: Τι είναι το JDBC (Συνδεσιμότητα βάσης δεδομένων Java)
- Εκμάθηση σύνδεσης Java JDBC με παράδειγμα προγραμματισμού
- JDBC DriverManager, JDBC PreparedStatement And Statement
- JDBC ResultSet: Τρόπος χρήσης Java ResultSet για ανάκτηση δεδομένων
- Java DataTypes, Loops, Arrays, Switch και Assertions
- Java String length () Μέθοδος με παραδείγματα
- Πώς να χρησιμοποιήσετε τη μέθοδο Java toString;
- Δοκιμή βάσης δεδομένων Selenium (Χρήση WebDriver και JDBC API)