JDBC расшифровывается как J ava D ata base Cnectivity, который является стандартным Java API для независимой от базы данных связи между языком программирования Java и широким спектром баз данных.
Библиотека JDBC включает API для каждой из задач, обычно связанных с использованием базы данных:
-
Создание соединения с базой данных
-
Создание операторов SQL или MySQL
-
Выполнение этих запросов SQL или MySQL в базе данных
-
Просмотр и изменение полученных записей
Создание соединения с базой данных
Создание операторов SQL или MySQL
Выполнение этих запросов SQL или MySQL в базе данных
Просмотр и изменение полученных записей
Pre-Реквизит:
Для изучения JDBC необходимо хорошее понимание следующих двух предметов:
JDBC — Настройка среды:
Убедитесь, что вы выполнили следующие настройки:
-
Core JAVA Установка
-
Установка базы данных SQL или MySQL
Core JAVA Установка
Установка базы данных SQL или MySQL
Помимо вышесказанного вам необходимо настроить базу данных, которую вы будете использовать для своего проекта. Предполагая, что это EMP, и вы создали в таблице сотрудников в той же базе данных.
Создание приложения JDBC:
В создании приложения JDBC есть шесть шагов, о которых я расскажу в этом руководстве:
Импортируйте пакеты:
Для этого необходимо включить пакеты, содержащие классы JDBC, необходимые для программирования баз данных. Чаще всего с помощью import java.sql. * Будет достаточно следующего:
//STEP 1. Import required packages import java.sql.*;
Зарегистрируйте драйвер JDBC:
Это требует инициализации драйвера, чтобы вы могли открыть канал связи с базой данных. Ниже приведен фрагмент кода для достижения этой цели:
//STEP 2: Register JDBC driver Class.forName("com.mysql.jdbc.Driver");
Откройте соединение:
Для этого необходимо использовать метод DriverManager.getConnection () для создания объекта Connection, который представляет физическое соединение с базой данных следующим образом:
//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);
Выполнить запрос:
Для этого необходимо использовать объект типа Statement или PreparedStatement для построения и отправки оператора SQL в базу данных следующим образом:
//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);
Если требуется оператор SQL UPDATE, INSERT или DELETE, то потребуется следующий фрагмент кода:
//STEP 4: Execute a query System.out.println("Creating statement..."); stmt = conn.createStatement(); String sql; sql = "DELETE FROM Employees"; ResultSet rs = stmt.executeUpdate(sql);
Извлечь данные из набора результатов:
Этот шаг необходим, если вы выбираете данные из базы данных. Вы можете использовать соответствующий метод ResultSet.getXXX () для извлечения данных из результирующего набора следующим образом:
//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); }
Очистить окружающую среду:
Вы должны явно закрыть все ресурсы базы данных, а не полагаться на сборку мусора JVM следующим образом:
//STEP 6: Clean-up environment rs.close(); stmt.close(); conn.close();
Первая программа JDBC:
Исходя из вышеизложенных шагов, у нас может быть следующий консолидированный пример кода, который мы можем использовать в качестве шаблона при написании нашего кода JDBC:
Этот пример кода был написан на основе настройки среды и базы данных, выполненной в главе «Окружающая среда».
//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
Теперь давайте скомпилируем приведенный выше пример следующим образом:
C:\>javac FirstExample.java C:\>
Когда вы запускаете FirstExample , он выдает следующий результат:
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:\>
SQLException Методы:
Исключение SQLE может возникать как в драйвере, так и в базе данных. Когда возникает такое исключение, объект типа SQLException будет передан предложению catch.
Переданный объект SQLException имеет следующие методы, доступные для получения дополнительной информации об исключении:
метод | Описание |
---|---|
getErrorCode () | Получает номер ошибки, связанный с исключением. |
getMessage () | Получает сообщение об ошибке драйвера JDBC для ошибки, обработанной драйвером, или получает номер ошибки Oracle и сообщение об ошибке базы данных. |
getSQLState () | Получает строку состояния XOPEN SQL. Для ошибки драйвера JDBC из этого метода не возвращается никакой полезной информации. В случае ошибки базы данных возвращается пятизначный код XOPEN SQLstate. Этот метод может вернуть ноль. |
getNextException () | Получает следующий объект Exception в цепочке исключений. |
printStackTrace () | Печатает текущее исключение или throwable и его обратную трассировку в стандартный поток ошибок. |
printStackTrace (PrintStream s) | Печатает этот метод и его обратную трассировку в указанном вами потоке печати. |
printStackTrace (PrintWriter w) | Печатает этот метод и его обратную трассировку на указанном вами принтере. |
Используя информацию, доступную из объекта Exception, вы можете перехватить исключение и продолжить свою программу соответствующим образом. Вот общая форма блока try:
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 — Типы данных:
В следующей таблице приведены типы данных JDBC по умолчанию, в которые преобразуется тип данных Java при вызове метода setXXX () объекта PreparedStatement или CallableStatement или метода ResultSet.updateXXX ().
SQL | JDBC / Java | SetXXX | updateXXX |
---|---|---|---|
VARCHAR | java.lang.String | SetString | updateString |
CHAR | java.lang.String | SetString | updateString |
LONGVARCHAR | java.lang.String | SetString | updateString |
НЕМНОГО | логический | setBoolean | updateBoolean |
NUMERIC | java.math.BigDecimal | setBigDecimal | updateBigDecimal |
TINYINT | байт | setByte | updateByte |
SMALLINT | короткая | setShort | updateShort |
INTEGER | ИНТ | SetInt | updateInt |
BIGINT | долго | setLong | updateLong |
РЕАЛЬНЫЙ | поплавок | SetFloat | updateFloat |
FLOAT | поплавок | SetFloat | updateFloat |
DOUBLE | двойной | setDouble | updateDouble |
VARBINARY | байт [] | setBytes | updateBytes |
BINARY | байт [] | setBytes | updateBytes |
ДАТА | java.sql.Date | SETDATE | updateDate |
ВРЕМЯ | java.sql.Time | установленное время | Время обновления |
TIMESTAMP | java.sql.Timestamp | setTimestamp | updateTimestamp |
CLOB | java.sql.Clob | setClob | updateClob |
большой двоичный объект | java.sql.Blob | setBlob | updateBlob |
ARRAY | java.sql.Array | setARRAY | updateARRAY |
REF | java.sql.Ref | SetRef | updateRef |
STRUCT | java.sql.Struct | SetStruct | updateStruct |
JDBC 3.0 имеет расширенную поддержку типов данных BLOB, CLOB, ARRAY и REF. Объект ResultSet теперь имеет методы updateBLOB (), updateCLOB (), updateArray () и updateRef (), которые позволяют напрямую манипулировать соответствующими данными на сервере.
Методы setXXX () и updateXXX () позволяют преобразовывать определенные типы Java в конкретные типы данных JDBC. Методы setObject () и updateObject () позволяют сопоставить практически любой тип Java с типом данных JDBC.
Объект ResultSet предоставляет соответствующий метод getXXX () для каждого типа данных для получения значения столбца. Каждый метод может использоваться с именем столбца или его порядковым положением.
SQL | JDBC / Java | SetXXX | getXXX |
---|---|---|---|
VARCHAR | java.lang.String | SetString | GetString |
CHAR | java.lang.String | SetString | GetString |
LONGVARCHAR | java.lang.String | SetString | GetString |
НЕМНОГО | логический | setBoolean | getBoolean |
NUMERIC | java.math.BigDecimal | setBigDecimal | getBigDecimal |
TINYINT | байт | setByte | GetByte |
SMALLINT | короткая | setShort | getShort |
INTEGER | ИНТ | SetInt | GetInt |
BIGINT | долго | setLong | getLong |
РЕАЛЬНЫЙ | поплавок | SetFloat | GetFloat |
FLOAT | поплавок | SetFloat | GetFloat |
DOUBLE | двойной | setDouble | getDouble |
VARBINARY | байт [] | setBytes | GetBytes |
BINARY | байт [] | setBytes | GetBytes |
ДАТА | java.sql.Date | SETDATE | GetDate |
ВРЕМЯ | java.sql.Time | установленное время | GetTime |
TIMESTAMP | java.sql.Timestamp | setTimestamp | getTimestamp |
CLOB | java.sql.Clob | setClob | getClob |
большой двоичный объект | java.sql.Blob | setBlob | getBlob |
ARRAY | java.sql.Array | setARRAY | GetArray |
REF | java.sql.Ref | SetRef | getRef |
STRUCT | java.sql.Struct | SetStruct | getStruct |
JDBC — Пакетная обработка:
Пакетная обработка позволяет группировать связанные операторы SQL в пакет и отправлять их одним вызовом в базу данных.
Когда вы отправляете несколько операторов SQL в базу данных одновременно, вы сокращаете объем коммуникационных накладных расходов, тем самым повышая производительность.
-
Драйверы JDBC не обязаны поддерживать эту функцию. Вы должны использовать метод DatabaseMetaData.supportsBatchUpdates (), чтобы определить, поддерживает ли целевая база данных обработку пакетного обновления. Метод возвращает true, если ваш драйвер JDBC поддерживает эту функцию.
-
Метод addBatch () операторов Statement, PreparedStatement и CallableStatement используется для добавления отдельных операторов в пакет. ExecuteBatch () используется для запуска выполнения всех операторов, сгруппированных вместе.
-
ExecuteBatch () возвращает массив целых чисел, и каждый элемент массива представляет счетчик обновлений для соответствующего оператора обновления.
-
Так же, как вы можете добавить операторы в пакет для обработки, вы можете удалить их с помощью метода clearBatch () . Этот метод удаляет все операторы, которые вы добавили с помощью метода addBatch (). Тем не менее, вы не можете выборочно выбрать, какой оператор удалить.
Драйверы JDBC не обязаны поддерживать эту функцию. Вы должны использовать метод DatabaseMetaData.supportsBatchUpdates (), чтобы определить, поддерживает ли целевая база данных обработку пакетного обновления. Метод возвращает true, если ваш драйвер JDBC поддерживает эту функцию.
Метод addBatch () операторов Statement, PreparedStatement и CallableStatement используется для добавления отдельных операторов в пакет. ExecuteBatch () используется для запуска выполнения всех операторов, сгруппированных вместе.
ExecuteBatch () возвращает массив целых чисел, и каждый элемент массива представляет счетчик обновлений для соответствующего оператора обновления.
Так же, как вы можете добавить операторы в пакет для обработки, вы можете удалить их с помощью метода clearBatch () . Этот метод удаляет все операторы, которые вы добавили с помощью метода addBatch (). Тем не менее, вы не можете выборочно выбрать, какой оператор удалить.
JDBC — потоковые данные:
Объект PreparedStatement имеет возможность использовать входные и выходные потоки для предоставления данных параметров. Это позволяет помещать целые файлы в столбцы базы данных, которые могут содержать большие значения, такие как типы данных CLOB и BLOB.
Существуют следующие методы, которые можно использовать для потоковой передачи данных:
-
setAsciiStream (): Этот метод используется для предоставления больших значений ASCII.
-
setCharacterStream (): этот метод используется для предоставления больших значений UNICODE.
-
setBinaryStream (): этот метод используется для предоставления больших двоичных значений.
setAsciiStream (): Этот метод используется для предоставления больших значений ASCII.
setCharacterStream (): этот метод используется для предоставления больших значений UNICODE.
setBinaryStream (): этот метод используется для предоставления больших двоичных значений.
Метод setXXXStream () требует наличия дополнительного параметра, размера файла, помимо параметра-заполнителя. Этот параметр сообщает драйверу, сколько данных должно быть отправлено в базу данных с использованием потока.
Для получения подробной информации обо всех этих концепциях вам необходимо пройти полное руководство.