Sayangnya, saya sudah lama tidak menulis apa pun. Karena alasan kerja, saya bersentuhan dengan kerangka kerja ORM yang mendasari yang dikembangkan oleh perusahaan. Saya secara tidak sengaja menemukan bahwa ketika memanggil operasi JDBC, kerangka kerja mengacu pada SimpleJdBctemplate di Hibernate. Di sini saya memikirkan enkapsulasi JDBC sederhana yang saya gunakan ketika saya masih kuliah. Sekarang saya akan memposting kode dan membaginya dengan Anda:
Kelas Config: Baca file konfigurasi koneksi basis data di bawah paket yang sama, sehingga lebih baik untuk pertimbangan generalisasi.
Paket com.tly.dbutil; import java.io.ioException; impor java.util.properties; config kelas publik {private static properties prop = new properties (); static {try {// muat dbconfig.properties file konfigurasi prop.load (config.class.getResourceAsstream ("dbconfig.properties")); } catch (ioException e) {// TODO AUTO-ENCEALATED Catch Block E.PrintStackTrace (); }} // atur string akhir public static public class_name = prop.getProperty ("class_name"); public static final string database_url = prop.getProperty ("database_url"); string final public static server_ip = prop.getProperty ("server_ip"); string final public static server_port = prop.getProperty ("server_port"); public static final string database_sid = prop.getProperty ("database_sid"); Public Static Final String username = prop.getProperty ("username"); public static final string password = prop.getProperty ("password"); }dbconfig.properties: File konfigurasi basis data, Anda juga dapat menggunakan format XML, dll., Perhatikan lokasi panggilan file di kelas konfigurasi
Class_name = com.mysql.jdbc.driverdatabase_url = jdbc: mysqlserver_ip = localhostserver_port = 3306database_sid = karyawanSername = rootpassword = 1
Berikutnya adalah Koneksi Database Kelas Auxiliary DBConn
Paket com.employees.dbutil; impor java.sql.connection; impor java.sql.driverManager; impor java.sql.preparedstatement; impor java.sql.resultset; koreksi java. Private PrepsiedStatement PSTMT = NULL; Hasil pribadi rs = null; // Empat metode // Method1: Buat koneksi ke database koneksi publik getConntion () {coba {// 1: Muat driver koneksi, java reflection principle class.forname (config.class_name); // 2: Buat objek antarmuka koneksi untuk mendapatkan objek koneksi dari database MySQL. Tiga parameter: URL koneksi string akun kata sandi string url = config.database_url+": //"+config.server_ip+":"+config.server_port+"/"+config.database_sid; conn = driverManager.getConnection (url, config.username, config.password); } catch (ClassNotFoundException e) {E.PrintStackTrace (); } catch (sqlexception e) {e.printstacktrace (); } return conn; } // method2: Metode untuk menutup basis data public void closeConn () {if (rs! = null) {coba {rs.close (); } catch (sqlexception e) {e.printstacktrace (); }} if (pstmt! = null) {coba {pstmt.close (); } catch (sqlexception e) {e.printstacktrace (); }} if (conn! = null) {coba {conn.close (); } catch (sqlexception e) {e.printstacktrace (); }}} // Method3: Metode yang secara khusus digunakan untuk mengirim Tambah, Hapus dan Ubah Pernyataan Public Int Execother (PreparedStatement PSTMT) {coba {// 1. Gunakan objek pernyataan untuk mengirim pernyataan SQL int terpengaruh = PSTMT.ExecuteUpdate (); // 2. Kembalikan hasil yang dikembalikan terpengaruh; } catch (sqlexception e) {e.printstacktrace (); kembali -1; }} // Method4: Secara khusus digunakan untuk mengirim pernyataan kueri Hasil Publik ExecQuery (PreparedStatement PSTMT) {coba {// 1. Gunakan objek pernyataan untuk mengirim pernyataan SQL RS = PSTMT.ExecuteQuery (); // 2. Kembalikan hasil hasil Rs; } catch (sqlexception e) {e.printstacktrace (); kembali nol; }}}Biasanya, menggunakan kode di atas dapat menyelesaikan beberapa aplikasi CRUD sederhana, tetapi ada banyak batasan. Misalnya, setiap kali program mengambil koneksi, itu akan meningkatkan beban pada sistem, tidak ada transaksi, tidak ada sumber data, dll. Hari ini saya melihat seorang teman di taman menulis artikel di taman menggunakan refleksi untuk menyelesaikan crud secara langsung dalam parameter objek. Saya telah menulis ini sebelumnya, tetapi saya belum menyelesaikannya. Saya terutama ingin menulis dbutil umum. Akhirnya, saya mempelajarinya dan menemukan bahwa ia semakin dekat dengan SimpleJdbctemplate di Hibernate, jadi saya pergi untuk melihat kode sumber Hibernate. Selain itu, ada beberapa hal selama waktu itu, dan saya tidak punya waktu, jadi saya meninggalkan masalah ini dengan diam. Sekarang saya menebus hal ini dan memeriksanya sendiri.
Kelas Berdasarkan
Paket com.employees.dao; impor java.io.inputstream; impor java.lang.reflect.method; impor java.lang.reflect.parameterizedType; impor java.sql.connection; impor java.sql.date; impor java.sql. java.util.arraylist; import java.util.iterator; impor java.util.list; impor com.employees.dbutil.dbconn; kelas publik berdasarkan <t> {dbconn conn = dbconn baru (); koneksi koneksi pribadi = null; @Suppresswarnings ("tidak digunakan") kelas pribadi <T> persistentClass; @Suppresswarnings ("Uncecked") public -bedandedAo () {initConnection (); // Dapatkan tipe parameterisasi parameterisasi type = (parameterizedType) getClass (). GetGeneriCsuperclass (); persistentClass = (class <t>) type.getActualTypeARGUMS () [0]; } / *** Dapatkan koneksi database* / public void initConnection () {connection = conn.getConntion (); } /** * Simpan * /public void save (t entitas) melempar Exception {// SQL Pernyataan, masukkan ke nama tabel (string sql = "masukkan ke" + entity.getClass (). GetsImplename (). TolowerCase () + "("; // Dapatkan objek dari semua metode dengan string get list <Method> list = this.matchpo = list.iterator (); // Split Field Order Sisipkan ke Tabel Nama (ID, Nama, Email, Sedang (iter.hasnext ()) {Method Method = iter.next (); sql + = Method.getName (). Substring (3) .TolowerCase () + "; sql.substring (0, sql.LastIndexOf (",")) +") value ("; // Berdiri dengan nilai SQL yang dikompilasi ke dalam memasukkan nama tabel (id, nama, email) nilai (?,?,?, untuk (int j = 0; j <list.size (); j ++) {sql += "?,"; NAMA (ID, NAMA, EMAIL) (?,?,?); // Dapatkan referensi ke Objek Predompiled Persiapan Persiapan = Connection.PrepareStatement (SQL); int i = 0; // Pindahkan pointer ke baris terakhir iterator ke baris pertama. iter = list.iterator (); while (iter.hasnext ()) {Method Method = iter.next (); // Ini awalnya menentukan jenis nilai pengembalian, karena beberapa format nilai bidang perlu diubah saat disimpan dalam database. Misalnya, string, pernyataan SQL adalah '"+abc+"' if (method.getRetRoType (). GetsImplename (). IndexOf ("string")! = -1) {pernyataan.setstring (++ i, this.getString (metode, entitas)); } else if (method.getReturnType (). getsImplename (). indexOf ("date")! = -1) {pernyataan.setDate (++ i, this.getDate (method, entitas)); } else if (method.getReturnType (). getsImplename (). indexOf ("inputStream")! = -1) {pernyataan.setasciistream (++ i, this.getBlob (metode, entitas), 1440); } else {pernyataan.setInt (++ i, this.getInt (metode, entitas)); }} // Jalankan Conn.execother (pernyataan); // closeConn (); } / ** * Modifikasi * / Public void UPDATE (t entitas) melempar Exception {String sql = "update" + entity.getClass (). GetsImplename (). TolowerCase () + "set"; // Dapatkan semua Get Metode Objek Koleksi dari Daftar Kelas ini <Haphod> Daftar = this.MatchPojomethods (entitas, "get"); // Objek metode sementara, bertanggung jawab untuk mengulangi objek metode mode. Metode tempmethod = null; // Karena ID tidak perlu dimodifikasi saat memodifikasi, menambahkan parameter dalam rangka harus memindahkan ID ke akhir. Metode idMethod = null; Iterator <method> iter = list.iterator (); while (iter.hasnext ()) {tempmethod = iter.next (); // Jika nama metode berisi string ID dan panjangnya 2, itu dianggap sebagai ID. if (tempmethod.getName (). lastIndexof ("id")! = -1 && tempmethod.getName (). Substring (3) .length () == 2) {// Simpan objek bidang ID ke dalam variabel dan hapus dalam koleksi. IDMethod = Tempmethod; iter.remove (); // Jika nama metode dihapus dan string set/get tidak kompatibel dengan pojo + "id" (case tidak sensitif), itu dianggap sebagai id} lain jika ((entity.getClass (). GetsImplename () + "id"). EqualSignorecase (tempetod.getName (). Substring (3))). iter.remove (); }} // Pindahkan pointer iteratif ke posisi pertama iter = list.iterator (); while (iter.hasnext ()) {tempmethod = iter.next (); sql + = tempmethod.getName (). substring (3) .tolowercase () + "=?,"; } // Hapus yang terakhir, simbol sql = sql.substring (0, sql.LastIndexof (",")); // Tambahkan kondisi sql + = "di mana" + idmethod.getName (). Substring (3) .TolowerCase () + "=?"; // splicing SQL selesai, cetak SQL Pernyataan System.out.println (SQL); Pernyataan Persiapan = This.Connection.PrepareStatement (SQL); int i = 0; iter = list.iterator (); while (iter.hasnext ()) {Method Method = iter.next (); // Ini awalnya menentukan jenis nilai pengembalian, karena beberapa format nilai bidang perlu diubah ketika disimpan dalam database, misalnya, string, pernyataan SQL adalah '"+abc+"' if (method.getReturnType (). GetsImplename (). IndexOf ("String")! = -1) {pernyataan. } else if (method.getReturnType (). getsImplename (). indexOf ("date")! = -1) {pernyataan.setstring (++ i, this.getString (metode, entitas)); } else if (method.getReturnType (). getsImplename (). indexOf ("date")! = -1) {pernyataan.setDate (++ i, this.getDate (method, entitas)); } else if (method.getReturnType (). getsImplename (). indexOf ("inputStream")! = -1) {pernyataan.setasciistream (++ i, this.getBlob (metode, entitas), 1440); } else {pernyataan.setInt (++ i, this.getInt (metode, entitas)); }} // Tambahkan nilai ke bidang ID if (idmethod.getReturnType (). GetsImplename (). IndexOf ("string")! = -1) {pernyataan.setstring (++ i, this.getString (idMethod, entitas)); } else {pernyataan.setint (++ i, this.getInt (idMethod, entitas)); } // Jalankan pernyataan pernyataan SQL.ExecuteUpdate (); // tutup pernyataan objek yang telah dikompilasi.close (); // tutup koneksi.close (); } / ** * hapus * / public void delete (t entitas) melempar pengecualian {string sql = "hapus dari" + entity.getClass (). GetsImplename (). TolowerCase () + "where"; // menyimpan objek bidang dengan string "id" metode idMethod = null; // Mendapatkan objek bidang dengan string "id" daftar <nethod> Daftar = this.matchPojomethods (entitas, "get"); Iterator <method> iter = list.iterator (); while (iter.hasnext ()) {Method tempmethod = iter.next (); // Jika nama metode berisi string ID dan panjangnya 2, itu dianggap sebagai ID. if (tempmethod.getName (). lastIndexof ("id")! = -1 && tempmethod.getName (). Substring (3) .length () == 2) {// Simpan objek bidang ID dalam variabel dan hapus dalam set. IDMethod = Tempmethod; iter.remove (); // Jika nama metode dihapus dan string set/get tidak kompatibel dengan pojo + "id" (case tidak sensitif), itu dianggap sebagai id} lain jika ((entity.getClass (). GetsImplename () + "id"). iter.remove (); }} sql + = idmethod.getName (). substring (3) .tolowercase () + "=?"; Pernyataan Persiapan = This.Connection.PrepareStatement (SQL); // Tambahkan nilai ke bidang ID int i = 0; if (idmethod.getRetRoType (). getsImplename (). indexOf ("string")! = -1) {pernyataan.setstring (++ i, this.getString (idMethod, entitas)); } else {pernyataan.setint (++ i, this.getInt (idMethod, entitas)); } // Jalankan Conn.execother (pernyataan); // closeConn (); } / *** kueri oleh id* / public t findById (objek objek) melempar pengecualian {string sql = "select* from" + persistentClass.getSimpLename (). TolowerCase () + "di mana"; // Gunakan konstruktor subkelas untuk mendapatkan jenis spesifik dari tipe parameterisasi. Misalnya, berdasarkan <T>, yaitu, dapatkan jenis spesifik dari entitas T = persistentClass.newInstance (); // penyimpanan objek metode yang menyimpan kunci utama POJO (atau tabel yang sedang dioperasikan) IDMethod = null; Daftar <nethod> list = this.matchpojomethods (entitas, "set"); Iterator <method> iter = list.iterator (); // filter untuk mendapatkan objek metode while (iter.hasnext ()) {Method tempmethod = iter.next (); if (tempmethod.getName (). indexOf ("id")! = -1 && tempmethod.getName (). substring (3) .length () == 2) {idMethod = tempmethod; } lain if ((entity.getClass (). getsImplename () + "id"). EqualSignorecase (tempmethod.getName (). Substring (3))) {idMethod = tempmethod; }} // Surat pertama dikonversi ke huruf kecil SQL += idMethod.getName (). Substring (3,4) .TolowerCase () +idMethod.getName (). Substring (4) +"=?"; // Setelah pernyataan enkapsulasi, cetak SQL Pernyataan System.out.println (SQL); // Dapatkan Pernyataan Persiapan Persiapan Koneksi = this.connection.preparestatement (SQL); // menilai jenis id if (objek instance dari integer) {pernyataan.setint (1, (integer) objek); } else if (objek instance dari string) {pernyataan.setstring (1, (string) objek); } // Jalankan SQL untuk mendapatkan set hasil kueri. Hasil rs = conn.execquery (pernyataan); // Daftarkan, rekam loop ke jumlah bidang int i = 0; // Arahkan pointer ke baris pertama iterator iter = list.iterator (); // enkapsulate while (rs.next ()) {while (iter.hasnext ()) {Method Method = iter.next (); if (method.getParameterTypes () [0] .getSimpleName (). IndexOf ("String")! = -1) {// Karena dalam set daftar, urutan objek metode yang akan diambil tidak sesuai dengan urutan data (misalnya ". Nama yang sesuai. this.setstring (metode, entitas, rs.getString (method.getName (). substring (3) .tolowercase ())); } lain if (method.getParameterTypes () [0] .getSImplename (). IndexOf ("date")! = -1) {this.setDate (Method, entitas, rs.getDate (method.getName (). Substring (3) .tolowercase ())); } else if (method.getParameterTypes () [0] .getSImplename (). IndexOf ("InputStream")! = -1) {this.setBlob (Metode, entitas, rs.getBlob (Method.getName (). } else {this.setint (Method, entitas, rs.getint (method.getName (). Substring (3) .tolowerCase ())); }}} // tutup hasil set rs.close (); // tutup pernyataan objek yang telah dikompilasi.close (); entitas kembali; } /*** Saring semua objek metode dengan string yang masuk di kelas POJO saat ini dan kembalikan koleksi daftar. */Daftar Privat <nethod> MatchPojomethods (t entitas, string methodName) {// Dapatkan semua metode Objek Metode Pojo Metode Pojo saat ini [] Method = entity.getClass (). GetDecLaredMethods (); // Daftar Kontainer Menyimpan Semua Objek Metode dengan Get String List <at Method> Daftar = ArrayList baru <nethod> (); // Saring semua objek metode dengan string get di kelas POJO saat ini dan simpan di wadah daftar untuk (int index = 0; index <methods.length; index ++) {if (metode [index] .getName (). IndexOf (methodname)! = -1) {list.add (metode [indeks]); }} daftar pengembalian; } /*** Metode mengembalikan nilai pernyataan SQL ketika jenisnya adalah int atau integer. Sesuai dengan get */ public integer getInt (metode metode, t entitas) melempar pengecualian {return (integer) method.invoke (entitas, objek baru [] {}); } /*** Metode mengembalikan nilai perakitan pernyataan SQL saat jenisnya adalah string. Misalnya, 'ABC', sesuai dengan get */ public string getString (metode metode, t entitas) melempar Exception {return (string) method.invoke (entitas, objek baru [] {}); } /*** Metode mengembalikan nilai rakitan pernyataan SQL ketika jenis gumpalan. Sesuai dengan get */ inputStream getBlob publik (metode metode, t entitas) melempar pengecualian {return (inputStream) method.invoke (entitas, objek baru [] {}); } / ** * Metode ini mengembalikan nilai rakitan pernyataan SQL ketika jenis tanggal, sesuai untuk mendapatkan * / tanggal publik getDate (metode metode, t entitas) melempar pengecualian {return (date) method.invoke (entitas, objek baru [] {}); } / ** * Ketika jenis parameter adalah integer atau int, set parameter untuk bidang entitas, sesuai dengan set * / public integer setint (metode metode, t entitas, integer arg) melempar pengecualian {return (integer) method.invoke (entitas, objek baru [] {arg}); } / ** * Ketika tipe parameter adalah string, set parameter untuk bidang entitas, sesuai dengan set * / public string setString (metode metode, t entitas, string arg) melempar pengecualian {return (string) method.invoke (entitas, objek baru [] {arg}); } / ** * Ketika tipe parameter adalah inputStream, set parameter untuk bidang entitas, sesuai dengan set * / inputStream public setBlob (metode metode, t entitas, inputStream arg) melempar pengecualian {return (inputStream) method.invoke (entitas, objek baru [] {arg}); } / ** * Ketika tipe parameter adalah tanggal, set parameter untuk bidang entitas, sesuai dengan set * / setDate tanggal publik (metode metode, t entitas, tanggal arg) melempar pengecualian {return (date) method.invoke (entitas, objek baru [] {arg}); }}Karyawan yang diwariskan berdasarkan berdasarkan, dan dapat secara langsung menggunakan metode kelas induk, menambahkan kode kembali kode
Paket com.employees.dao; impor java.util.arraylist; impor java.util.list; impor com.employees.po.employees; karyawan kelas publik Kembali Benar; } // Tambahkan informasi karyawan ke tabel daftar publik <shandleing> Addemployees (int ID) melempar Exception {List <erepreandle> lstemployees = new ArrayList <ereachandle> (); Karyawan Karyawan = FindById (ID); // Muat data yang saat ini terlampir ke objek lstemployees.add (karyawan); kembali lstemployees; } public void deleteEmp (Entitas Karyawan Akhir) melempar Exception {this.delete (entitas); } public void updateemp (entitas karyawan akhir) melempar Exception {this.update (entitas); }}Saya tidak akan memposting kode lapisan PO, sekarang gunakan junit4 untuk melakukan tes
Paket com.employees.dao; impor org.junit.test; impor com.employees.po. emp.setpname ("tly"); emp.setpsex ("pria"); emp.setpbeliefs ("xxxxx"); emp.setpaddr ("tianhe"); emp.setphobby ("mainkan bola basket"); emp.setpsubject ("komputer"); emp.setptel ("123456"); KaryawanDao dao = karyawan baru (); Dao.addemployees (EMP); } @Test public void testupDate () melempar Exception {karyawan Dao = karyawan baru (); Karyawan emp = dao.findbyid (14); emp.setptel ("999999"); dao.updateemp (emp); } @Test public void testDelete () melempar Exception {karyawan Dao = karyawan baru (); Karyawan emp = dao.findbyid (15); dao.deleteemp (emp); }}Setelah pengujian, ketiga metode ini dapat berjalan secara normal, waktu bergegas. Beberapa kode digunakan oleh teman lain. Beberapa tempat mungkin tidak dianggap sangat komprehensif atau beberapa kode akan berlebihan. Operasi umum CRUD di BasedAO belum ditulis secara penuh. Jika ada teman yang tertarik, Anda dapat menulisnya lagi, seperti kueri, operasi batch, dll. Jika tes lulus, ingatlah untuk mengirimi saya salinan, haha
Kemasan tambahan JDBC yang sederhana dan umum di atas (contoh) adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.