Apa itu JDBC? Pengenalan Kesambungan Pangkalan Data Java

JDBC (Java Database Connectivity) adalah Java API yang mengatur penyambungan ke pangkalan data, mengeluarkan pertanyaan dan perintah, dan menangani set hasil yang diperoleh dari pangkalan data. Dilancarkan sebagai sebahagian dari JDK 1.1 pada tahun 1997, JDBC adalah salah satu komponen pertama yang dikembangkan untuk lapisan kegigihan Java.

JDBC pada awalnya disusun sebagai API sisi klien, yang memungkinkan klien Java berinteraksi dengan sumber data. Itu berubah dengan JDCB 2.0, yang merangkumi pakej pilihan yang menyokong sambungan JDBC sisi pelayan. Setiap keluaran JDBC baru sejak itu mempunyai kemas kini untuk kedua-dua pakej sisi pelanggan ( java.sql) dan pakej sisi pelayan ( javax.sql). JDBC 4.3, versi terbaru dari penulisan ini, dikeluarkan sebagai bagian dari Java SE 9 pada bulan September 2017.

Artikel ini menyajikan gambaran keseluruhan JDBC, diikuti dengan pengenalan langsung untuk menggunakan JDBC API untuk menghubungkan klien Java dengan SQLite, pangkalan data hubungan ringan.

Bagaimana JDBC berfungsi

Dikembangkan sebagai alternatif untuk ODBC (Open Database Connectivity) API berbasis C, JDBC menawarkan antara muka tahap pengaturcaraan yang menangani mekanik aplikasi Java yang berkomunikasi dengan pangkalan data atau RDBMS. Antara muka JDBC terdiri daripada dua lapisan:

  1. API JDBC menyokong komunikasi antara aplikasi Java dan pengurus JDBC.
  2. Pemacu JDBC menyokong komunikasi antara pengurus JDBC dan pemacu pangkalan data.

JDBC adalah API umum yang berinteraksi dengan kod aplikasi anda. Di bawahnya adalah pemacu yang mematuhi JDBC untuk pangkalan data yang anda gunakan.

Gambar 1 adalah gambaran umum seni bina JDBC di lapisan kegigihan Java.

JavaWorld /

Menggunakan JDBC untuk menyambung ke pangkalan data

Salah satu fakta pemrograman yang beruntung dalam ekosistem Java ialah anda mungkin akan menemui penyambung pangkalan data JDBC yang stabil untuk apa sahaja pangkalan data yang anda pilih. Dalam tutorial ini kita akan menggunakan SQLite untuk mengenal JDBC, terutamanya kerana sangat mudah digunakan.

Langkah-langkah untuk menyambung ke pangkalan data dengan JDBC adalah seperti berikut:

  1. Pasang atau cari pangkalan data yang ingin anda akses.
  2. Sertakan perpustakaan JDBC.
  3. Pastikan pemacu JDBC yang anda perlukan ada di jalan kelas anda.
  4. Gunakan perpustakaan JDBC untuk mendapatkan sambungan ke pangkalan data.
  5. Gunakan sambungan untuk mengeluarkan arahan SQL.
  6. Tutup sambungan apabila anda selesai.

Kami akan melalui langkah-langkah ini bersama-sama.

Mencari pemacu JDBC

Untuk mencari pemacu untuk pangkalan data yang ingin anda gunakan, lakukan carian web untuk pangkalan data anda dan JDBC. Sebagai contoh, menaip " mysql jdbc driver" akan menjadikan pemacu MySQL. Saya mencabar anda untuk mencari pangkalan data yang sesuai dengan Java tanpa pemacu JDBC!

Langkah 1. Muat turun dan pasang SQLite

SQLite adalah pangkalan data yang sangat padat. Ia tidak bertujuan untuk penggunaan produksi, tetapi merupakan pilihan terbaik untuk mencuba sesuatu dengan cepat. SQLite menggunakan fail sebagai pangkalan data fungsinya, tanpa memerlukan perkhidmatan atau pemasangan daemon.

Untuk memulakan demo ini, teruskan dan muat turun pangkalan data sampel SQLite. Buka zip .dbfail dan simpan di tempat yang tidak akan anda lupakan.

Fail ini mengandungi pangkalan data berasaskan fail berfungsi dan skema sampel serta data yang dapat kita gunakan.

SQL dan JDBC

NoSQL telah menjadi popular sejak sedekad yang lalu, tetapi pangkalan data hubungan tetap merupakan jenis datastore yang paling biasa digunakan. A pangkalan data hubungan adalah sebuah gedung berstruktur terdiri daripada jadual dengan lajur dan baris. SQL (Structured Query Language) adalah bahasa yang digunakan oleh arkitek untuk melakukan perkara seperti membuat, membaca, mengemas kini, dan menghapus rekod baru dalam pangkalan data hubungan. JDBC adalah lapisan penyesuai dari Java ke SQL: ia memberikan pemaju Java antara muka yang sama untuk menyambung ke pangkalan data, mengeluarkan pertanyaan dan perintah, dan mengelola respons.

