JDBC - szybki przewodnik
Co to jest JDBC?
JDBC oznacza Java Database Connectivity, czyli standardowy interfejs API języka Java zapewniający niezależną od bazy danych łączność między językiem programowania Java a szeroką gamą baz danych.
Biblioteka JDBC zawiera interfejsy API dla każdego z zadań często związanych z użyciem bazy danych:
Nawiązywanie połączenia z bazą danych
Tworzenie instrukcji SQL lub MySQL
Wykonywanie zapytań SQL lub MySQL w bazie danych
Przeglądanie i modyfikowanie wynikowych rekordów
Warunek wstępny:
Aby nauczyć się JDBC, musisz dobrze rozumieć następujące dwa tematy:
Podstawowe programowanie w języku JAVA
Baza danych SQL lub MySQL
JDBC - Konfiguracja środowiska:
Upewnij się, że wykonałeś następującą konfigurację:
Instalacja jądra JAVA
Instalacja bazy danych SQL lub MySQL
Oprócz powyższego musisz skonfigurować bazę danych, której użyjesz w swoim projekcie. Zakładając, że jest to EMP i utworzyłeś pracowników w tabeli w tej samej bazie danych.
Tworzenie aplikacji JDBC:
Tworzenie aplikacji JDBC obejmuje sześć kroków, które omówię w tym samouczku:
Importuj paczki:
Wymaga to dołączenia pakietów zawierających klasy JDBC potrzebne do programowania bazy danych. Najczęściej użycie importu java.sql. * Jest wystarczające w następujący sposób:
//STEP 1. Import required packages
import java.sql.*;
Zarejestruj sterownik JDBC:
Wymaga to zainicjowania sterownika, aby można było otworzyć kanał komunikacyjny z bazą danych. Poniżej znajduje się fragment kodu, aby to osiągnąć:
//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");
Otwórz połączenie:
Wymaga to użycia metody DriverManager.getConnection () w celu utworzenia obiektu Connection, który reprezentuje fizyczne połączenie z bazą danych w następujący sposób:
//STEP 3: Open a connection
// Database credentials
static final String USER = "username";
static final String PASS = "password";
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
Wykonaj zapytanie:
Wymaga to użycia obiektu typu Statement lub PreparedStatement do zbudowania i przesłania instrukcji SQL do bazy danych w następujący sposób:
//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);
Jeśli wymagana jest instrukcja SQL UPDATE, INSERT lub DELETE, wymagany będzie następujący fragment kodu:
//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "DELETE FROM Employees";
ResultSet rs = stmt.executeUpdate(sql);
Wyodrębnij dane z zestawu wyników:
Ten krok jest wymagany w przypadku pobierania danych z bazy danych. Możesz użyć odpowiedniej metody ResultSet.getXXX (), aby pobrać dane z zestawu wyników w następujący sposób:
//STEP 5: Extract data from result set
while(rs.next()){
//Retrieve by column name
int id = rs.getInt("id");
int age = rs.getInt("age");
String first = rs.getString("first");
String last = rs.getString("last");
//Display values
System.out.print("ID: " + id);
System.out.print(", Age: " + age);
System.out.print(", First: " + first);
System.out.println(", Last: " + last);
}
Oczyść środowisko:
Należy jawnie zamknąć wszystkie zasoby bazy danych zamiast polegać na wyrzucaniu elementów bezużytecznych maszyny JVM w następujący sposób:
//STEP 6: Clean-up environment
rs.close();
stmt.close();
conn.close();
Pierwszy program JDBC:
Na podstawie powyższych kroków możemy mieć następujący skonsolidowany kod przykładowy, którego możemy użyć jako szablonu podczas pisania naszego kodu JDBC:
Ten przykładowy kod został napisany na podstawie ustawień środowiska i bazy danych opisanych w rozdziale Środowisko.
//STEP 1. Import required packages
import java.sql.*;
public class FirstExample {
// JDBC driver name and database URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost/EMP";
// Database credentials
static final String USER = "username";
static final String PASS = "password";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");
//STEP 3: Open a connection
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);
//STEP 5: Extract data from result set
while(rs.next()){
//Retrieve by column name
int id = rs.getInt("id");
int age = rs.getInt("age");
String first = rs.getString("first");
String last = rs.getString("last");
//Display values
System.out.print("ID: " + id);
System.out.print(", Age: " + age);
System.out.print(", First: " + first);
System.out.println(", Last: " + last);
}
//STEP 6: Clean-up environment
rs.close();
stmt.close();
conn.close();
}catch(SQLException se){
//Handle errors for JDBC
se.printStackTrace();
}catch(Exception e){
//Handle errors for Class.forName
e.printStackTrace();
}finally{
//finally block used to close resources
try{
if(stmt!=null)
stmt.close();
}catch(SQLException se2){
}// nothing we can do
try{
if(conn!=null)
conn.close();
}catch(SQLException se){
se.printStackTrace();
}//end finally try
}//end try
System.out.println("Goodbye!");
}//end main
}//end FirstExample
Teraz skompilujmy powyższy przykład w następujący sposób:
C:\>javac FirstExample.java
C:\>
Kiedy biegasz FirstExample, daje następujący wynik:
C:\>java FirstExample
Connecting to database...
Creating statement...
ID: 100, Age: 18, First: Zara, Last: Ali
ID: 101, Age: 25, First: Mahnaz, Last: Fatma
ID: 102, Age: 30, First: Zaid, Last: Khan
ID: 103, Age: 28, First: Sumit, Last: Mittal
C:\>
Metody SQLException:
SQLException może wystąpić zarówno w sterowniku, jak iw bazie danych. Gdy wystąpi taki wyjątek, obiekt typu SQLException zostanie przekazany do klauzuli catch.
Przekazany obiekt SQLException ma dostępne następujące metody pobierania dodatkowych informacji o wyjątku:
metoda | Opis |
---|---|
getErrorCode () | Pobiera numer błędu skojarzony z wyjątkiem. |
getMessage () | Pobiera komunikat o błędzie sterownika JDBC dotyczący błędu obsługiwanego przez sterownik lub numer błędu Oracle i komunikat o błędzie bazy danych. |
getSQLState () | Pobiera ciąg XOPEN SQLstate. W przypadku błędu sterownika JDBC ta metoda nie zwraca żadnych przydatnych informacji. W przypadku błędu bazy danych zwracany jest pięciocyfrowy kod XOPEN SQLstate. Ta metoda może zwrócić wartość null. |
getNextException () | Pobiera następny obiekt Exception w łańcuchu wyjątków. |
printStackTrace () | Wyświetla bieżący wyjątek lub obiekt do rzucania oraz jego śledzenie wstecz do standardowego strumienia błędów. |
printStackTrace (PrintStream s) | Drukuje ten obiekt do rzucania i jego śledzenie wstecz do określonego strumienia wydruku. |
printStackTrace (PrintWriter w) | Drukuje ten obiekt do rzucania i jego ślad w zapisie wydruku, który określisz. |
Wykorzystując informacje dostępne w obiekcie Exception, można wychwycić wyjątek i odpowiednio kontynuować program. Oto ogólna forma bloku próbnego:
try {
// Your risky code goes between these curly braces!!!
}
catch(Exception ex) {
// Your exception handling code goes between these
// curly braces, similar to the exception clause
// in a PL/SQL block.
}
finally {
// Your must-always-be-executed code goes between these
// curly braces. Like closing database connection.
}
JDBC - typy danych:
Poniższa tabela zawiera podsumowanie domyślnego typu danych JDBC, na który konwertowany jest typ danych Java po wywołaniu metody setXXX () obiektu PreparedStatement lub CallableStatement albo metody ResultSet.updateXXX ().
SQL | JDBC / Java | setXXX | updateXXX |
---|---|---|---|
VARCHAR | java.lang.String | setString | updateString |
ZWĘGLAĆ | java.lang.String | setString | updateString |
LONGVARCHAR | java.lang.String | setString | updateString |
KAWAŁEK | boolean | setBoolean | updateBoolean |
NUMERYCZNE | java.math.BigDecimal | setBigDecimal | updateBigDecimal |
TINYINT | bajt | setByte | updateByte |
SMALLINT | krótki | setShort | updateShort |
LICZBA CAŁKOWITA | int | setInt | updateInt |
BIGINT | długo | setLong | updateLong |
REAL | pływak | setFloat | updateFloat |
PŁYWAK | pływak | setFloat | updateFloat |
PODWÓJNIE | podwójnie | setDouble | updateDouble |
VARBINARY | bajt [] | setBytes | updateBytes |
DWÓJKOWY | bajt [] | setBytes | updateBytes |
DATA | java.sql.Date | ustawić datę | updateDate |
CZAS | java.sql.Time | setTime | czas aktualizacji |
ZNAK CZASU | java.sql.Timestamp | setTimestamp | updateTimestamp |
CLOB | java.sql.Clob | setClob | updateClob |
KROPELKA | java.sql.Blob | setBlob | updateBlob |
SZYK | java.sql.Array | setARRAY | updateARRAY |
REF | java.sql.Ref | SetRef | updateRef |
STRUKTURA | java.sql.Struct | SetStruct | updateStruct |
JDBC 3.0 ma ulepszoną obsługę typów danych BLOB, CLOB, ARRAY i REF. Obiekt ResultSet ma teraz metody updateBLOB (), updateCLOB (), updateArray () i updateRef (), które umożliwiają bezpośrednie manipulowanie odpowiednimi danymi na serwerze.
Metody setXXX () i updateXXX () umożliwiają konwersję określonych typów Java do określonych typów danych JDBC. Metody setObject () i updateObject () umożliwiają odwzorowanie prawie każdego typu Java na typ danych JDBC.
Obiekt ResultSet zapewnia odpowiednią metodę getXXX () dla każdego typu danych w celu pobrania wartości kolumny. Każda metoda może być używana z nazwą kolumny lub jej pozycją porządkową.
SQL | JDBC / Java | setXXX | getXXX |
---|---|---|---|
VARCHAR | java.lang.String | setString | getString |
ZWĘGLAĆ | java.lang.String | setString | getString |
LONGVARCHAR | java.lang.String | setString | getString |
KAWAŁEK | boolean | setBoolean | getBoolean |
NUMERYCZNE | java.math.BigDecimal | setBigDecimal | getBigDecimal |
TINYINT | bajt | setByte | getByte |
SMALLINT | krótki | setShort | getShort |
LICZBA CAŁKOWITA | int | setInt | getInt |
BIGINT | długo | setLong | getLong |
REAL | pływak | setFloat | getFloat |
PŁYWAK | pływak | setFloat | getFloat |
PODWÓJNIE | podwójnie | setDouble | getDouble |
VARBINARY | bajt [] | setBytes | getBytes |
DWÓJKOWY | bajt [] | setBytes | getBytes |
DATA | java.sql.Date | ustawić datę | getDate |
CZAS | java.sql.Time | setTime | uzyskać czas |
ZNAK CZASU | java.sql.Timestamp | setTimestamp | getTimestamp |
CLOB | java.sql.Clob | setClob | getClob |
KROPELKA | java.sql.Blob | setBlob | getBlob |
SZYK | java.sql.Array | setARRAY | getARRAY |
REF | java.sql.Ref | SetRef | getRef |
STRUKTURA | java.sql.Struct | SetStruct | getStruct |
JDBC - przetwarzanie wsadowe:
Przetwarzanie wsadowe umożliwia grupowanie powiązanych instrukcji SQL we wsad i przesyłanie ich jednym wywołaniem do bazy danych.
Wysyłając jednocześnie kilka instrukcji SQL do bazy danych, zmniejszasz obciążenie komunikacyjne, poprawiając w ten sposób wydajność.
Do obsługi tej funkcji nie są wymagane sterowniki JDBC. Aby określić, czy docelowa baza danych obsługuje przetwarzanie aktualizacji wsadowych, należy użyć metody DatabaseMetaData.supportsBatchUpdates () . Metoda zwraca wartość „prawda”, jeśli sterownik JDBC obsługuje tę funkcję.
Plik addBatch()Metoda Statement, PreparedStatement i CallableStatement służy do dodawania poszczególnych instrukcji do partii. PlikexecuteBatch() służy do rozpoczęcia wykonywania wszystkich zgrupowanych instrukcji.
Plik executeBatch() zwraca tablicę liczb całkowitych, a każdy element tablicy reprezentuje liczbę aktualizacji dla odpowiedniej instrukcji update.
Tak jak możesz dodać instrukcje do partii w celu przetworzenia, możesz je usunąć za pomocą clearBatch()metoda. Ta metoda usuwa wszystkie instrukcje dodane za pomocą metody addBatch (). Nie możesz jednak wybiórczo wybrać, które oświadczenie chcesz usunąć.
JDBC - przesyłanie strumieniowe danych:
Obiekt PreparedStatement ma możliwość używania strumieni wejściowych i wyjściowych do dostarczania danych parametrów. Umożliwia to umieszczanie całych plików w kolumnach bazy danych, które mogą zawierać duże wartości, takie jak typy danych CLOB i BLOB.
Istnieją następujące metody, których można użyć do strumieniowego przesyłania danych:
setAsciiStream(): Ta metoda służy do dostarczania dużych wartości ASCII.
setCharacterStream(): Ta metoda służy do dostarczania dużych wartości UNICODE.
setBinaryStream(): Ta metoda służy do dostarczania dużych wartości binarnych.
Metoda setXXXStream () wymaga dodatkowego parametru, rozmiaru pliku, oprócz symbolu zastępczego parametru. Ten parametr informuje sterownik, ile danych należy przesłać do bazy danych za pomocą strumienia.
Aby uzyskać szczegółowe informacje na temat wszystkich tych koncepcji, musisz przejść przez cały samouczek.