Java 8 akhirnya tiba! Operasi database.
Metode fungsional pemrosesan data
Java 8 tidak hanya menambahkan dukungan fungsional, tetapi juga memperluas kelas pengumpulan dengan data pemrosesan fungsi baru.
Misalnya, misalkan Anda memiliki koleksi koleksi: Pelanggan: Pelanggan:
Koleksi <Lustoler> Pelanggan;
Jika Anda hanya tertarik pada pelanggan dari Belgia, Anda akan memiliki semua objek pelanggan dan hanya menyimpan apa yang Anda butuhkan.
Koleksi <sludes> Belgia = ArrayList baru <() ();
Ini tidak hanya membutuhkan 5 baris kode, tetapi tidak terlalu abstrak. Kode berulir untuk menulis ulang semua kode.
Dengan Java 8, hanya satu baris kode yang dapat mencapai fitur yang sama. Buat saja penyaringan.
Customer.stream ().
Kode Java 8 di atas tidak hanya lebih pendek, tetapi juga lebih mudah dipahami. Buang waktu dalam interpretasi kode dalam siklus interpretasi untuk memahami apa yang dilakukannya untuk datanya.
Apa yang harus saya lakukan jika Anda ingin menjalankan kode ini secara bersamaan?
Customer.parallelstream ().
Yang lebih menarik adalah bahwa kode gaya fungsional ini juga berlaku untuk database
Gunakan metode fungsi pada database
Secara tradisional, programmer perlu menggunakan database khusus untuk meminta pernyataan untuk mengakses data database.
Disiapkan s = con.preparestatement ("pilih *" + "dari pelanggan c" + "di mana c.country =?");Sebagian besar kode ini adalah string, yang akan membuat kompiler tidak menemukan kesalahan dan kode tergesa -gesa ini akan menyebabkan masalah keamanan. Berikan bahasa kueri basis data, Anda dapat menyelesaikan cek yang salah dan masalah keamanan. Atau gunakan alat pemetaan hubungan objek untuk menghindari sejumlah besar kode membosankan, tetapi mereka hanya dapat digunakan dalam akses umum ke pertanyaan.
Gunakan Java 8 untuk menanyakan database dengan API fungsional. Misalnya, Jinq adalah proyek open source, dan apa yang dijelajahi API basis data di masa depan dapat memungkinkan pemrograman fungsional. Berikut ini adalah kueri database menggunakan jinq:
Pelanggan. Di mana (c-> c.getCountry (). Equals ("Belgia");Kode ini hampir sama dengan kode yang menggunakan API streaming. Ketika kode berjalan, JINQ akan secara otomatis diterjemahkan ke dalam kode kueri database, seperti kueri JDBC sebelumnya.
Dalam hal ini, bahkan jika Anda belum mempelajari beberapa bahasa kueri basis data baru, Anda dapat menulis kueri basis data yang efisien. Anda dapat menggunakan gaya kode yang sama untuk dikumpulkan di Java. Anda tidak memerlukan kompiler Java khusus atau mesin virtual. Semua kompilasi kode dan berjalan di Java 8 JDK biasa. Jika kode Anda salah, kompiler akan menemukannya dan melaporkannya kepada Anda, seperti kode Java biasa.
Jinq mendukung kueri kompleks yang sama dengan SQL92. Algoritma dari translasi kode Java ke dalam kueri basis data sangat fleksibel, asalkan dapat menerimanya, dapat diterjemahkan. Misalnya, JinQ dapat menerjemahkan kueri basis data di bawah ini, meskipun rumit.
Pelanggan. Di mana (C-> C.GetCountry (). Equals ("Belgia"). Di mana (c-> {if (c.getsalarly () <100000) kembali c.getsalalalalalalalalalalalalalaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa CTCTCTCTCTCT KERJA Pekerjaannya Pekerjaan Pekerjaannya Pekerjaan Kerja Kerja Kerja Kerja Pekerjaan Kerja Pekerjaan Wor Pekerjaan Kerja Pekerjaan.Seperti yang Anda lihat, pemrograman fungsional Java 8 sangat cocok untuk kueri basis data. Dan pertanyaannya kompak dan bahkan pertanyaan rumit bisa kompeten.
Operasi internal
Tapi bagaimana cara kerja Anda? Bagaimana kompiler Java biasa dapat mengubah kode java menjadi kueri database? Apa yang istimewa tentang Java 8 untuk memungkinkan ini?
Kunci untuk mendukung PI basis data baru ini yang mendukung fungsi -fungsi ini adalah metode analisis bytecode yang disebut "eksekusi simbolik". Meskipun kode Anda disusun oleh kompiler Java biasa dan berjalan di mesin virtual Java biasa, Jinq dapat menganalisis dan membangun kueri basis data dari itu saat Anda dikompilasi kode Java. Saat menggunakan Java 8 Streams API, sering ditemukan bahwa ketika menganalisis fungsi pendek, efek kerja eksekusi simbolik adalah yang terbaik.
Untuk memahami bagaimana eksekusi simbolik ini bekerja, cara termudah adalah dengan menggunakan contoh. Mari kita periksa bagaimana kueri berikut dikonversi ke bahasa kueri SQL oleh Jinq:
Pelanggan. Di mana (C-> C.GetCountry (). Equals ("Belgia")))))) Awalnya, Variabel Pelanggan adalah koleksi, dan kueri basis data yang sesuai adalah:
Pilih * dari pelanggan C
Kemudian, metode where () dipanggil, dan fungsi diteruskan ke sana. Dalam metode where (), Jinq membuka file .class fungsi ini untuk mendapatkan kode byte yang disusun oleh fungsi ini untuk analisis. Dalam contoh ini, jangan gunakan kode byte nyata, mari kita gunakan beberapa instruksi sederhana untuk mewakili kode byte dari fungsi ini:
D = C.GetCountry () E = "Belgia" E = D.Equals (E) Return E
Di sini, kami berasumsi bahwa fungsi telah disusun oleh kompiler Java ke dalam empat instruksi ini. Ketika metode where () dipanggil, Jinq melihat ini. Bagaimana Jinq bisa memahami kode ini?
Jinq dianalisis dengan mengeksekusi kode. Tapi Jinq tidak menjalankan kode secara langsung. Ini adalah kode operasi "abstrak": tanpa variabel nyata dan nilai nyata, Jinq menggunakan simbol untuk menunjukkan semua nilai saat mengeksekusi kode. Inilah sebabnya mengapa analisis ini disebut "eksekusi simbolik".
Jinq menjalankan setiap instruksi dan melacak segala sesuatu yang semua efek samping atau kode berubah selama status program. Berikut ini adalah bagan yang menunjukkan semua efek samping yang ditemukan ketika Jinq melakukan empat baris kode dalam eksekusi simbolik.
Contoh eksekusi simbolis
Pada gambar, Anda dapat melihat bahwa setelah instruksi pertama berjalan, Jinq menemukan dua efek samping: variabel D telah berubah, dan metode customer.getCountry () dipanggil. Karena itu adalah eksekusi simbolis, variabel D tidak memberikan nilai nyata dari nyata, seperti "AS" atau "Denmark", yang ditugaskan untuk nilai simbolik C.GetCountry ().
Setelah semua instruksi ini dieksekusi, Jinq merampingkan efek samping. Karena variabel D dan E adalah variabel lokal, variabel apa pun akan dibuang setelah fungsi keluar, sehingga efek samping ini dapat diabaikan. Jinq juga tahu bahwa customer.getCountry () dan string.equals () tidak memodifikasi variabel apa pun atau menampilkan output apa pun, sehingga metode ini dapat diabaikan. Akibatnya, Jinq dapat menyimpulkan bahwa fungsi ini hanya akan menghasilkan satu peran, dan akan mengembalikan C.GetCountry ().
Setelah Jinq memahami fungsi -fungsi yang diteruskan ke dalam metode WHERE (), ia dapat mencampur pengetahuan tentang kueri basis data dan memberikan kueri basis data baru dalam koleksi pelanggan.
Hasilkan Kueri Basis Data
Beginilah cara Jinq menghasilkan kueri basis data dari kode Anda. Penggunaan eksekusi simbolis berarti bahwa metode ini cukup kuat untuk mode kode yang berbeda dari kompiler Java yang berbeda. Jika kode yang ditemui oleh Jinq memiliki efek samping yang tidak dapat dikonversi menjadi kueri database, Jinq akan membuat kode Anda tidak berubah. Karena semuanya ditulis dalam kode Java normal, Jinq dapat menjalankan kode tersebut secara langsung, dan kode Anda akan menghasilkan hasil yang diharapkan.
Contoh terjemahan sederhana ini harus memungkinkan Anda memahami cara menanyai terjemahan. Anda dapat yakin bahwa algoritma ini dapat dengan benar menghasilkan kueri basis data dari kode Anda.
Prospek yang indah
Saya harap saya membiarkan Anda merasakan cara baru dari pekerjaan basis data yang dibawa oleh Java 8 di Java. Pemrograman fungsional yang didukung oleh Java 8 memungkinkan Anda untuk menulis kode untuk database untuk menulis kode untuk koleksi Java. Diharapkan bahwa API basis data yang ada akan diperluas untuk mendukung jenis kueri ini.