Langkah 2. Import JDBC ke aplikasi Java anda

Kita boleh melakukan pengekodan dalam IDE, tetapi pengekodan secara langsung dalam penyunting teks akan menunjukkan kesederhanaan JDBC dengan lebih baik. Untuk memulakan, anda perlu mempunyai pemasangan JDK yang serasi untuk sistem operasi anda.

Dengan andaian anda memasang alat pembangun platform Java, kita dapat mulai dengan membuat program Java yang sederhana. Dalam penyunting teks anda, tampal kod yang ditunjukkan dalam Penyenaraian 1. Hubungi fail ini WhatIsJdbc.java.

Penyenaraian 1. Program Java yang sederhana

 class WhatIsJdbc{ public static void main(String args[]){ System.out.println("Hello JavaWorld"); } } 

Sekarang menyusun kod dengan memasukkan arahan: javac WhatIsJdbc.java. Menyusun akan mengeluarkan WhatIsJdbc.classfail. Melaksanakan fail ini daripada baris arahan dengan panggilan: java WhatIsJdbc.

[Lihat "Apa itu JDK? Pengenalan Java Developer Kit" untuk lebih lanjut mengenai berinteraksi dengan JDK pada baris perintah.]

Setelah anda mempunyai program Java asas, anda boleh memasukkan perpustakaan JDBC. Tempelkan kod dari Penyenaraian 2 di kepala program Java ringkas anda.

Penyenaraian 2. JDBC import

 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Statement; 

Setiap import ini memberikan akses ke kelas yang memudahkan sambungan pangkalan data Java standard:

  • Connection mewakili sambungan ke pangkalan data.
  • DriverManagermemperoleh sambungan ke pangkalan data. (Pilihan lain adalah DataSource, digunakan untuk penyatuan sambungan.)
  • SQLException menangani ralat SQL antara aplikasi Java dan pangkalan data.
  • ResultSetdan Statementmemodelkan set hasil data dan pernyataan SQL.

Kami akan melihat masing-masing dalam tindakan sebentar lagi.

Langkah 3. Tambahkan pemacu JDBC ke jalan kelas anda

Seterusnya, anda akan menambah pemacu SQLite ke jalan kelas anda. A pemandu JDBC adalah kelas yang melaksanakan API JDBC untuk pangkalan data tertentu.

Muat turun pemacu SQLite dari GitHub. Pastikan anda mendapatkan .jarfail terbaru dan simpan di tempat yang anda akan ingat.

The next time you execute your Java program, you will pull that .jar file in via the classpath. There are several ways to set the classpath. Listing 3 shows how to do it using a command-line switch.

Listing 3. Executing SQLite driver on the Java classpath

 java.exe -classpath /path-to-driver/sqlite-jdbc-3.23.1.jar:. WhatIsJdbc 

Notice that we've set the classpath to point at the driver and the local directory; this way Java will still find our class file.

Step 4. Obtain a database connection

The classpath now has access to the driver. Now, change your simple Java application file to look like the program in Listing 4.

Listing 4. Using the JDBC Connection class to connect to SQLite

 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Statement; class WhatIsJdbc{ public static void main(String[] args) { Connection conn = null; try { String url = "jdbc:sqlite:path-to-db/chinook/chinook.db"; conn = DriverManager.getConnection(url); System.out.println("Got it!"); } catch (SQLException e) { throw new Error("Problem", e); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException ex) { System.out.println(ex.getMessage()); } } } } 

Compile and execute this code. Assuming all goes well, you will get an affirming message.

No suitable driver found?

If you've received an error that looks like "No suitable driver found for jdbc:sqlite," then you need to revisit the classpath and make sure it points to the driver you downloaded. Failed driver connection is the most common stumbling block for beginners using JDBC. Don't sweat it; just fix it.

Now we're ready for some SQL commands.

Step 5. Query the database

With the live connection object in hand, we can do something useful, like querying the database. Listing 5 shows how to query SQLite using the JDBC Connection and Statement objects.

Listing 5. Querying the database with JDBC

 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Statement; class WhatIsJdbc{ public static void main(String[] args) { Connection conn = null; try { String url = "jdbc:sqlite:path-to-db-file/chinook/chinook.db"; conn = DriverManager.getConnection(url); Statement stmt = null; String query = "select * from albums"; try { stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(query); while (rs.next()) { String name = rs.getString("title"); System.out.println(name); } } catch (SQLException e ) { throw new Error("Problem", e); } finally { if (stmt != null) { stmt.close(); } } } catch (SQLException e) { throw new Error("Problem", e); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException ex) { System.out.println(ex.getMessage()); } } } } 

