Clojure - Database

Untuk menggunakan fungsionalitas database, harap pastikan untuk mengunduh file jdbc files dari url berikut - https://codeload.github.com/clojure/java.jdbc/zip/master

Anda akan menemukan file zip yang memiliki driver yang diperlukan Clojure untuk dapat terhubung ke database. Setelah file zip diekstrak, pastikan untuk menambahkan lokasi yang telah dibuka zipnya ke classpath Anda.

File utama untuk konektivitas database adalah file bernama jdbc.clj di lokasi clojure / java.

Konektor clojure jdbc mendukung berbagai macam database, beberapa di antaranya adalah sebagai berikut.

  • H2Database
  • Oracle
  • Microsoft SQL Server
  • MySQL
  • PostgreSQL

Dalam contoh kami, kami akan menggunakan MySQL DB sebagai contoh.

Operasi berikut dimungkinkan di Clojure yang berkaitan dengan Database.

Koneksi Database

Sebelum menghubungkan ke database MySQL, pastikan hal berikut -

  • Anda telah membuat TESTDB database.

  • Anda telah membuat tabel EMPLOYEE di TESTDB.

  • Tabel ini memiliki bidang FIRST_NAME, LAST_NAME, AGE, SEX dan INCOME.

  • ID pengguna "testuser" dan kata sandi "test123" disetel untuk mengakses TESTDB.

  • Pastikan Anda telah mengunduh 'file jar mysql' dan menambahkan file tersebut ke jalur kelas Anda.

  • Anda telah melalui tutorial MySQL untuk memahami Dasar-Dasar MySQL .

Sintaksis

Berikut ini sintaks untuk membuat koneksi di Clojure.

(def connection_name {
   :subprotocol “protocol_name”
   :subname “Location of mysql DB”
   :user “username” :password “password” })

Parameters- 'connection_name' adalah nama yang akan diberikan ke koneksi. 'subprotocol' adalah protokol yang akan digunakan untuk koneksi. Secara default kami akan menggunakan protokol mysql. 'subname' adalah url untuk terhubung ke mysql db bersama dengan nama database. 'user' adalah nama pengguna yang digunakan untuk terhubung ke database. 'password' adalah kata sandi yang akan digunakan untuk terhubung ke database.

Return Value - Ini akan memberikan string koneksi, yang dapat digunakan dalam operasi mysql berikutnya.

Contoh berikut menunjukkan cara menyambungkan ke tabel di skema informasi dan mengambil semua data di tabel.

Contoh

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "//127.0.0.1:3306/information_schema"
      :user "root"
      :password "shakinstev"})
   (println (sql/query mysql-db
      ["select table_name from tables"]
      :row-fn :table_name)))

Mengkueri Data

Mengkueri data pada database apa pun berarti mengambil beberapa informasi berguna dari database. Setelah koneksi database dibuat, Anda siap untuk membuat kueri ke dalam database ini. Berikut ini adalah sintaks dimana data dapat ditanyakan menggunakan Clojure.

Sintaksis

clojure.java.jdbc/query dbconn
["query"]
   :row-fn :sequence

Parameters- 'dbconn' adalah nama koneksi yang digunakan untuk menghubungkan ke database. 'query' adalah string kueri yang digunakan untuk mengambil data dari database. ': sequence' secara default adalah semua baris data yang diambil dari database dan dikembalikan sebagai urutan. Operasi yang diperlukan pada urutan tersebut kemudian dapat dilakukan untuk melihat data apa yang telah diambil.

Return Value - Ini akan mengembalikan urutan, yang akan memiliki baris data dari operasi kueri.

Contoh berikut menunjukkan cara menyambungkan ke tabel karyawan dan mengambil kolom first_name dari baris di tabel.

Contoh

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "//127.0.0.1:3306/testdb"
      :user "root"
      :password "shakinstev"})
   (println (sql/query mysql-db
      ["select first_name from employee"]
      :row-fn :first_name)))

Dari kode di atas, kita bisa melihatnya

  • Kueri "pilih first_name dari karyawan" diteruskan sebagai string kueri.

  • The: first_name adalah urutan, yang dikembalikan sebagai hasil dari operasi pengambilan.

Jika kita berasumsi bahwa hanya ada satu baris dalam database kita yang berisi nilai nama_pertama dari John, berikut akan menjadi keluaran dari program di atas.

(John)

Memasukkan Data

Ini diperlukan ketika Anda ingin membuat rekaman Anda ke dalam tabel database. Berikut ini adalah sintaks dimana data dapat disisipkan menggunakan Clojure. Ini dilakukan dengan menggunakan‘insert!’ fungsi.

