Proses Eksekusi Kerangka Mybatis:
1. Konfigurasikan file konfigurasi mybatis, sqlmapconfig.xml (namanya tidak diperbaiki)
2. Muat lingkungan yang menjalankan mybatis melalui file konfigurasi dan membuat pabrik sesi sqlsessionfactory
SQLSessionFactory digunakan dengan cara singleton bila benar -benar digunakan.
3. Buat SQLSESSION melalui SQLSESSESTORCORY
SQLSession adalah antarmuka yang berorientasi pengguna (menyediakan metode basis data operasi). Objek Implementasi adalah Thread-Insecure. Disarankan bahwa skenario aplikasi SQLSession berada dalam badan metode.
4. Hubungi metode SQLSession untuk memanipulasi data.
Jika Anda perlu melakukan transaksi, Anda perlu menjalankan metode SQLSession Commit ().
5. Lepaskan sumber daya dan tutup sqlsession
Metode pengembangan agen mapper (disarankan)
Hanya pemrogram yang perlu menulis antarmuka mapper (yaitu, antarmuka dao)
Pemrogram perlu mengikuti spesifikasi pengembangan saat menulis mapper.xml (file pemetaan) dan mapper.java:
1. Namespace di mapper.xml adalah jalur lengkap kelas mapper.java.
2. ID dari pernyataan di mappper.xml sama dengan nama metode di mappper.java.
3. ParameterType dari pernyataan dalam mapper.xml menentukan jenis parameter input dan jenis parameter input metode mapper.java.
4. Tipe hasil dari pernyataan dalam mapper.xml menentukan tipe output dan jenis nilai pengembalian dari metode mapper.java.
Konten artikel ini:
Menganalisis model data produk pesanan.
Pemetaan Lanjutan: (Belajar)
Menerapkan kueri satu-ke-satu, satu-ke-banyak, dan banyak pertanyaan.
Tunda pemuatan
Cache kueri
Cache level 1
Cache Level 2 (Pahami Skenario Penggunaan Mybatis Level 2 Cache)
Integrasi mybatis dan spirng (master)
Rekayasa terbalik (dapat digunakan)
Pesan Model Data Produk
Ide Analisis Model Data
1. Konten data yang direkam di setiap tabel
Menjadi terbiasa dengan konten yang direkam dalam setiap tabel dengan modul setara dengan proses persyaratan sistem pembelajaran (fungsi).
2. Pengaturan bidang penting untuk setiap tabel
Bidang yang tidak kosong, bidang kunci asing
3. Hubungan antara tabel tingkat basis data
Hubungan kunci asing
4. Hubungan Bisnis Antara Tabel
Saat menganalisis hubungan bisnis antara tabel, perlu menganalisisnya berdasarkan signifikansi bisnis tertentu.
Analisis Model Data
Pengguna tabel pengguna:
Catat informasi pengguna dari produk yang dibeli
Tabel Pesanan: Pesanan
Mencatat pesanan yang dibuat oleh pengguna (pesanan untuk membeli item)
Detail pesanan: orderDetail:
Catat informasi terperinci dari pesanan, yaitu informasi pembelian
Daftar Produk: Item
Informasi produk yang direkam
Hubungan Bisnis Antara Tabel:
Saat menganalisis hubungan bisnis antara tabel, perlu menganalisisnya berdasarkan signifikansi bisnis tertentu.
Pertama menganalisis hubungan bisnis antara tabel yang memiliki hubungan antara level data:
USRE DAN PESANAN:
Pengguna ―-> Pesanan: Pengguna dapat membuat banyak pesanan, satu untuk banyak orang
Pesanan -> Pengguna: Pesanan dibuat hanya oleh satu pengguna, satu ke satu
PESANAN DAN ORDERDETAIL:
Pesanan> Pesanan Detail: Suatu pesanan dapat menyertakan beberapa detail pesanan, karena satu pesanan dapat membeli beberapa item, dan informasi pembelian dari setiap item dicatat dalam pesanan, hubungan satu-ke-banyak
OrderDetail> Pesanan: Detail pesanan hanya dapat dimasukkan dalam satu pesanan, satu-ke-satu
orderDetail dan itemsm:
OrderDetail-> itemsms: satu detail pesanan hanya sesuai dengan satu informasi produk, satu-ke-satu
Item> OrderDetail: Suatu produk dapat disertakan dalam beberapa detail pesanan, satu ke banyak
Kemudian analisis apakah ada hubungan bisnis antara tabel yang tidak terkait dengan level database:
Pesanan dan Barang:
Hubungan antara pesanan dan item dapat ditetapkan melalui tabel OrderDetail.
Pengguna dan Item: merupakan hubungan banyak-ke-banyak melalui tabel lain
Kueri satu-ke-satu
Persyaratan: Informasi Pesanan Permintaan, dan Associate Query Informasi Pengguna untuk Membuat Pesanan
Gunakan Hasil Hasil untuk meminta
Pertimbangan penggunaan pernyataan SQL
Tentukan tabel utama kueri: tabel pesanan
Tentukan tabel asosiasi untuk kueri: tabel pengguna
Apakah permintaan asosiasi menggunakan tautan internal atau tautan eksternal?
Karena ada kunci asing (user_id) di tabel pesanan, hanya satu catatan yang dapat ditemukan dengan menanyakan tabel pengguna melalui asosiasi kunci asing, dan tautan internal dapat digunakan.
Pilih pesanan.*, User.username, user.sex, user.address fromorders, user where orders.user_id = user.id
Buat pojo (orderscustom.java)
Peta hasil kueri SQL di atas ke Pojo, yang harus mencakup semua nama kolom kueri.
Pesanan asli.java tidak dapat memetakan semua bidang, dan pojo yang baru dibuat diperlukan.
Buat kelas PO yang mewarisi kelas PO yang mencakup banyak bidang kueri.
Ordersmappercustom.xml
Ordersmappercustom.java
Tulis kelas tes
Klik kanan pada file ordersmappercustom.java> Pilih Baru> Lainnya> Junit Test Case> Pilih fungsi yang akan diuji
Tulis kode berikut di ordersmappercertomtest.java:
PUBLIK PUBLIK PERMINTAANMAPPERCUSTOMTEST {private SQLSESSIONFACTORY SQLSESTIONFACTORY; // Metode ini adalah untuk mengeksekusi @Beforepublic void setup () melempar Exception {// Buat SQLSessionFactory // Mybatis File String Resource = "sqlmapconfig.xstrixory" Sumber daya.getResourceAsstream (sumber daya); // Buat pabrik sesi dan lulus dalam informasi file konfigurasi mybatis sqlsessionfactory = SQLSessionFactoryBuilder baru (). Build (inputStream);}@testpublic void testfindorderSuser () melemparkan pengecualian {SQLSESION {SQLSESION {SQLSESION {SQLSESION {SQLSESION {SQLSESION {SQLSESION {SQLSESION {SQLSESION {SQLSESION {SQLSESION {SQLSESPION {SQLSESION {SQLSESPION {SQLSESION {SQLSESION { Buat Proxy Object OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper (ordersmapperccustom.class); // Call Maph Method List <deserscustom> Daftar = ordersmappercustom.findordersuser (); System.out.println (listmappercustom.close (); System.out.println (list); sqlsesesion.Gunakan Hasil Map untuk meminta
Pernyataan SQL: SQL diimplementasikan di Hasil Hasil yang sama
Ide untuk menggunakan pemetaan resultmap
Gunakan HasilMap untuk memetakan informasi pesanan dalam hasil kueri ke objek pesanan, tambahkan atribut pengguna di kelas pesanan, dan memetakan informasi pengguna kueri yang terkait ke atribut pengguna di objek pesanan.
Tambahkan atribut pengguna ke kelas pesanan
Ordersmappercustom.xml
Tentukan HasilMap
TYEP: Berarti untuk memetakan hasil seluruh kueri ke kelas tertentu misalnya: cn.itcast.mybatis.po.orders
ID: mewakili pengidentifikasi unik dari kolom kueri di tabel database, pengidentifikasi unik dalam informasi pesanan. Jika ada beberapa kolom yang membentuk pengidentifikasi unik, konfigurasikan beberapa ID.
Kolom: Kolom Identifikasi Unik untuk Informasi Pesanan di Tabel Basis Data
Properti: Properti mana yang dipetakan sesuai pesanan oleh kolom identifikasi unik dari informasi pesanan?
Asosiasi: Digunakan untuk memetakan informasi untuk meminta objek individual
Properti: Properti mana dalam pesanan untuk memetakan informasi pengguna dari kueri terkait
Javatype: Properti mana yang dipetakan ke pengguna
<! --Map hasil pengguna yang terkait memetakan hasil dari seluruh kueri ke cn.itcast.mybatis.po.orders-> <resultmap type = "cn.itcast.mybatis.po.orders" ID = "orderResultMap"> <!-mengkonfigurasi informasi pesanan yang dipetakan-<!-id: Id: ID: ID. If there are multiple columns to form a unique identifier, configure multiple idcolumn: Unique identification column of order information property: Which property in Orders is mapped to by the unique identifier column of order information--><id column="id" property="id"/><result column="user_id" property="userId"/><result column="number" property="number" /><result column="createtime" property="createtime" /><result kolom = "note" properti = note/> <!-Mengkonfigurasi informasi pengguna terkait yang dipetakan-> <!-Asosiasi: Informasi yang digunakan untuk memetakan Properti Objek Tunggal Kueri Terkait: Properti mana dalam Pesanan untuk memetakan informasi pengguna dari kueri terkait-> <Asosiasi Properti = "User" oVATYPE = "cn.itcast yang terkait. JAVATYPE: Properti mana yang dipetakan ke pengguna -> <id kolom = "user_id" properti = "id"/> <colom hasil = "nama pengguna" properti = "nama pengguna"/> <hasil kolom = "seks" properti = "seks"/> <kolom hasil = "alamat" properti = "alamat"/> <</asosiasi> </hasil hasil>
Definisi pernyataan
Ordersmappercustom.java
Kode uji
@Testpublic void testFindordersUserResultMap () melempar Exception {sqlsession sqlSession = sqlSessionFactory.opensession (); // buat proxy objek ordersmappercustom ordersmappercustom = sqlsession.getMapper (ordersmappercclActom = caller/ sqlSession.getMapper (ordersmappercustom ordersmappercustom.findordersuserResultMap (); system.out.println (daftar); sqlsession.close ();}HasilType dan hasil Hasil Menerapkan ringkasan kueri satu-ke-satu
HasilType: relatif mudah untuk diimplementasikan menggunakan HasilType. Jika nama kolom kueri tidak termasuk dalam POJO, Anda perlu menambahkan atribut yang sesuai dari nama kolom untuk menyelesaikan pemetaan.
Jika tidak ada persyaratan khusus untuk hasil kueri, disarankan untuk menggunakan HasilType.
HasilMap: Hasil PMN perlu didefinisikan secara terpisah, yang sedikit merepotkan. Jika ada persyaratan khusus untuk hasil kueri, menggunakan RACKMAP dapat menyelesaikan atribut POJO pemetaan kueri terkait.
HasilMap dapat menerapkan pemuatan malas, HasilType tidak dapat mengimplementasikan pemuatan malas.
Kueri satu-ke-banyak
Persyaratan: Permintaan Pesanan dan Rincian Pesanan Informasi.
Pernyataan SQL
Tentukan tabel kueri utama: tabel pesanan
Tentukan tabel kueri yang terkait: Tabel Detail Pesanan
Cukup tambahkan detail pesanan Daftar Asosiasi berdasarkan kueri satu-ke-satu.
SELECTORDERS.*, User.username, user.sex, user.address, orderDetail.id orderDetail_id, orderDetail.items_id, orderDetail.items_num, orderDetail.orders_idfromorders, user, orderDetailwhere orders.user_id = user.id.idromorder, user, orderDetailwhere orders.user_id = user.id dan orderdetail.orders = orderDerwhere orders.user_id = user.id dan orderdetail.orders = orderDersewhere orders.user_id = user.id.id.id.ider.orders.
Analisis: Gunakan Hasil Hasil untuk memetakan hasil kueri di atas ke POJO, dan informasi pesanan adalah duplikasi.
Persyaratan: Catatan duplikat tidak dapat terjadi untuk pemetaan pesanan.
Tambahkan Daftar <OrderDetail> Properti OrderDetails di kelas Pesanan.java.
Akhirnya, informasi pesanan akan dipetakan ke dalam pesanan, dan rincian pesanan yang sesuai dengan pesanan dipetakan ke properti pesanan yang dipesan dalam pesanan.
Jumlah pesanan yang dicatat dalam dipetakan adalah dua (informasi pesanan tidak diulang)
Properti OrderDetails di setiap pesanan menyimpan detail pesanan yang sesuai dengan pesanan.
Tambahkan Atribut Detail Pesanan Daftar di Ofert.java
Ordersmappercustom.xml
Definisi Hasil
Gunakan Extends Warisan tanpa mengkonfigurasi pemetaan informasi pesanan dan informasi pengguna di
Koleksi: Permintaan beberapa catatan untuk memetakan ke objek koleksi untuk kueri asosiasi
Properti: Peta permintaan asosiasi ke beberapa catatan ke cn.itcast.mybatis.po.orders properti mana yang dipetakan ke cn.itcast.mybatis.po.orders
OfType: Menentukan jenis yang memetakan ke Pojo di atribut koleksi daftar
<!-Hasil PM untuk Pesanan dan Rincian Pesanan diwarisi menggunakan Extends, dan tidak perlu mengonfigurasi pemetaan informasi pesanan dan informasi pengguna di dalamnya-> <resultMap type = "cn.itcast.mybatis.po.orders" Id = "PESANDANDERDERDETAILRESULTMAP" Extends = "orderserrresulrresultMappen"-----! tidak perlu mengonfigurasi pemetaan informasi pesanan dan informasi pengguna di dalamnya-> <!-Rincian Pesanan Informasi Permintaan Asosiasi Pesanan memiliki banyak detail. Untuk menggunakan koleksi koleksi ke peta: peta beberapa catatan ke properti objek koleksi: peta asosiasi kueri ke beberapa catatan ke cn.itcast.mybatis.po.orders Properti mana dari Type: Tentukan jenis peta pojo untuk daftar properti koleksi-> <Properti Collection = "OrderDetails" ofType = "cn.ituccast Identifier dari detail pesanan ke cn.itcast.mybatis.po.orderdetail-> <id kolom = "orderDetail_id" properti = "id"/> <hasil kolom = "items_id" properti = "itemsid"/> <hasil kolom = "items_num" properti = "itemsnum"/<columur orders = "orders_id =" orders = "orders =" orders = "orders ="
Ordersmappercustom.java
Kode Uji:
@Testpublic void testFindordersAndOrderDetailResultMap () melempar Exception {sqlsession sqlSession = sqlSessionFactory.opensession (); // buat proxy objek ordersmappercustom ordersmappercustom = sqlSession.getMapper (ordersmappercccleTom); sqlSession.getMapper (ordersmappercccleTom); sqlSession.getMapper (ordersmapperccl ordersmappercustom.findordersAndOrderDetailResultMap (); System.out.println (daftar); sqlSession.close ();}ringkasan
MyBatis menggunakan koleksi RACKMAP untuk memetakan beberapa catatan kueri terkait ke dalam properti koleksi daftar.
Implementasi Menggunakan HasilType:
Pemetaan detail pesanan ke dalam pesanan dalam pesanan, Anda perlu menanganinya sendiri, menggunakan loop ganda untuk melintasi, menghapus catatan duplikat, dan menempatkan rincian pesanan di urutan pesanan.
Banyak pertanyaan
Persyaratan: Permintaan pengguna dan informasi pembelian pengguna.
Pernyataan SQL
Tabel Utama Kueri adalah: Tabel Pengguna
Tabel Asosiasi: Karena pengguna dan produk tidak terkait langsung, mereka terkait melalui pesanan dan detail pesanan, sehingga tabel asosiasi: pesanan, pesanan, item
SELECT orders.*,USER.username,USER.sex,USER.address,orderdetail.id orderdetail_id,orderdetail.items_id,orderdetail.items_num,orderdetail.orders_id,items.name items_name,items.detail items_detail,items.price items_priceFROMorders,USER,orderdetail,itemsWHERE orders.user_id = user.id dan orderDetail.orders_id = orders.id dan orderDetail.items_id = items.id
Ide Pemetaan
Peta informasi pengguna ke pengguna.
Tambahkan Daftar Atribut Daftar Pesanan <Eders> Daftar Pesanan di kelas pengguna untuk memetakan pesanan yang dibuat oleh pengguna ke daftar pesanan
Tambahkan Detail Pesanan Daftar Properti Daftar Properti <OrderDetail> OrderDetials dalam pesanan untuk memetakan pesanandetials
Tambahkan Properti Item di OrderDetail untuk memetakan item yang sesuai dengan detail pesanan ke item
Ordersmappercustom.xml
Definisi Hasil
<!-Permintaan Pengguna dan Produk yang Dibeli-> <resultMap type = "cn.itcast.mybatis.po.user" id = "userAndItemsResultMap"> <!-Informasi pengguna-> <id kolom = "user_id" property = "id"/> <hasil kolom = "nama pengguna" properti = "nama pengguna"/> <" Properti = "Alamat"/> <!-Pesanan Informasi Pengguna sesuai dengan banyak pesanan, dan gunakan pemetaan koleksi-> <collection properti = "orderslist" ofType = "cn.itcast.mybatis.po.orders"> <id kolom = "Id" Properti = "ID"/> <Hasil Kolom = "User_ID" Properti "Properti =" User "/> <"/<"NOMERS =" NOMER "NOMER" NOMERS = "NOMER" PROUCLE = "NOMER" PROUCTER "NOMOR =" NOMER "PROPOCER =" NUGNER "NOMER" PROPOMER "NOMER" PROPOIM = "NOMER" NOMER "PROULTER =" properti = "createTime"/> <column hasil = "note" properti = "note"/> <!-rincian pesanan satu pesanan termasuk beberapa detail-> <collection properti = "orderDetails" ofType = "cn.itcast.mybatis.po.po.coulteil"> <id kolom = "orderDetail_id" properti = "id" <coult = "" items = "items =" items "items =" items "items =" items "/" items = "items =" items = "items =" ITEMS = "ITEMS =" ITEMS = "ITENTS =" ITENTS = "ITSOM =" ITENTS = "ITSOM =" properti = "itemsnum"/> <colom hasil = "orders_id" properti = "ordersid"/> <!-Informasi Produk Suatu detail pesanan sesuai dengan produk-> <asosiasi properti = "item" javatype = "cn.itcast.mybatis.po.items"> <id kolom = "items_id" properti = "ID"/> <po.po. kolom = "items_detail" properti = "detail"/> <hasil kolom = "items_price" properti = "harga"/> </association> </collection> </colly> </richmap>
Ordersmappercustom.java
Kode Uji:
@Testpublic void testFindUserAndItemsResultMap () melempar Exception {sqlSession sqlsession = sqlSessionFactory.opensession (); // Buat proxy Object ordersmappercustom ordersmappercustom = sqlSession.getMapper (ordersmapperccl ordersmappercustom.finduseranditemsResultMap (); system.out.println (daftar); sqlsession.close ();} Ringkasan kueri banyak-ke-banyak
Daftar terperinci informasi produk yang dibeli oleh pengguna akan diperiksa (nama pengguna, alamat pengguna, nama produk, waktu pembelian, jumlah pembelian)
Menanggapi persyaratan di atas, kami menggunakan HasilType untuk memetakan catatan kueri ke POJO yang diperluas, yang sangat mudah untuk mengimplementasikan fungsi daftar terperinci.
Satu-ke-banyak adalah kasus khusus banyak-ke-banyak, sebagai berikut:
Saat menanyakan informasi produk yang dibeli oleh pengguna, hubungan antara pengguna dan produk adalah hubungan banyak-ke-banyak.
Persyaratan 1:
Bidang Kueri: Akun Pengguna, Nama Pengguna, Jenis Kelamin Pengguna, Nama Produk, Harga Produk (Paling Umum)
Daftar rinci umum dalam pengembangan perusahaan, daftar rinci produk yang dibeli oleh pengguna,
Gunakan hasil Hasil untuk memetakan kolom kueri di atas ke output POJO.
Persyaratan 2:
Bidang kueri: Akun pengguna, nama pengguna, jumlah item yang dibeli, detail produk (mouse on untuk menampilkan detail)
Gunakan HasilMap untuk memetakan daftar detail produk yang dibeli pengguna ke objek pengguna.
Meringkaskan:
Menggunakan HasilMap adalah untuk fungsi -fungsi yang memiliki persyaratan khusus untuk pemetaan hasil kueri, seperti pemetaan persyaratan khusus ke dalam daftar termasuk beberapa daftar.
Ringkasan Hasil Hasil dan Hasilmap
Hasil Hasil:
memengaruhi:
Peta hasil kueri ke pojo sesuai dengan nama kolom SQL Pojo Atribut Name Konsistensi.
kesempatan:
Tampilan umum catatan terperinci, seperti ketika pengguna membeli detail produk dan menampilkan semua informasi kueri terkait pada halaman, Anda dapat langsung menggunakan hasil Hasil untuk memetakan setiap catatan.
Tembak ke pojo, dan lintasi daftar (pojo dalam daftar) di halaman front-end.
Hasil Hasil:
Gunakan Asosiasi dan Pengumpulan untuk menyelesaikan pemetaan satu-ke-satu dan satu-ke-banyak (ada persyaratan pemetaan khusus untuk hasilnya).
asosiasi:
memengaruhi:
Peta informasi kueri yang terkait ke dalam objek PoJo.
kesempatan:
Untuk memfasilitasi kueri informasi terkait, Anda dapat menggunakan asosiasi untuk memetakan informasi pesanan terkait ke atribut POJO objek pengguna, seperti: meminta pesanan dan informasi pengguna terkait.
Menggunakan resultType tidak dapat memetakan hasil kueri ke atribut POJO dari objek POJO. Pilih apakah akan menggunakan HRESSTYPE atau RACKMAP sesuai dengan kebutuhan melintasi kueri yang ditetapkan hasil.
Koleksi:
memengaruhi:
Peta informasi kueri terkait ke dalam koleksi daftar.
kesempatan:
Untuk memfasilitasi informasi Asosiasi Traversal, Anda dapat menggunakan koleksi untuk memetakan informasi asosiasi ke koleksi daftar, seperti: Meminta Modul Lingkup Izin Pengguna dan menu di bawah modul, Anda dapat menggunakan koleksi untuk memetakan daftar modul untuk memetakan atribut daftar menu dari objek modul. Tujuan dari ini juga untuk memfasilitasi permintaan traversal yang ditetapkan hasil kueri.
Jika Anda menggunakan HasilType, Anda tidak dapat memetakan hasil kueri ke koleksi daftar.
Tunda pemuatan
RACKMAP dapat mengimplementasikan pemetaan lanjutan (menggunakan asosiasi dan pengumpulan untuk mengimplementasikan pemetaan satu-ke-satu dan satu-ke-banyak). Asosiasi dan koleksi memiliki fungsi pemuatan malas.
membutuhkan:
Jika pesanan ditanya dan informasi pengguna terkait. Jika pertama -tama kami meminta informasi pesanan untuk memenuhi persyaratan, kami akan meminta informasi pengguna ketika kami perlu meminta informasi pengguna. Meminta informasi pengguna tentang permintaan ditunda pemuatan.
Penundaan pemuatan: Kueri pertama dari satu tabel, dan kemudian dari tabel terkait saat dibutuhkan, sangat meningkatkan kinerja basis data, karena menanyakan satu tabel lebih cepat daripada menanyakan beberapa tabel.
Gunakan asosiasi untuk mengimplementasikan pemuatan malas
Persyaratan: Permintaan Permintaan dan Associate Query Informasi Pengguna
Ordresmappercustom.xml
Penting untuk mendefinisikan pernyataan yang sesuai dengan dua metode mapper.
1. Hanya informasi pemesanan kueri
Pilih * dari pesanan
Gunakan Asosiasi untuk Menunda Pemuatan (Eksekusi) Kepuasan berikut (Informasi Pengguna Asosiasi Kueri) dalam Pernyataan Pesanan Kueri
2. Informasi Pengguna Kueri Terkait
User_id digunakan untuk meminta informasi pengguna dengan mengikuti user_id dalam permintaan informasi pesanan di atas
Gunakan findUserbyId di usermapper.xml
Yang pertama di atas mengeksekusi findordersuserLazyloading, dan ketika Anda perlu meminta pengguna, kemudian mengeksekusi findUserById, dan pemuatan dan eksekusi yang tertunda dikonfigurasi melalui definisi HasilMap.
Tunda memuat hasil hasil
Gunakan Pilih di Asosiasi untuk menentukan ID pernyataan yang akan dieksekusi dengan pemuatan malas.
<!-Lazy Loaded ResultMap-> <resultMap type = "cn.itcast.mybatis.po.orders" id = "ORDERSUSERLAZYINGRESULTMAP"> <!-pemetaan konfigurasi informasi pesanan-> <id kolom = "id" Property = "id"/<hasil kolom = "User_id" PROPERTIing = "NOMOR" APOVER "" NOMER "" NOMER "/ID"/<Hasil Kolom = "User_ID" PROPERTI "USERID =" column="createtime" property="createtime"/><result column="note" property="note"/><!-- Mapping configuration of order information--><id column="id" property="user_id" property="userId"/><result column="number" property="number"/><result column="createtime"/><result column="note" property="note"/><!-- Implement delay loading of user information
Pilih: Tentukan ID dari pernyataan yang akan dieksekusi untuk pemuatan malas (pernyataan yang meminta informasi pengguna berdasarkan user_id)
Untuk menggunakan findUserbyId di usermapper.xml untuk menyelesaikan kueri berdasarkan informasi pengguna ID pengguna (user_id). Jika findUserbyId tidak ada di mapper ini, Anda perlu menambahkan namespace sebelumnya.
Kolom: Kolom dalam informasi pesanan yang terkait dengan kueri informasi pengguna adalah user_id
SQL untuk kueri asosiasi dipahami sebagai:
Pilih pesanan.*, (Pilih Nama Pengguna dari Pengguna Where orders.user_id = user.id) nama pengguna, (pilih seks dari pengguna di mana orders.user_id = user.id) order dari order-> <asosiasi properti = "pengguna" javatype = "cn.itcast.mybatis.po.user" select = "cn.mappers.mybatis.po.user" select = "cn. kolom = "user_id"> <!-Menerapkan pemuatan malas informasi pengguna-> </association> </resultMap>
Orderesmappercustom.java
Ide Tes:
1. Jalankan metode mapper di atas (findordersUserLazyLoading), dan hubungi findordersuserLazyLoading di cn.itcast.mybatis.mapper.ordersmapperccustom untuk hanya meminta informasi pesanan (tabel tunggal).
2. Dalam program ini, lintasi daftar <desers> diminta pada langkah sebelumnya. Ketika kami memanggil metode GETUSER dalam pesanan, kami mulai memuat malas.
3. Penundaan pemuatan, hubungi metode findUserbyId di usermapper.xml untuk mendapatkan informasi pengguna.
Konfigurasi muatan malas
Mybatis tidak mengaktifkan pemuatan malas secara default, dan perlu dikonfigurasi di sqlmapconfig.xml.
Konfigurasi dalam file konfigurasi inti myBatis:
Setel Item Deskripsi Nilai yang Diizinkan Nilai Default
LazyloadingEnabled secara global mengatur pemuatan malas. Jika diatur ke 'false', semua yang terkait akan diinisialisasi dan dimuat. benar atau salah
agresivelazyloading saat diatur ke 'benar', objek pemuatan malas dapat dimuat oleh semua properti malas. Kalau tidak, setiap properti dimuat sesuai kebutuhan. Benar atau Salah Benar
Config di sqlmapconfig.xml:
Kode uji
Memikirkan tentang pemuatan yang tertunda
Bagaimana cara mencapai pemuatan malas tanpa menggunakan asosiasi dan koleksi yang disediakan oleh mybatis?
Metode implementasi adalah sebagai berikut:
Tentukan dua metode mapper:
1. Permintaan daftar pesanan
2. Informasi Pengguna Permintaan Berdasarkan ID Pengguna
Ide Implementasi:
Pertama periksa metode mapper pertama dan dapatkan daftar informasi pesanan
Dalam program (Layanan), hubungi metode mapper kedua sesuai kebutuhan untuk meminta informasi pengguna.
Singkatnya: Gunakan metode pemuatan malas untuk menanyakan SQL sederhana (lebih disukai satu tabel, Anda juga dapat mengaitkan kueri), dan kemudian memuat informasi lain dari kueri terkait sesuai kebutuhan.
Cache kueri
MyBatis menyediakan cache kueri untuk mengurangi tekanan data dan meningkatkan kinerja basis data.
MyBaits menyediakan cache tingkat pertama dan cache tingkat kedua.
Cache Level 1 adalah cache tingkat SQLSESSION. Saat mengoperasikan database, Anda perlu membangun objek SQLSession, dan ada struktur data (HashMap) di objek untuk menyimpan data yang di -cache. Area data yang di -cache (hashmaps) antara berbagai sqlsessions tidak saling mempengaruhi.
Cache sekunder adalah cache tingkat mapper. Beberapa SQLSesi mengoperasikan pernyataan SQL dari mapper yang sama. Beberapa sqlsessions dapat berbagi cache sekunder. Cache sekunder adalah cross-sqlsession.
Mengapa Menggunakan Cache?
Jika ada data dalam cache, Anda tidak perlu mendapatkannya dari database, yang sangat meningkatkan kinerja sistem.
Cache level 1
Prinsip Kerja Caching Tingkat Pertama
Pertama kali saya memulai kueri tentang informasi pengguna dengan ID Pengguna 1, pertama -tama cari apakah ada informasi pengguna dengan informasi pengguna dengan ID 1 di cache. Jika tidak, permintaan informasi pengguna dari database.
Dapatkan informasi pengguna dan simpan informasi pengguna dalam cache tingkat pertama.
Jika SQLSession melakukan operasi komit (jalankan penyisipan, perbarui, dan hapus), menghapus cache tingkat pertama di SQLSession. Tujuan dari ini adalah untuk membuat Cache menyimpan informasi terbaru dan menghindari pembacaan kotor.
Kali kedua saya memulai kueri tentang informasi pengguna dengan ID Pengguna 1, pertama -tama cari apakah ada informasi pengguna dengan informasi pengguna dengan ID 1 di cache. Jika ada satu di cache, saya akan langsung mendapatkan informasi pengguna dari cache.
Pengujian Cache Level 1
MyBatis mendukung caching tingkat pertama secara default dan tidak perlu dikonfigurasi dalam file konfigurasi.
Ikuti langkah prinsip cache level satu di atas untuk diuji.
//Ordersmappercusntomtest.java@testpublic void testcache1 () melempar pengecualian {sqlsession sqlsession = sqlsessionfactory.opensession (); // membuat objek proxy usermapper usersession = sqlsession.getmapper (usermapper.class); Pengguna dengan ID 1 adalah User User User1 = usermapper.findUserbyId (1); System.out.println (user1); // Jika SQLSession melakukan operasi komit (menjalankan penyisipan, pembaruan, dan hapus), menghapus cache tingkat pertama dalam SQLSesi. Tujuan dari ini adalah untuk membuat Cache menyimpan informasi terbaru dan menghindari pembacaan kotor. // Perbarui Informasi User1 User1.setUserName ("Uji User22"); usermapper.updateUser (user1); // menjalankan operasi komit untuk menghapus cache sqlsession.commit (); // Mulai permintaan kedua dan permintaan pengguna dengan ID 1 pengguna pengguna2 = usermapper.finduserbyid (1); System.out.println (user2); sqlsession.close ();Aplikasi Cache Level 1
Pengembangan formal adalah untuk mengintegrasikan mybatis dan pegas, dan transaksi dikendalikan dalam layanan.
Metode layanan mencakup banyak panggilan metode mapper.
Layanan {// Saat memulai eksekusi, mulai transaksi dan buat objek SQLSESSION // Panggil metode Mapper untuk pertama kalinya FindUserbyId (1) // sel Metode Mapper untuk kedua kalinya FindUserbyId (1), mengambil data dari cache tingkat pertama // Metode berakhir, SQLSESSES TOLD} ditutup} ditutup}}Jika Anda menjalankan dua panggilan layanan untuk menanyakan informasi pengguna yang sama, Anda tidak pergi ke cache tingkat pertama, karena metode sesi berakhir, SQLSession akan ditutup dan cache tingkat pertama akan dihapus.
Cache level 2
prinsip
Pertama, aktifkan cache tingkat kedua dari mybatis.
SQLSESSION1 INFORMASI PENGGUNA PENGGUNA dengan ID Pengguna 1. Saat meminta informasi pengguna, data kueri akan disimpan dalam cache sekunder.
Jika SQLSession3 mengeksekusi SQL di bawah peta yang sama, menjalankan pengajuan komit dan menghapus data di area cache sekunder di bawah mapper.
SQLSESSION2 meminta informasi pengguna dengan ID pengguna 1, dan menemukan apakah ada data dalam cache. Jika ada, data secara langsung diambil dari cache.
Perbedaan antara cache sekunder dan cache primer lebih besar. Kisaran cache sekunder lebih besar. Beberapa sqlsessions dapat berbagi area cache sekunder USERMapper.
Usermapper memiliki area cache sekunder (dibagi lagi oleh namespace), dan pemetaan lainnya juga memiliki area cache sekunder mereka sendiri (dibagi oleh namespace).
Setiap mapper namespace memiliki area cache kedua. Jika namespace dari dua pemetaan adalah sama, kedua pemetaan akan memiliki area cache kedua yang sama ketika data dieksekusi oleh SQL.
Nyalakan cache level 2
Cache tingkat kedua dari mybaits adalah level rentang mapper. Selain mengatur sakelar utama cache tingkat kedua di sqlmapconfig.xml, cache tingkat kedua juga harus diaktifkan dalam mapper.xml spesifik.
Ditambahkan ke file konfigurasi inti sqlmapconfig.xml
<pengaturan nama = "Cacheenabled" value = "true"/>
Deskripsi Nilai Nilai Default yang Diizinkan
Pengaturan ON/OFF secara global untuk semua cache di bawah file konfigurasi ini. benar atau salah
Nyalakan cache sekunder di usermapper.xml, dan eksekusi SQL di bawah usermapper.xml akan disimpan di area cache (hashmap).
Hubungi kelas Pojo untuk mengimplementasikan antarmuka serialisasi
Untuk mengekstrak data yang di -cache, operasi deserialisasi dilakukan, karena media penyimpanan data yang di -cache sekunder beragam dan berbeda dalam memori.
Tes cache level 2
@Testpublic void testCache2 () melempar Exception {sqlsession sqlsession1 = sqlsessionFactory.opensession (); sqlsession sqlsession2 = sqlsessionFactory.opensession (); sqlsession SQLSESSESSESSESSESSESSESSESSESSESSESSESSESSESSESSESSESSESSESSESSESSESSESSESSESSESSISESSESSISESSION telah sqlSession1.getMapper(UserMapper.class);// Initiate the first request and query the user with id 1 User user1 = userMapper1.findUserById(1);System.out.println(user1);//Execute the close operation here and write the data in the sqlsession to the secondary cache area sqlSession1.close();//Use sqlSession3 to execute the commit () Operation Usermapper usermapper3 = sqlSession3.getmapper (usermapper.class); pengguna pengguna = usermapper3.finduserbyid (1); user.setusername ("zhang mingming"); usermapper3.updateuser (pengguna); // Eksekusi pengiriman dan hapus cacak kedua di bawah USMPperper (pengguna); // SQLSESSION3.Commit (); sqlSession3.close (); usermapper usermapper2 = sqlSession2.getMapper (usermapper.class); // Kirim permintaan kedua untuk meminta pengguna dengan pengguna ID 1 pengguna2 = USERMAPPER2.FINDUSED (1); System.out.println (User2); SQ); SQ (1); System.Konfigurasi Usecache
Pengaturan usecache = false dalam pernyataan tersebut dapat menonaktifkan cache sekunder dari pernyataan SELECT saat ini, yaitu, setiap kueri akan mengeluarkan SQL untuk meminta. Standarnya benar, yaitu SQL menggunakan cache sekunder.
<Pilih id = "FindOrderListresUntMap" RAFTMAP = "ORDERSUSERMAP" USECACHE = "FALSE">
Ringkasan: Untuk setiap kueri, SQL data terbaru diperlukan. Atur ke usecache = false dan nonaktifkan cache sekunder.
Segarkan cache
Hapus saja cache
Dalam namespace mapper yang sama, jika ada insert, perbarui, atau data operasi lainnya, cache perlu disegarkan, dan jika cache tidak disegarkan, pembacaan kotor akan terjadi.
Atur properti flushCache = "true" dalam konfigurasi pernyataan. Secara default, memang benar, yang berarti cache disegarkan. Jika diubah menjadi salah, itu tidak akan menyegarkan. Saat menggunakan cache, bacaan kotor akan terjadi jika Anda secara manual memodifikasi data kueri di tabel database.
<insert id = "insertUser" parameTerType = "cn.itcast.mybatis.po.user" flushcache = "true">
Ringkasan: Secara umum, setelah menjalankan operasi komit, cache perlu disegarkan. FlushCache = true berarti menyegarkan cache, yang dapat menghindari pembacaan basis data yang kotor.
Integrasi mybatis ehcache
Ehcache adalah kerangka kerja caching terdistribusi.
Cache terdistribusi
我们系统为了提高系统并发,性能、一般对系统进行分布式部署(集群部署方式)
不使用分布缓存,缓存的数据在各各服务单独存储,不方便系统开发。所以要使用分布式缓存对缓存数据进行集中管理。
mybatis无法实现分布式缓存,需要和其它分布式缓存框架进行整合。
整合ehcache方法(掌握)
mybatis提供了一个cache接口,如果要实现自己的缓存逻辑,实现cache接口开发即可。
mybatis和ehcache整合,mybatis和ehcache整合包中提供了一个cache接口的实现类。
mybatis默认实现cache类是:
加入ehcache包
整合ehcache
配置mapper中cache中的type为ehcache对cache接口的实现类型。
加入ehcache的配置文件(在classpath下配置ehcache.xml)
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"><diskStore path="F:/develop/ehcache" /><defaultCache maxElementsInMemory="1000" maxElementsOnDisk="10000000"eternal="false" overflowToDisk="false" timeToIdleSeconds="120"timeToLiveSeconds="120" diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"></defaultCache></ehcache>
属性说明:
diskStore:指定数据在磁盘中的存储位置。
defaultCache:当借助CacheManager.add(“demoCache”)创建Cache时,EhCache便会采用<defalutCache/>指定的的管理策略
以下属性是必须的:
maxElementsInMemory - 在内存中缓存的element的最大数目
maxElementsOnDisk - 在磁盘上缓存的element的最大数目,若是0表示无穷大
eternal - 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断
overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
以下属性是可选的:
timeToIdleSeconds - 当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时,这些数据便会删除,默认值是0,也就是可闲置时间无穷大
timeToLiveSeconds - 缓存element的有效生命期,默认是0.,也就是element存活时间无穷大
diskSpoolBufferSizeMB 这个参数设置DiskStore(磁盘缓存)的缓存区大小.默认是30MB.每个Cache都应该有自己的一个缓冲区.
diskPersistent - 在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。
diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作
memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)
二级应用场景
对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。
实现方法如下:通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔flushInterval,比如设置为30分钟、60分钟、24小时等,根据需求而定。
二级缓存局限性
mybatis二级缓存对细粒度的数据级别的缓存实现不好,比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息,因为mybaits的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。解决此类问题需要在业务层根据需求对数据有针对性缓存。