Artikel ini menjelaskan pengetahuan dan keterampilan dasar JDBC beserta contohnya. Bagikan dengan semua orang untuk referensi Anda. Analisis spesifiknya adalah sebagai berikut:
1. Apa itu JDBC?
Dalam istilah awam, teknologi JDBC menggunakan program Java untuk mengirim pernyataan SQL ke database. Database mengeksekusi pernyataan SQL setelah menerimanya, dan mengembalikan hasilnya ke program Java untuk dikelola.
2. Apa saja syarat penggunaan JDBC?
A) Alamat host basis data target
B) Nomor port yang ditempati oleh perangkat lunak database pada host
C) Nama pengguna yang digunakan untuk login ke database
D) Kata sandi untuk nama pengguna itu
E) Hubungkan ke basis data
3.Prinsip teknologi JDBC
Kita tahu bahwa ada berbagai jenis database, dan standar serta spesifikasi database yang dihasilkan oleh produsen berbeda berbeda-beda. Saat ini, jika kita menggunakan kode JAVA untuk mengirim pernyataan SQL, kita harus menulis kumpulan demi kumpulan berdasarkan database yang berbeda. Seperangkat kode operasi, yang merupakan biaya pengembangan yang sangat besar bagi pengembang program, jadi SU Ketika Perusahaan N mengembangkan teknologi JDBC, ia menetapkan seperangkat antarmuka standar. Produsen basis data harus menyediakan driver untuk mengimplementasikan rangkaian antarmuka ini. Kemudian, selama pengembang program menggunakan driver basis data selama pengembangan, mereka harus menggunakan metode yang konsisten . Untuk mengembangkan, tidak perlu menulis sekumpulan kode untuk beradaptasi dengan database yang berbeda.
4. API Inti di JDBC
|- Driver: Antarmuka yang diimplementasikan oleh kelas driver.
|-Connection connect(String url, Properties info) --digunakan untuk terhubung ke database dan mendapatkan objek koneksi
Parameter yang perlu diatur di Properties:
url: string URL koneksi database. Protokol+subprotokol basis data+host+port+database
pengguna: nama pengguna basis data
kata sandi: kata sandi pengguna
|-Connection: antarmuka untuk terhubung ke database
|- Pernyataan createStatement() --Buat objek Pernyataan untuk mengirimkan pernyataan sql
|- PreparedStatement prepStatement(String sql) - Membuat objek PreparedStatement untuk mengirimkan pernyataan sql yang telah dikompilasi sebelumnya
|-CallableStatement prepCall(String sql) --Buat objek CallableStatement untuk memanggil prosedur tersimpan.
|-Statement: digunakan untuk mengeksekusi pernyataan sql statis
|-int mengeksekusiUpdate(String sql) --Jalankan operasi pembaruan (DDL+DML)
|-ResultSet mengeksekusiQuery(String sql) --Jalankan operasi kueri (DQL)
|- PreparedStatement: digunakan untuk mengeksekusi pernyataan sql yang telah dikompilasi sebelumnya
|- int mengeksekusiUpdate() -- melakukan operasi pembaruan
|- ResultSet mengeksekusiQuery() -- Menjalankan operasi kueri
|- CallableStatement: sql digunakan untuk menjalankan prosedur tersimpan
|- ResultSet mengeksekusiQuery() --Panggil prosedur tersimpan
|- ResultSet: Kumpulan hasil. Digunakan untuk merangkum data kueri database
|- boolean next() --Pindahkan kursor rekaman ke baris berikutnya
|- Objek getObject(int ColumnIndex) -- Mendapatkan nilai bidang
Setelah memahami API yang mana, mari gunakan JDBC untuk mengirim pernyataan SQL~
5. Gunakan objek Pernyataan untuk mengoperasikan database
Operasi DDL dan DML
Langkah 1
Impor paketnya, karena saya menggunakan database MySQL, jadi untuk menggunakan teknologi JDBC harus menggunakan driver database yang disediakan oleh produsen database MySQL, oleh karena itu langkah pertama yang harus dilakukan adalah mengimpor paket driver database ke dalam proyek.
Nama paket yang digunakan: mysql-connector-java-5.1.7-bin.jar
Langkah 2
Buat kelas biasa, tambahkan metode di dalamnya, dan salin kode dalam metode sebagai berikut: //URL
pribadi String url = "jdbc:mysql://localhost:3306/vmaxtam";
//pengguna
String pribadi pengguna = "root";
//kata sandi
kata sandi String pribadi = "root";
public void testDDL()melemparkan Pengecualian{
//1.Daftarkan driver
Kelas.forName("com.mysql.jdbc.Driver");
//2. Dapatkan koneksinya
Sambungan koneksi = DriverManager.getConnection(url, pengguna, kata sandi);
//3. Buat objek Pernyataan
Pernyataan stmt = samb.createStatement();
//4. Siapkan pernyataan sql
String sql = "BUAT TABEL siswa(sid INT PRIMARY KEY,sname VARCHAR(20),age INT)";
//5. Kirim pernyataan sql melalui objek pernyataan dan kembalikan hasil eksekusi
int hitungan = stmt.executeUpdate(sql);
//6.Cetak hasil eksekusi
System.out.println("Catatan "+hitungan+" yang terpengaruh");
}
//7. Tutup sumber daya
jika(pernyataan!=batal)
{
pernyataan.close();
}
jika(sambungan!=batal)
{
samb.close();
}
Jika Anda ingin melakukan operasi DQL dan DDL, Anda dapat menulis pernyataan SQL dan kemudian memanggil metode execulUpdate pernyataan tersebut untuk mengeksekusi pernyataan SQL untuk database. Metode ini mengembalikan nilai integer yang menunjukkan berapa banyak baris dalam database yang terpengaruh.
Jika kita tidak mengubah program di atas dan ingin mengeluarkan pernyataan SQL ke database lagi, maka kita harus menulis program untuk menghubungkan lagi, dan setelah operasi, kita harus menutup objek pernyataan dan objek koneksi, yang sangat rumit. . Oleh karena itu, kami biasanya mengekstrak proses koneksi dan proses pelepasan objek ke dalam kelas alat. Kode di kelas alat adalah sebagai berikut:
Salin kode sebagai berikut: public class sqlUtil {
string statis pribadi url = "jdbc:mysql://localhost:3306/vmaxtam";
String statis pribadi pengguna = "root";
kata sandi String statis pribadi = "root";
// Dapatkan koneksi
getconnection Koneksi statis publik() {
Sambungan koneksi = null;
mencoba {
// 1. Daftarkan pengemudi
Kelas.forName("com.mysql.jdbc.Driver");
// 2. Dapatkan koneksinya
samb = DriverManager.getConnection(url, pengguna, kata sandi);
// 3. Dapatkan objek pernyataan
Pernyataan pernyataan = conn.createStatement();
} tangkapan (Pengecualian e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
koneksi kembali;
}
// 7. Tutup sumber daya
public static void close(Pernyataan pernyataan, Koneksi koneksi) {
{
mencoba {
jika (pernyataan!= nol)
pernyataan.close();
if (koneksi != null) {
koneksi.close();
}
} tangkapan (SQLException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
}
}
}
Hal-hal yang perlu dipertimbangkan adalah:
1) Pengguna hanya perlu mendaftarkan driver satu kali. Tidak perlu mendaftarkan driver setiap kali terhubung ke database, jadi kami menulis proses mendaftarkan driver dalam blok kode statis.
2) URL, nama pengguna, kata sandi, dan nama kelas driver dikodekan dalam program agar dapat mengubah database atau pengguna tanpa mengubah kode, kami biasanya menulis informasi ini ke dalam file konfigurasi.
File konfigurasi ditulis di direktori src proyek dan diberi nama db.properties
Salin kode sebagai berikut: url=jdbc:mysql://localhost:3306/vmaxtam
pengguna=akar
kata sandi=akar
driverClass=com.mysql.jdbc.Drive
Kemudian baca file konfigurasi di sqlUtil, dan terakhir optimalkan ke dalam kode berikut. Salin kode seperti berikut: public class sqlUtil {
url String statis pribadi = null;
pengguna String statis pribadi = null;
kata sandi String statis pribadi = null;
Kelas driver String statis pribadi= null;
statis{
mencoba {
//1. Dapatkan objek bytecode
Classclazz = sqlUtil.kelas;
//2. Panggil getResourceAsStream untuk mendapatkan jalurnya
InputStream inputStream = clazz.getResourceAsStream("/db.properties");
Properti pro = Properti baru();
pro.load(inputStream);
//3. Baca parameter
url=pro.getProperty("url");
kata sandi=pro.getProperty("kata sandi");
pengguna=pro.getProperty("pengguna");
driverClass=pro.getProperty("driverClass");
Kelas.forName(driverClass);
} tangkapan (Pengecualian e) {
e.printStackTrace();
System.out.println("Pendaftaran gagal!" + e.getMessage());
melempar RuntimeException(e);
}
}
// Dapatkan koneksi
getconnection Koneksi statis publik() {
Sambungan koneksi = null;
mencoba {
// Dapatkan koneksi
samb = DriverManager.getConnection(url, pengguna, kata sandi);
// Dapatkan objek pernyataan
Pernyataan pernyataan = conn.createStatement();
} tangkapan (Pengecualian e) {
e.printStackTrace();
}
koneksi kembali;
}
// Tutup sumber daya
public static void close(Pernyataan pernyataan, Koneksi koneksi) {
{
mencoba {
jika (pernyataan!= nol)
pernyataan.close();
if (koneksi != null) {
koneksi.close();
}
} tangkapan (SQLException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
}
}
}
Operasi DQL
Jadi bagaimana cara menggunakan JDBC untuk menanyakan data dalam database?
Copy kode kodenya sebagai berikut: @Test
public void testdsl() melempar Pengecualian {
//Dapatkan koneksi
cnn2=sqlUtil.getconnection();
Pernyataan pernyataan = cnn2.createStatement();
//Siapkan pernyataan SQL
String sql = "pilih * dari subjek";
//Panggil mengeksekusiQuery untuk mengeksekusi pernyataan query
ResultSet res = pernyataan.executeQuery(sql);
//Setelah query selesai, res akan menunjuk ke header tabel. Jika ingin mendapatkan data, Anda harus terus menunjuk ke baris berikutnya dari hasil query.
while(res.next())
{
//Dapatkan nilai field "sjid" di hasil query, dan pastikan tipenya jelas
int id = res.getInt("sjid");
//Dapatkan nilai field "sjname" pada hasil query, dan tipenya harus jelas
String nama = res.getString("sjname");
System.out.println("ID:" + id + "NAMA:" + nama);
}
sqlUtil.close(pernyataan, cnn2);
}
Di atas adalah penggunaan objek Pernyataan untuk mengoperasikan database~
6. Gunakan PreparedStatement untuk mengoperasikan database
Objek PreparedStatement sebenarnya adalah objek Pernyataan khusus yang dapat melakukan prakompilasi pernyataan SQL. Saat Anda mengatur parameter, Anda kemudian dapat mengeksekusi pernyataan SQL~
Kode penyalinan operasi DDL dan DML adalah sebagai berikut: paket com.vmaxtam.sqltest;
impor java.sql.Koneksi;
impor java.sql.PreparedStatement;
import org.junit.Test;
kelas publik PreparedStatementTest {
Koneksi koneksi = null;
@Tes
public void ddldmlTest() memunculkan Pengecualian {
// 1. Dapatkan koneksinya
koneksi = sqlUtil.getconnection();
// 2. Siapkan pernyataan SQL, pernyataan yang telah dikompilasi, dan parameter? Pengganti nomor
String sql = "MASUKKAN KE DALAM NILAI SUBJEK(?,?)";
// 3. Ambil objeknya
PreparedStatement PreparedStatement = koneksi.prepareStatement(sql);
/*
* 4. Untuk mengatur parameter SQL, Anda perlu mengetahui nomor parameter dan mengetahui tipenya. Kalimat pertama di bawah ini menunjukkan: parameter pertama dari pernyataan SQL bertipe int, dan nilai parameter disetel ke 3, dan seterusnya. pada.
*/
readyStatement.setInt(1, 3);
readyStatement.setString(2, "Bahasa Inggris");
// 5. Serahkan ke database untuk mengeksekusi SQL
int angka = readyStatement.executeUpdate();
System.out.println("Ada" + num + "data terpengaruh");
sqlUtil.close(preparedStatement, koneksi);
}
}
Cara di atas adalah dengan menggunakan objek PreparedStatement untuk mengirim pernyataan penyisipan. Dengan cara yang sama, pernyataan DDL dan DML dapat dikirim dengan cara ini.
Manfaat prakompilasi PreparedStatement:
Prakompilasi dari PreparedStatement memungkinkan Anda untuk menanyakan target yang berbeda dengan mengatur parameter yang berbeda. Di sisi database, hanya pernyataan yang telah dikompilasi sebelumnya yang akan disimpan, tetapi jika Anda menggunakan Pernyataan untuk mengirim pernyataan, setiap kali pernyataan dikirim, pernyataan tersebut akan disimpan di dalam. database. , yang mungkin memakan banyak memori.
Kode kode penyalinan operasi DQL adalah sebagai berikut: @Test
public void dqlTest() memunculkan Pengecualian {
// 1. Dapatkan koneksinya
koneksi = sqlUtil.getconnection();
// 2. Siapkan pernyataan SQL, pernyataan yang telah dikompilasi, dan parameter? Pengganti nomor
String sql = "pilih * dari subjek dimana sjid=? atau sjname=?";
// 3. Ambil objeknya
PreparedStatement PreparedStatement = koneksi.prepareStatement(sql);
/*
* 4. Untuk mengatur parameter SQL, Anda perlu mengetahui nomor parameter dan mengetahui tipenya. Kalimat pertama di bawah ini menunjukkan: parameter pertama dari pernyataan SQL bertipe int, dan nilai parameter disetel ke 3, dan seterusnya. pada.
*/
readyStatement.setInt(1, 2);
readyStatement.setString(2, "Cina");
// 5. Serahkan ke database untuk mengeksekusi SQL
ResultSet pertama = readyStatement.executeQuery();
//6.Iterasi kumpulan hasil
while(pertama.berikutnya())
{
int id = pertama.getInt("sjid");
String nama = pertama.getString("sjname");
System.out.println("ID:" + id + "NAMA:" + nama);
}
//7. Tutup koneksi
sqlUtil.close(preparedStatement, koneksi);
}
Anda juga dapat memanggil metode mengeksekusiQuery(); dan mengulangi output setelah mendapatkan hasil yang ditetapkan~
Karena Statement dan PreparedStatement sangat mirip, mari kita bandingkan kelebihan dan kekurangannya~
Perbedaan antara Pernyataan dan PreparedStatement:
1. Tata bahasa yang berbeda
Pernyataan hanya mendukung kompilasi statis, dan pernyataan SQL dikodekan secara keras.
PreparedStatement mendukung pra-kompilasi, gunakan? Datang dan duduklah.
2. Efisiensi yang berbeda
Pernyataan mengirimkan pernyataan SQL setiap saat, tidak mendukung caching, dan memiliki efisiensi eksekusi yang rendah.
PreparedStatement mendukung pra-kompilasi dan disimpan dalam cache di database. Ia hanya perlu mengirim parameter, dan efisiensi eksekusinya cepat.
3. Keamanan berbeda
Pernyataan mudah disuntikkan.
Injeksi: Elemen licik dapat menulis pernyataan SQL khusus untuk mengkompromikan database.
Misalnya: Untuk menanyakan informasi pengguna tertentu
Situasi umum: SELECT * FROM user_list di mana nama pengguna=xxx dan kata sandi=xxx (xxx di sini harus mengisi nama pengguna dan kata sandi pengguna sendiri)
Situasi injeksi: SELECT * FROM user_list di mana nama pengguna='abc' atau 1=1 -- kata sandi=xxx;
Dengan cara ini, 1=1 sama, dan tanda "--" ditambahkan sebelum kata sandi, dan konten berikut menjadi komentar dan tidak akan dieksekusi. Dengan kata lain, semua informasi pengguna dapat ditanyakan tanpa kata sandi.
PreparedStatement, karena menentukan parameter dalam pernyataan SQL, dapat mencegah injeksi.
Kesimpulan: Disarankan untuk menggunakan PreparedStatement karena lebih cepat dan aman .
7. Gunakan CallableStatement untuk menjalankan prosedur tersimpan
Menggunakan CallableStatement hanya menjalankan prosedur tersimpan. Untuk membuat prosedur tersimpan, kita masih harus membuatnya di database.
Langkah 1
Sekarang database telah membuat prosedur tersimpan:
Copy kode kode sebagai berikut : DELIMITER$
BUAT PROSEDUR pro_add( DALAM a INT , DALAM b VARCHAR(20), KELUAR c INT)
MULAI
PILIH * DARI SUBJEK DIMANA sjid=a ATAU sjname=b;
TETAPKAN c=a+a+a+a;
AKHIR $
Langkah 2
Gunakan kode Java untuk mengeksekusi dan mendapatkan parameter output. Salin kode sebagai berikut: @Test
public void calaST() melempar Pengecualian {
//Dapatkan koneksi
koneksi= sqlUtil.getconnection();
//Siapkan pernyataan SQL
String sql = "PANGGILAN pro_add(?,?,?)";
//Dapatkan objek callableStatement
CallableStatement cbs = koneksi.prepareCall(sql);
//Atur parameter input, sama seperti PrepareStatement
cbs.setInt(1, 3);
cbs.setString(2, "Matematika");
/*Jadi bagaimana cara mengatur parameter keluaran?
* Perlu mendaftarkan parameter keluaran!
*/
cbs.registerOutParameter(3, java.sql.Types.INTEGER);//Anda perlu menggunakan objek bawaan untuk menyetel tipe parameter
//Jalankan pernyataan SQL
cbs.executeQuery();
//Gunakan metode getXXX untuk mendapatkan parameter keluaran dari posisi yang sesuai
Bilangan bulat= cbs.getInt(3);
System.out.println("a*4 adalah " + angka);
//Tutup sumber daya
sqlUtil.close(cbs, koneksi);
}
Saya harap artikel ini bermanfaat untuk pemrograman Java semua orang.