Sintaksis

clojure.java.jdbc/insert!
   :table_name {:column_namen columnvalue}

Parameters- ': nama_tabel' adalah nama tabel tempat penyisipan perlu dilakukan. '{: column_namen columnvalue}' adalah peta dari semua nama dan nilai kolom, yang perlu ditambahkan sebagai baris dalam tabel.

Return Value - Ini akan mengembalikan nol jika penyisipan berhasil dilakukan.

Contoh berikut menunjukkan cara menyisipkan rekaman ke tabel karyawan di database testdb.

Contoh

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "//127.0.0.1:3306/testdb"
      :user "root"
      :password "shakinstev"})
   (sql/insert! mysql-db
      :employee {:first_name "John" :last_name "Mark" :sex "M" :age 30 :income 30}))

Jika sekarang Anda memeriksa database MySQL dan tabel karyawan, Anda akan melihat bahwa baris di atas akan berhasil dimasukkan ke dalam tabel.

Menghapus Data

Baris dapat dihapus dari tabel dengan menggunakan ‘delete!’fungsi. Berikut adalah sintaks tentang bagaimana operasi ini dapat dilakukan.

Sintaksis

clojure.java.jdbc/delete!
   :table_name [condition]

Parameters- ': nama_tabel' adalah nama tabel tempat penyisipan perlu dilakukan. 'kondisi' adalah kondisi yang digunakan untuk menentukan baris mana yang perlu dihapus dari tabel.

Return Value - Ini akan mengembalikan jumlah baris yang dihapus.

Contoh berikut ini memperlihatkan cara menghapus rekaman dari tabel karyawan di database testdb. Contoh tersebut menghapus baris dari tabel berdasarkan ketentuan bahwa usianya sama dengan 30.

Contoh

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "//127.0.0.1:3306/testdb"
      :user "root"
      :password "shakinstev"})
   (println (sql/delete! mysql-db
      :employee ["age = ? " 30])))

Jika Anda memiliki record yang memiliki baris dengan usia sama dengan nilai 30, baris tersebut akan dihapus.

Memperbarui Data

Baris dapat diperbarui dari tabel dengan menggunakan ‘update!’fungsi. Berikut adalah sintaks tentang bagaimana operasi ini dapat dilakukan.

Sintaksis

clojure.java.jdbc/update!
   :table_name
{setcondition}
[condition]

Parameters- ': nama_tabel' adalah nama tabel tempat penyisipan perlu dilakukan. 'setcondition' adalah kolom yang perlu diperbarui seperti yang disebutkan dalam peta. 'kondisi' adalah kondisi yang digunakan untuk menentukan baris mana yang perlu dihapus dari tabel.

Return Value - Ini akan mengembalikan jumlah baris yang diperbarui.

Contoh berikut ini memperlihatkan cara menghapus rekaman dari tabel karyawan di database testdb. Contoh tersebut memperbarui baris dari tabel berdasarkan ketentuan bahwa usianya sama dengan 30 dan memperbarui nilai pendapatan menjadi 40.

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "//127.0.0.1:3306/testdb"
      :user "root"
      :password "shakinstev"})
   (println (sql/update! mysql-db
      :employee
      {:income 40}
      ["age = ? " 30])))

Jika Anda memiliki record yang memiliki baris dengan umur sama dengan nilai 30, maka baris tersebut akan diupdate dimana nilai income akan ditetapkan menjadi 40.

Transaksi

Transaksi adalah mekanisme yang memastikan konsistensi data. Transaksi memiliki empat properti berikut -

  • Atomicity - Entah transaksi selesai atau tidak ada yang terjadi sama sekali.

  • Consistency - Sebuah transaksi harus dimulai dalam keadaan yang konsisten dan membiarkan sistem dalam keadaan yang konsisten.

  • Isolation - Hasil antara transaksi tidak terlihat di luar transaksi saat ini.

  • Durability - Setelah transaksi dilakukan, efeknya tetap ada, bahkan setelah kegagalan sistem.

Contoh

Contoh berikut menunjukkan cara mengimplementasikan transaksi di Clojure. Setiap operasi yang perlu dilakukan dalam transaksi perlu disematkan di file‘with-dbtransaction’ ayat.

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "//127.0.0.1:3306/testdb"
      :user "root"
      :password "shakinstev"})
   (sql/with-db-transaction [t-con mysql-db]
      (sql/update! t-con
         :employee
         {:income 40}
         ["age = ? " 30])))