In Listing 5 we use our Connection object to obtain a Statement object: conn.createStatement(). We then use this object to execute an SQL query: stmt.executeQuery(query).

The executeQuery command returns a ResultSet object, which we then use to iterate over the data with while (rs.next()). In this example, you should see the album titles we've queried on as output.

Notice that we also closed the connection, via a call to conn.close().

Network connections with JDBC

The database connection string in Listing 5 is for a local connection: jdbc:sqlite:path-to-db-file/chinook/chinook.db. To access the database via a network, the connection string would need to include the network URL and (usually) credentials for accessing it.

Doing more with JDBC

So far we've covered the basics of using JDBC to connect to a database and issue SQL commands. While Statementss and ResultSets work well for common scenarios, you'll likely need additional options for larger or more complex applications. Fortunately, the JDBC library continues evolving to meet most database access needs.

PreparedStatements

One easy way to increase the flexibility of your code is to replace the Statement class with PreparedStatement, as shown in Listing 6.

Listing 6. Using JDBC PreparedStatements

 String prepState = "insert into albums values (?, ?);"; PreparedStatement prepState = connection.prepareStatement(sql); prepState.setString(1, "Uprising"); prepState.setString(2, "Bob Marley and the Wailers "); int rowsAffected = preparedStatement.executeUpdate(); 

PreparedStatement replaces Statement's hard-coded values with question marks (?). Using PreparedStatements optimizes your code for reuse: a PreparedStatement is compiled only once, and can then be reused with a variety of parameters. As your code base grows, you simply insert new values into the statement, instead of hacking the string object itself.

Batch updates

Whenever an application has several updates to issue, doing them in batches can greatly benefit performance. The essence of batching is to take the multiple updates and collect them together, then issue them all at once. Listing 7 uses JDBC's batch methods to perform a batch update of several PreparedStatements.

Listing 7. Batching with PreparedStatement

 prepState.setString(1, "Uprising"); prepState.setString(2, "Bob Marley and the Wailers"); preparedStatement.addBatch(); prepState.setString(1, "Wildflowers"); prepState.setString(2, "Tom Petty and the Heartbreakers"); preparedStatement.addBatch(); int[] rowsAffected = preparedStatement.executeBatch(); 

JDBC transactions

Transactions in relational databases allow for a set of updates to be wrapped in an interaction that either succeeds or fails altogether. The basics of using a transaction via JDBC are to tell the system to turn off auto-commit, and then manually tell the system to commit when you are done. By default, auto-commit is on, which means whenever an executeUpdate or executeInsert is run, the command is committed.

Listing 8 shows a small slice of a JDBC transaction.

Listing 8. JDBC transactions

 connection.setAutoCommit(false); // Use executeUpdate multiple times connection.commit(); 

When connection.commit() is encountered, all the updates wrapped inside will be attempted, and if any fail, they all will be rolled back.

There are many more features in JDBC 4.3 worth exploring, including using CallableStatement for stored procedures, using DataSource objects for improved application performance (especially via connection pooling), and converting a JDBC ResultSet to a Java Stream.

Database-specific features

Although every JDBC-compliant database offers the same core features for connecting and interacting with a database via SQL, some databases do more than others. As an example, Oracle DB offers result caching, which is not required by the JDBC specification. Here's an example:

 conn.prepareStatement ("select /*+ result_cache */ * from employees where employee_id < : 1"); 

This example is taken from the documentation for Oracle's JDBC OCI Driver.

Conclusion

JDBC is one of Java's oldest APIs, providing an easy-to-use solution for one of the perennial needs of Java application development. Knowing just the few JDBC calls demonstrated in this article will get you started using JDBC to connect to virtually any database. Once you've got those commands down, you can begin to explore some of the more sophisticated options that have been built into JDBC.

Walaupun JDBC cukup untuk aplikasi yang lebih sederhana, kebanyakan pembangun akhirnya akan melihat Java Persistence API (JPA) untuk mengembangkan lapisan akses data yang lebih formal. JPA memerlukan kerja yang lebih awal dan pemahaman yang lebih canggih mengenai seni bina aplikasi, tetapi ia memberi anda lapisan akses data yang lebih konsisten, terpencil dan jelas Lihat pendamping artikel ini, "Apa itu JPA? Pengantar Java Persistence API" untuk lebih lanjut mengenai pengembangan lapisan ketekunan data untuk aplikasi Java Anda.

Kisah ini, "Apa itu JDBC? Pengantar Java Database Connectivity" pada awalnya diterbitkan oleh JavaWorld.