Artikel ini adalah pengetahuan tentang kelas entitas dan masalah pemetaan tabel di Mybatis kepada Anda oleh editor. Mempelajari tutorial ini dapat dengan cepat membantu kita memecahkan masalah konflik dari nama bidang bidang dan kelas entitas yang berbeda. Teman yang membutuhkannya, mari kita lihat!
1. Siapkan tabel dan data yang akan digunakan untuk demonstrasi
CREATE TABLE orders(order_id INT PRIMARY KEY AUTO_INCREMENT,order_no VARCHAR(20), order_price FLOAT);INSERT INTO orders(order_no, order_price) VALUES('aaaa', 23);INSERT INTO orders(order_no, order_price) VALUES('bbbb', 33);INSERT INTO orders(order_no, order_price) VALUES('cccc', 22);2. Tentukan kelas entitas
Paket me.gacl.domain;/*** @author gacl*Tentukan kelas entitas yang sesuai dengan tabel pesanan*/pesanan kelas publik {/*** Buat pesanan tabel (order_id int utama auto_increment, order_no varchar (20), order_price float);*/// name atribut di dalam order dan name order; // id ===> order_idprivate string orderno; // orderno ===> order_noprivate harga float; //price===>order_pricepublic int getId() {return id;}public void setId(int id) {this.id = id;}public String getOrderNo() {return orderNo;}public void setOrderNo(String orderNo) {this.orderNo = orderNo;}public float getPrice() {return price;}public void setPrice(float price) {this.price = harga;}@overridepublic string toString () {return "order [id =" + id + ", ordno =" + orderno + ", price =" + price + "]";}}3. Tulis kode tes
3.1. Tulis file pemetaan SQL XML
1. Buat file ordermapper.xml. Konten ordermapper.xml adalah sebagai berikut:
<? Xml Version = "1.0" encoding = "UTF-8"?> <! Doctype mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">-- ...------------Mapperse. Nilai namespace secara konvensional diatur ke nama paket + nama file pemetaan SQL, sehingga nilai namespace dapat dijamin unik
Misalnya, namespace = "me.gacl.mapping.ordermapper" adalah me.gacl.mapping (nama paket) + ordermapper (ordermapper.xml file untuk menghapus akhiran)
-> <mapper namespace = "me.gacl.mapping.ordermapper"> <!-Dapatkan objek pesanan berdasarkan kueri ID. Menggunakan kueri ini tidak dapat meminta hasil yang kami inginkan. Ini terutama karena nama atribut dari kelas entitas tidak sesuai dengan nama bidang database, sehingga catatan yang sesuai tidak dapat ditanya-> <pilih id = "getorderbyId" parameTerType = "int" resultType = "me.gacl.domain.order"> Pilih * dari pesanan di mana order_id =#{id} </select> </domain.order " Dengan menggunakan kueri ini, kami biasanya dapat meminta hasil yang kami inginkan. Ini karena kami akan memberikan alias kueri dengan alias yang sama dengan nama atribut kelas entitas, sehingga nama atribut dari kelas entitas dan nama bidang dalam hasil kueri dapat sesuai satu per satu-> <pilih id = "selectorder" ParameterType = "int" hasil = "Me.gacl.domain.order"> ParameterType = "int" int "hasil =" Me.Gacl.domain.order "> ParameterType =" int "int" iRACTEP = "ME.GACL.Domain.order"> ParameterType = "int" int "iNRESTYE =" ME.GACL.DOMAIN "order"> ParameterType = "int" int "iRACTY =" ME.GACL.DOMAIN "order"> ParameterType = "int" INF " order_id =#{ID} </pilih> <!- Dapatkan objek pesanan berdasarkan kueri ID. Dengan menggunakan kueri ini, kami dapat meminta hasil yang kami inginkan secara normal. Ini karena kami memetakan korespondensi satu-ke-satu antara nama atribut kelas entitas dan nama bidang tabel melalui <resultMap> -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- kolom = "order_id"/> <!-Gunakan atribut hasil untuk memetakan bidang kunci non-primer-> <properti result = "orderno" kolom = "order_no"/> <properti hasil = "harga" kolom = "order_price"/> <properti hasil = "harga" kolom = "order_price"/<resultMap> </mapper>2. Daftarkan file pemetaan ordermapper.xml di file conf.xml
<petpers> <!- Daftarkan file ordermapper.xml. Ordermapper.xml terletak di paket me.gacl.mapping, jadi sumber daya ditulis sebagai me/gacl/pemetaan/ordermapper.xml-> <mapper resource = "me/gacl/pemetaan/ordermapper.xml"/> </pappers>
3.2. Tulis kode uji unit
Paket me.gacl.test; impor me.gacl.domain.order; impor me.gacl.util.mybatisutil; impor org.apache.iatis.Session.sqlsession; impor org.junit.test; test kelas publik {@testpublic void testgetorderDyid () {sqqesession sqsession SQSESSION SQUSESSION SQUCESSION SUDSESSION SUBSESSIONCLIC VOIDLIC VOID TESTGETORDERDYID () {SQUSESSION SQUSESSION SQUSESSION SQESIONSESSIONDSESSES Mybatisutil.getsqlSession ();/*** String identifikasi untuk pemetaan SQL,* Me.Gacl.Mapping.OrderMapper adalah nilai atribut namespace dari tag mapper dalam file ordermapper.xml,* getorderbyid adalah nilai atribut ID dari tag terpilih. Melalui nilai atribut ID dari tag SELECT, Anda dapat menemukan SQL untuk dieksekusi*/string pernyataan = "me.gacl.mapping.ordermapper.getorderById"; // Memetakan string identifikasi SQL // Jalankan Operasi Kueri dan secara otomatis merangkum hasil query ke dalam objek pesanan dan mengembalikan pesanan pesanan = SQLSESSES. SQLSession Execute SQL, Anda perlu menutup SQLSESSIONSQLSESSION.CLOSE (); System.out.println (pesanan); // Hasil Cetak: NULL, yaitu, tidak ada catatan yang sesuai ditemukan} @testpublic void testgetOrderById2 () {sqlsession sqlsession = mybatisutil.getsqlSession ();/*** peta string identifikasi sql,* me.gacl.mapping file ordermapper.xml, * selectorder adalah nilai atribut ID dari tag pilih. Melalui nilai atribut ID dari tag SELECT, Anda dapat menemukan SQL untuk dieksekusi dengan menggunakan nilai atribut ID dari tag pilih*/Pernyataan string = "me.gacl.mapping.ordermapper.selectorder"; // Memetakan SQL Identity String // Execute the Query Operation dan secara otomatis meringkas query menghasilkan objek Order dan Return The Order dengan order = LURETEDE (1 Laporan. ID 1 dalam tabel pesanan // Setelah menjalankan SQL menggunakan SQLSession, Anda perlu menutup SQLSessionQLSession.close (); System.out.println (pesanan); // hasil cetak: order [id = 1, orderno = aaaa, harga = 23.0]}@testpublic void testGetOrderById3 () {sqlsession sqlsession = mybatisutil.getsqlSession ();/*** peta sqlsession = mybatisutil.getsqlSession ();/*** peta sqlsession,* mAPiPer. Atribut tag mapper dalam file ordermapper.xml, * selectorderResultMap adalah nilai atribut ID dari tag pilih. Melalui nilai atribut ID dari tag SELECT, SQL yang akan dijalankan dapat ditemukan*/string pernyataan = "me.gacl.mapping.orderMapper.SelectorderResultMap"; // Memetakan SQL Identity String // Execute query Operation, dan secara otomatis merangkum hasil kueri ke dalam objek urutan dan urutan pengembalian urutan = SQLSECESSIONE. Tabel // Setelah menggunakan SQLSession untuk mengeksekusi SQL, Anda perlu menutup SQLSessionqlSession.close (); System.out.println (pesanan); // Cetak Hasil: Pesan [id = 1, orderno = aaaa, harga = 23.0]}}Hasil pelaksanaan tes unit:
1. Metode TestGetOrderById mengembalikan nol setelah menjalankan kueri.
2. Setelah metode testGetOrderById2 dan metode testGetOrderById3 menjalankan kueri, Anda bisa mendapatkan hasil yang diinginkan secara normal.
4. Ringkasan
Kode pengujian di atas menunjukkan masalah bahwa ketika nama atribut di kelas entitas dan nama bidang dalam tabel tidak konsisten, hasil yang sesuai tidak dapat ditanya saat menggunakan mybatis untuk operasi kueri, dan dua metode diadopsi untuk masalah:
Solusi 1: Tentukan alias nama bidang dalam pernyataan Query SQL, sehingga alias nama bidang konsisten dengan nama atribut kelas entitas, sehingga nama bidang tabel dapat sesuai satu per satu dengan nama atribut kelas entitas. Metode ini memecahkan hubungan pemetaan antara nama bidang dan nama atribut dengan mendefinisikan alias dalam pernyataan SQL.
Solusi 2: Peta korespondensi satu-ke-satu antara nama bidang dan nama atribut kelas entitas dengan pemetaan. Metode ini menggunakan solusi yang disediakan oleh MyBatis untuk menyelesaikan hubungan pemetaan antara nama bidang dan nama atribut.