Учебники

JDBC — Краткое руководство

JDBC расшифровывается как J ava D ata base Cnectivity, который является стандартным Java API для независимой от базы данных связи между языком программирования Java и широким спектром баз данных.

Библиотека JDBC включает API для каждой из задач, обычно связанных с использованием базы данных:

  • Создание соединения с базой данных

  • Создание операторов SQL или MySQL

  • Выполнение этих запросов SQL или MySQL в базе данных

  • Просмотр и изменение полученных записей

Создание соединения с базой данных

Создание операторов SQL или MySQL

Выполнение этих запросов SQL или MySQL в базе данных

Просмотр и изменение полученных записей

Pre-Реквизит:

Для изучения JDBC необходимо хорошее понимание следующих двух предметов:

Core JAVA Программирование

База данных SQL или MySQL

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 () требует наличия дополнительного параметра, размера файла, помимо параметра-заполнителя. Этот параметр сообщает драйверу, сколько данных должно быть отправлено в базу данных с использованием потока.

Для получения подробной информации обо всех этих концепциях вам необходимо пройти полное руководство.