Berbagi teknologi

[MyBatis] Teori MyBatis 40 soal (2)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Teori MyBatis 40 pertanyaan》Berisi 2 artikel berikut:


Teori MyBatis 40 pertanyaan (2)

21. Bagaimana cara mendapatkan kunci utama yang dihasilkan?

Tambahkan tag baru:keyProperty=“ID” Itu dia.

<insert id="insert" useGeneratedKeys="true" keyProperty="userId" >
	insert into user(user_name, user_password, create_time)
	values(#{userName}, #{userPassword} , #{createTime, jdbcType=TIMESTAMP})
</insert>
  • 1
  • 2
  • 3
  • 4

22.KapanKelas entitasApa yang harus saya lakukan jika nama atribut berbeda dengan nama field di tabel?

(1) Dengan bertanya Bahasa Indonesia: SQL Tentukan alias nama bidang dalam pernyataan untuk membuat alias nama bidang konsisten dengan nama atribut kelas entitas.

<select id="getOrder" parameterType="int" resultType="com.jourwon.pojo.Order">
	select order_id id, order_no orderno, order_price price form orders
	where order_id=#{id};
</select>
  • 1
  • 2
  • 3
  • 4

(2) Lulus <resultMap> Untuk memetakan korespondensi satu-ke-satu antara nama field dan nama atribut kelas entitas.

<select id="getOrder" parameterType="int" resultMap="orderResultMap">
	select * from orders where order_id=#{id}
</select>

<resultMap type="com.jourwon.pojo.Order" id="orderResultMap">
	<!-- 用id属性来映射主键字段 -->
	<id property="id" column="order_id">
	<!-- 用result属性来映射非主键字段,property为实体类属性名,column为数据库表中的属性 -->
	<result property="orderno" column="order_no" />
	<result property="price" column="order_price" />
</reslutMap>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

23.Apa saja cara menulis Mapper?

(1) Warisan kelas implementasi antarmuka SqlSessionDaoSupport: Untuk menggunakan metode ini, Anda perlu menulis mapper antarmuka,mapper Kelas implementasi antarmuka,mapper.xml dokumen.

  • ada sqlMapConfig.xml Konfigurasi sedangmapper.xml posisi.
<mappers>
	<mapper resource="mapper.xml 文件的地址" />
	<mapper resource="mapper.xml 文件的地址" />
</mappers>
  • 1
  • 2
  • 3
  • 4
  • definisi mapper antarmuka.
  • Menerapkan integrasi kelas SqlSessionDaoSupportmapper Dapat digunakan dalam metodethis.getSqlSession() Melakukan penambahan data, penghapusan, modifikasi dan pengecekan.
  • spring konfigurasi.
<bean id=" " class="mapper 接口的实现">
	<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
  • 1
  • 2
  • 3

(2) Gunakan org.mybatis.spring.mapper.MapperFactoryBean

  • ada sqlMapConfig.xml Konfigurasi sedangmapper.xml posisi jikamapper.xml Danmapper Antarmuka memiliki nama yang sama dan berada di direktori yang sama, jadi tidak diperlukan konfigurasi di sini.
  • definisi mapper antarmuka.
<mappers>
	<mapper resource="mapper.xml 文件的地址" />
	<mapper resource="mapper.xml 文件的地址" />
</mappers>
  • 1
  • 2
  • 3
  • 4
  • mapper.xml tengahnamespace untukmapper Alamat antarmuka.
  • mapper Nama metode di antarmuka danmapper.xml didefinisikan dalamstatement dariid konsisten.
  • Spring didefinisikan dalam.
<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
	<property name="mapperInterface" value="mapper 接口地址" />
	<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
  • 1
  • 2
  • 3
  • 4

(3) Gunakan mapper pemindai.

  • mapper.xml Penulisan dokumen.
    • mapper.xml tengahnamespace untukmapper Alamat antarmuka;
    • mapper Nama metode di antarmuka danmapper.xml didefinisikan dalamstatement dariid konsisten;
    • Jika mapper.xml Danmapper Jika nama antarmuka tetap konsisten, hal ini tidak perlu dilakukansqlMapConfig.xml Konfigurasikan di .
  • definisi mapper antarmuka.Melihatmapper.xml nama file danmapper Nama antarmuka harus konsisten dan ditempatkan di direktori yang sama.
  • Konfigurasi mapper pemindai.
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="mapper 接口包地址"></property>
	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
  • 1
  • 2
  • 3
  • 4
  • Setelah menggunakan pemindai dari spring Dapatkan dari wadahmapper objek implementasi.

24.Apa itu MyBatis pengikatan antarmuka? Apa saja metode implementasinya?

Pengikatan antarmuka adalah mendefinisikan antarmuka secara sewenang-wenang di MyBatis, dan kemudian menggabungkan metode dalam antarmuka dengan SQL penyataanMengikat, kita bisa langsung memanggil metode antarmuka, jadi dibandingkan dengan aslinya SqlSession Metode yang diberikan memungkinkan kita memiliki pilihan dan pengaturan yang lebih fleksibel.

Ada dua cara untuk mengimplementasikan pengikatan antarmuka:

  • Mengikat melalui anotasi adalah menambahkan @Select@Update Tunggu anotasi yang berisi pernyataan SQL untuk diikat;
  • lulus xml Tulis SQL di dalam untuk mengikatxml dalam file pemetaannamespace Harus berupa nama path lengkap antarmuka.Jika pernyataan SQL relatif sederhana, gunakan pengikatan anotasi. Jika pernyataan SQL relatif rumit, gunakanxml Mengikat, penggunaan umumxml Ada lebih banyak ikatan.

25. Apa saja persyaratan untuk menelepon menggunakan antarmuka mapper MyBatis?

  • Nama metode antarmuka mapper dan mapper.xml dari setiap sql yang didefinisikan diid sama.
  • Jenis parameter masukan metode antarmuka Mapper dan mapper.xml dari setiap sql yang didefinisikan diparameterType dari tipe yang sama.
  • Jenis parameter keluaran metode antarmuka Mapper dan mapper.xml dari setiap sql yang didefinisikan diresultType dari tipe yang sama.
  • Mapper.xml dalam berkasnamespace Itu adalah jalur kelas antarmuka Mapper.

26. Bagaimana cara kerja antarmuka Dao ini? Jika metode di antarmuka Dao memiliki parameter yang berbeda, dapatkah metode tersebut kelebihan beban?

  • Prinsip kerja antarmuka Dao adalah proxy dinamis JDK akan menggunakan proxy dinamis JDK untuk menghasilkan proxy untuk antarmuka Dao saat dijalankan. proxy objek, objek proksiproxy Metode antarmuka akan dicegat dan dieksekusiMappedStatement mewakili SQL, dan kemudian mengembalikan hasil eksekusi SQL.
  • Metode di antarmuka Dao tidak dapat dibebani secara berlebihan karena Nama yang sepenuhnya memenuhi syarat + nama metode Menyimpan dan menemukan strategi.

27. Pada file pemetaan Xml MyBatis, apakah id dapat diulang di file pemetaan Xml yang berbeda?

  • File pemetaan Xml berbeda, jika dikonfigurasi namespace,Jadi id Dapat diulang; jika tidak dikonfigurasinamespace,Jadi id tidak bisa diulang;namespace Tidak wajib, hanya praktik terbaik.
  • Alasannya adalah namespace + id adalah sebagai Peta &lt; String, Pernyataan yang Dipetakan &gt; Peta<String, MappedStatement>MAP<StRdi dalamG,MAhal.Bahasa Inggris:DStATBahasa Inggris:MBahasa Inggris:NT> Kunci yang akan digunakan, jika tidak adanamespace, hanya tersisa id,Jadi,id Duplikasi dapat menyebabkan data saling menimpa.Mengertinamespace,alam id Anda bisa mengulanginya,namespace berbeda,namespace + id Tentu saja berbeda.

28. Jelaskan secara singkat hubungan pemetaan antara file pemetaan Xml MyBatis dan struktur data internal MyBatis?

MyBatis merangkum semua informasi konfigurasi Xml ke dalam objek kelas berat All-In-One Configuration intern. Dalam file pemetaan Xml,<parameterMap> Tag akan diuraikan sebagaiParameterMap objek, setiap elemen turunannya akan diuraikan sebagaiParameterMapping obyek.<resultMap> Tag akan diuraikan sebagaiResultMap objek, setiap elemen turunannya akan diuraikan sebagaiResultMapping obyek.Setiap<select><insert><update><delete> Tag akan diuraikan sebagaiMappedStatement Objek, SQL dalam tag akan diuraikan sebagaiBoundSql obyek.

29.Bagaimana cara MyBatis merangkum hasil eksekusi SQL ke dalam objek target dan mengembalikannya? Apa saja bentuk pemetaannya?

  • Yang pertama adalah menggunakan <resultMap> Tag menentukan hubungan pemetaan antara nama kolom dan nama atribut objek satu per satu.
  • Yang kedua adalah menggunakan fungsi alias kolom SQL dan menulis alias kolom sebagai nama atribut objek, seperti T_NAME AS NAME, nama atribut objek secara umum name, huruf kecil, tetapi nama kolom tidak peka huruf besar-kecil. MyBatis akan mengabaikan huruf besar-kecil nama kolom dan dengan cerdas menemukan nama atribut objek yang sesuai T_NAME AS NaMe, MyBatis masih bisa bekerja normal.

Setelah memiliki hubungan pemetaan antara nama kolom dan nama atribut, MyBatis membuat objek melalui refleksi, dan menggunakan refleksi untuk menetapkan nilai satu per satu ke properti objek dan mengembalikannya ke properti yang tidak dapat menemukan hubungan pemetaan , tugas tidak dapat diselesaikan.

30. Selain tag select |.insert |.update |.delete yang umum, tag apa lagi yang ada di file pemetaan Xml?

Masih banyak tag lainnya, <resultMap><parameterMap><sql><include><selectKey>, ditambah SQL dinamis 9 9 9 tag:trimwheresetforeachifchoosewhenotherwisebind Tunggu.di dalam<sql> Untuk tag fragmen SQL, teruskan<include> Tag memperkenalkan fragmen SQL,<selectKey> Buat label kebijakan untuk kunci utama yang tidak mendukung penambahan otomatis.

31. Pada file pemetaan MyBatis, jika tag A mereferensikan konten tag B melalui include, apakah tag B dapat ditentukan setelah tag A, atau haruskah ditentukan sebelum tag A?

Meskipun MyBatis mem-parsing file pemetaan Xml secara berurutan, tag B yang direferensikan masih dapat ditentukan di mana saja, dan MyBatis dapat mengidentifikasinya dengan benar.

Prinsipnya adalah MyBatis mem-parsing tag A dan menemukan bahwa tag A merujuk pada tag B, tetapi tag B belum diurai dan belum ada. Saat ini, MyBatis akan menandai tag A sebagai belum terselesaikan, lalu melanjutkan untuk mengurai tag yang tersisa, termasuk Tag B., setelah semua tag diurai, MyBatis akan mengurai ulang tag yang ditandai sebagai belum terselesaikan. Saat mengurai tag A, tag B sudah ada, dan tag A dapat diurai secara normal.

32. Apakah MyBatis dapat melakukan pertanyaan kontak satu-ke-banyak dan satu-ke-satu?

Bisa, bukan hanya bisa Satu-ke-banyak, satu-ke-satu,Cukup baik Banyak ke banyak, banyak ke satu . Hal ini dicapai sebagai berikut:

  • Kirim SQL terpisah untuk menanyakan objek terkait, tetapkan ke objek utama, lalu kembalikan objek utama.
  • Menggunakan kueri bersarang, mirip dengan kueri GABUNG, satu bagian adalah nilai atribut objek A, dan bagian lainnya adalah nilai atribut objek terkait B. Keuntungannya adalah selama satu nilai atribut dikirimkan, objek utama dan objek objek terkait dapat ditemukan.
  • subkueri

33.Dapatkah MyBatis memetakan kelas enumerasi Enum?

MyBatis dapat memetakan kelas enumerasi. Tidak hanya dapat memetakan kelas enumerasi, MyBatis dapat memetakan objek apa pun ke kolom tabel.Metode pemetaannya adalah metode yang disesuaikanTypeHandler,menyelesaikan TypeHandler darisetParameter() DangetResult() metode antarmuka.

TypeHandler Fungsinya ada dua, yang pertama untuk melengkapijavaType kejdbcType Konversi, yang kedua selesaijdbcType kejavaType Konversi tersebut tercermin sebagaisetParameter() DangetResult() Kedua metode tersebut mewakili pengaturan parameter placeholder tanda tanya sql dan memperoleh hasil kueri kolom masing-masing.

34.Apa yang dilakukan SQL dinamis MyBatis? SQL dinamis macam apa yang ada? Bisakah Anda menjelaskan secara singkat prinsip eksekusi SQL dinamis?

SQL dinamis MyBatis memungkinkan kita untuk menulis SQL dinamis dalam bentuk tag dalam file pemetaan Xml untuk melengkapi fungsi penilaian logis dan penyambungan dinamis yang disediakan oleh MyBatis 9 9 9 Tag SQL dinamis:trimwheresetforeachifchoosewhenotherwisebind

Prinsip pelaksanaannya adalah dengan menggunakan OGNL Hitung nilai ekspresi dari objek parameter SQL dan gabungkan SQL secara dinamis sesuai dengan nilai ekspresi untuk melengkapi fungsi SQL dinamis.

35.Bagaimana MyBatis melakukan paging? Apa prinsip plugin paging?

MyBatis menggunakan RowBounds Objek diberi nomor halaman, itu untukResultSet Paging memori yang dilakukan oleh kumpulan hasil bukanlah paging fisik. Anda dapat langsung menulis parameter dengan paging fisik dalam SQL untuk menyelesaikan fungsi paging fisik, atau Anda dapat menggunakan plug-in paging untuk menyelesaikan paging fisik.

Prinsip dasar plugin paging adalah menggunakan antarmuka plugin yang disediakan oleh MyBatis untuk mengimplementasikan plugin khusus, mencegat SQL untuk dieksekusi dalam metode intersepsi plugin, dan kemudian menulis ulang SQL sesuai ke dialect Dialek, tambahkan pernyataan paging fisik yang sesuai dan parameter paging fisik.

Contoh:

select * from student
  • 1

Setelah mencegat SQL, tulis ulang sebagai:

select t.* from (select * from student) t limit 0, 10
  • 1

36. Jelaskan secara singkat prinsip pengoperasian plug-in MyBatis dan bagaimana cara menulis plug-in?

MyBatis hanya bisa menulis untuk ParameterHandlerResultSetHandlerStatementHandlerExecutor ini 4 4 4 Semacam plug-in antarmuka, MyBatis menggunakan proxy dinamis JDK untuk menghasilkan objek proxy untuk antarmuka yang perlu dicegat untuk mengimplementasikan fungsi intersepsi metode antarmuka. 4 4 4 metode objek antarmuka, ia akan memasuki metode intersepsi, secara khususInvocationHandler dariinvoke() Metode, tentu saja, hanya akan mencegat metode yang Anda tentukan untuk dicegat.

Terapkan MyBatis Interceptor Antarmuka dan penggantianintercept() Metode, lalu tulis anotasi untuk plugin tersebut dan tentukan metode antarmuka mana yang ingin Anda intersepsi. Ingat, jangan lupa untuk mengonfigurasi plugin yang Anda tulis di file konfigurasi.

37. Cache tingkat pertama dan kedua MyBatis

  • Cache tingkat 1: berdasarkan PerpetualCache Cache lokal HashMap, cakupan penyimpanannya adalah Sesi, saat Sesiflush atauclose Setelah itu, semua cache dalam sesi tersebut akan dibersihkan, dan cache tingkat pertama akan diaktifkan secara default.
  • Cache tingkat kedua memiliki mekanisme yang sama dengan cache tingkat pertama, dan juga digunakan secara default. PerpetualCache, Penyimpanan HashMap, perbedaannya adalah cakupan penyimpanannya MapperNamespace), dan sumber penyimpanan dapat disesuaikan, seperti Ehcache .Cache tingkat kedua tidak diaktifkan secara default. Untuk mengaktifkan cache tingkat kedua, kelas atribut cache tingkat kedua perlu diimplementasikan.Serializable Antarmuka serialisasi (dapat digunakan untuk menyimpan status suatu objek), dapat dikonfigurasi dalam file pemetaannya<cache/>
  • Untuk mekanisme pembaruan data cache, ketika cakupan tertentu (Sesi cache tingkat pertama / Namespace cache tingkat kedua) berada C / U / D Setelah operasi, secara default semua file dalam cakupan iniselect Cache di dalamnya akan menjadiclear