Seperti yang kita semua tahu, MyBatisMyBatis是对JDBC进行封装而成的产品,所以,聊MyBatis源码之前我们得先了解JDBC。
JDCB
JDBC案例:
public class JdbcDemo {
public static final String URL = "jdbc:mysql://localhost:3306/mblog";
public static final String USER = "root";
public static final String PASSWORD = "123456";
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1");
while(rs.next()){
System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));
}
}
}
其实可以在一个项目在同时支持 MyBatis 和 spring-data-jpa,复杂SQL走 mybatis,常用SQL走 spring-data-jpa。器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom="1px;">鉴于前实际开发中使用数量,我滬逩 gaya kod saiz fon: 14px; padding: 2px 4px; jejari sempadan: 4px; jidar-kanan: 2px; jidar-kiri: 2px; warna latar belakang: rgba(27, 31, 35, 0.05); keluarga fon: "Pengendali Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">MyBatis 进行分析。🎜
mybatis
Rakan yang baru dalam pembangunan mungkin tidak mengenali pendahulu MyBatis Sebelum 2010, mereka tidak menghantar MyBatis, dipanggil ibatis. MyBatis ,叫ibatis。
digunakan untuk menerangkan Maklumat konfigurasi utama MyBatis. Apabila komponen lain perlu mendapatkan maklumat konfigurasi, mereka boleh terus melalui Konfigurasi pemerolehan objek. Selain itu, MyBatis akan menggunakan maklumat konfigurasi Mapper, jenis alias, TypeHandler dan seterusnya didaftarkan pada Konfigurasi komponen, apabila komponen lain memerlukan maklumat ini, mereka juga boleh menggunakan Konfigurasi objek. MyBatis的主配置信息,其他组件需要获取配置信息时,直接通过Configuration对象获取。除此之外,MyBatis在应用启动时,将Mapper配置信息、类型别名、TypeHandler等注册到Configuration组件中,其他组件需要这些信息时,也可以从Configuration对象中获取。
🎜🎜MappedStatement🎜🎜🎜🎜MappedStatement digunakan untuk menerangkan maklumat konfigurasi SQL dalam Mapper Ia adalah sepasang XML MapperDalam fail konfigurasi<pilih|kemas kini|padam|masukkan> dan teg lain atau @Select/@Update dan enkapsulasi maklumat konfigurasi anotasi lain. 🎜🎜🎜🎜SqlSession🎜🎜🎜🎜SqlSession ialah API berorientasikan pengguna yang disediakan oleh MyBatis, yang mewakili objek sesi apabila berinteraksi dengan pangkalan data, dan digunakan untuk melengkapkan penambahan, pemadaman, pengubahsuaian dan fungsi pertanyaan pangkalan data. SqlSession ialah penampilan komponen Pelaksana, tujuannya adalah Menyediakan antara muka operasi pangkalan data yang mudah difahami dan digunakan. 🎜
Pelaksana
Executor Ia adalah pelaksana SQL MyBatis Semua operasi penambahan, pemadaman, pengubahsuaian dan pertanyaan pangkalan data dalam MyBatis dilengkapkan oleh komponen Pelaksana. . , 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">StatementHandlerMerangkumkan pasanganPernyataan JDBC operasi objek , seperti menetapkan parameter untuk objek Pernyataan, memanggil kaedah yang disediakan oleh antara muka Pernyataan untuk berinteraksi dengan pangkalan data, dsb. Executor是MyBatis的SQL执行器,MyBatis中对数据库所有的增删改查操作都是由Executor组件完成的。
🎜🎜ParameterHandler🎜🎜🎜🎜ApabilaMyBatis kod>Jenis Pernyataan yang digunakan oleh rangka kerja ialah <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba( 27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>CallableStatement code> dan<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05 ); font-family: " operator mono consolas monaco menlo monospace break-all rgb>PreparedStatement, ParameterHandler digunakan untuk menetapkan nilai untuk pemegang tempat parameter objek Pernyataan . 🎜🎜🎜🎜ResultSetHandler🎜🎜🎜🎜ResultSetHandler Merangkumkan operasi objek ResultSet dalam JDBC Apabila melaksanakan pernyataan SELECT jenis SQL, ResultSetHandler digunakan untuk menukar hasil pertanyaan kepada objek Java. 🎜
TypeHandler
TypeHandler Ia ialah pemproses jenis dalam MyBatis, digunakan untuk mengendalikan pemetaan antara jenis Java dan jenis JDBC. Fungsinya ditunjukkan terutamanya dalam keupayaan untuk memanggil PreparedStatement atau <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>CallableStatement objek sepadan setXXX() menetapkan nilai; untuk objek Pernyataan. Dan boleh memanggil getXXX() Dapatkan hasil pelaksanaan SQL. TypeHandler是MyBatis中的类型处理器,用于处理Java类型与JDBC类型之间的映射。它的作用主要体现在能够根据Java类型调用PreparedStatement或CallableStatement对象对应的setXXX()方法为Statement对象设置值,而且能够根据Java类型调用ResultSet对象对应的getXXX()获取SQL执行结果。
使用JDBC API
Gunakan JDBC APIMembangunkan aplikasi, Satu aspek yang lebih rumit ialah mengendalikan penukaran antara jenis JDBC dan jenis Java. Dua situasi yang melibatkan penukaran jenis Java dan JDBC adalah seperti berikut: 🎜
PreparedStatement objek ialah pemegang tempat parameter Apabila menetapkan nilai simbol, anda perlu memanggil PreparedStatement antara muka Satu siri setXXX() kod> Kaedah, tukar jenis Java kepada jenis JDBC yang sepadan dan tetapkan nilai kepada ruang letak parameter.
Laksanakan pernyataan SQL untuk mendapatkan ResultSet objek, anda perlu memanggil getXXX() memperoleh nilai medan, dan pada masa ini jenis JDBC akan ditukar kepada jenis Java.
MyBatis Disediakan TypeHandler dan jenis Java dan JDBC Correspondence antara jenis : 🎜
🎜 figure>
Ringkasan
Kami menggunakan SqlSession komponen, yang merupakan API peringkat pengguna. SebenarnyaSqlSession ialah penampilan komponen Executor . Tujuannya adalah untuk menyediakan pengguna dengan antara muka operasi pangkalan data yang lebih mesra, yang merupakan aplikasi tipikal corak penampilan dalam corak reka bentuk. 🎜
Melaksanakan SQL The operasi ialah komponen Pelaksana boleh difahami sebagai pelaksana SQL Ia akan menggunakan StatementHandler komponen beroperasi pada objek Penyata JDBC. 🎜
Apabila jenis Penyata ialah CallableStatement dan PreparedStatement
, parameter akan diduduki oleh ParameterHandler tugasan watak komponen. ParameterHandler komponen akan mencari yang sepadan mengikut jenis Java TypeHandler objek, TypeHandler akan lulus; object -size: 14px; padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: " Operator Mono ", Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(239, 112, 96);">setXXX() kaedah (seperti kaedah setString()) ialah dalam nilai tetapan pemegang tempat Parameter objek Pernyataan. CallableStatement和PreparedStatement时,会通过ParameterHandler组件为参数占位符赋值。ParameterHandler组件中会根据Java类型找到对应的TypeHandler对象,TypeHandler中会通过Statement对象提供的setXXX()方法(例如setString()方法)为Statement对象中的参数占位符设置值。
StatementHandler komponen menggunakan Statement dalam JDBC After objek melengkapkan interaksi dengan pangkalan data, apabila jenis pernyataan SQL ialah SELECT, MyBatis melepasi ResultSetHandler komponen memperoleh objek ResultSet daripada objek Statement, dan kemudian menukar objek ResultSet kepada objek Java.
Advanced Skills
Design Patterns Reka bentuk corak digunakan secara meluas dalam mybatis.Corak kilang
Mod Penghias
Corak Rantaian Tanggungjawab
....
Caching
Dalam aplikasi web, caching ialah komponen penting. Biasanya kami menggunakan perisian tengah caching seperti Redis atau memcached untuk memintas sejumlah besar permintaan kepada pangkalan data dan mengurangkan tekanan pada pangkalan data. Sebagai komponen penting, MyBatis secara semula jadi juga menyediakan sokongan yang sepadan secara dalaman. Dengan menambahkan fungsi caching pada peringkat rangka kerja, tekanan pada pangkalan data boleh dikurangkan dan kelajuan pertanyaan boleh dipertingkatkan pada masa yang sama Ia boleh dikatakan bahawa ia membunuh dua burung dengan satu batu.
Struktur cache MyBatis terdiri daripada Kedua-dua tahap cache ialah kelas pelaksanaan menggunakan antara muka Cache. Oleh itu, dalam bab berikut, saya mula-mula akan memperkenalkan anda kepada kod sumber beberapa kelas pelaksanaan Cache, dan kemudian menganalisis pelaksanaan cache peringkat pertama dan peringkat kedua.
Penggunaan cache peringkat pertama dan cache peringkat kedua MyBatis: Cache peringkat pertama MyBatis ialah cache peringkat SqlSession, yang didayakan secara lalai dan tidak boleh dimatikan cache peringkat kedua perlu dihidupkan dengan tetapan nilai parameter cacheEnabled dalam fail konfigurasi utama MyBatis.
Cache peringkat pertama dilaksanakan dalam Pelaksana. Komponen MyBatis' Executor mempunyai 3 pelaksanaan yang berbeza, iaitu SimpleExecutor code>, <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05 );font-family: " operator mono consolas monaco menlo monospace break-all rgb>ReuseExecutor dan BatchExecutor. Semua kelas ini mewarisi daripada , 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">BaseExecutor code>, dalam BaseExecutor Dalam kaedah query() kelas, hasil pertanyaan pertama kali diperoleh daripada cache Jika keputusan tidak boleh diperolehi, keputusan diambil daripada pangkalan data, dan kemudian keputusan pertanyaan dicache. Cache peringkat kedua MyBatis dilaksanakan melalui mod penghias Apabila cache peringkat kedua didayakan melalui parameter cacheEnabled, rangka kerja MyBatis akan menggunakan CachingExecutor untuk SimpleExecutor, ReuseExecutoratau BatchExecutor dihias. Apabila operasi pertanyaan dilakukan, hasil pertanyaan dicache dan apabila operasi kemas kini dilakukan, cache kedua dikemas kini. Bab ini akhirnya memperkenalkan MyBatisCara mengintegrasikan Redis sebagai cache Tahap 2. SimpleExecutor、ReuseExecutor和BatchExecutor。这些类都继承自BaseExecutor,在BaseExecutor类的query()方法中,首先从缓存中获取查询结果,如果获取不到,则从数据库中查询结果,然后将查询结果缓存起来。而MyBatis的二级缓存则是通过装饰器模式实现的,当通过cacheEnabled参数开启了二级缓存,MyBatis框架会使用CachingExecutor对SimpleExecutor、ReuseExecutor或者BatchExecutor进行装饰,当执行查询操作时,对查询结果进行缓存,执行更新操作时则更新二级缓存。本章最后介绍了MyBatis如何整合Redis作为二级缓存。
除此之外,MyBatis还支持Ehcache、OSCache
Selain itu, MyBatis juga menyokong Ehcache code> 、<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05 ); font-family: " operator mono consolas monaco menlo monospace break-all rgb>OSCache, dsb., ciri ini Bukan biasa digunakan.
Plug-in
Kebanyakan rangka kerja menyokong pemalam Pengguna boleh melanjutkan fungsi mereka dengan menulis pemalam, dan Mybatis tidak terkecuali. MyBatis menyediakan mekanisme lanjutan yang boleh mengubah tingkah laku pelaksanaan SQL apabila melaksanakan Mapper. Mekanisme sambungan ini dilaksanakan melalui pemintas, dan pemintas yang ditentukan pengguna juga dipanggil pemalam MyBatis. 🎜
Rangka kerja MyBatis menyokong pemintasan Executor、ParameterHandler、ResultSetHandler、StatementHandlerempat kaedah komponen. Kuasai prinsip pelaksanaan pemalam MyBatis, dan kemudian laksanakan pemalam pertanyaan paging dan pemalam statistik SQL yang perlahan Apabila fungsi yang kita perlukan tidak dapat dipenuhi oleh rangka kerja MyBatis, kita boleh mempertimbangkan untuk melaksanakannya melalui palam tersuai -dalam.
Pelaksanaan klasik: PageHelper.
Log
MyBatis menyediakan pelaksanaan yang sepadan antara muka Log untuk rangka kerja pengelogan yang berbeza Kelas pelaksanaan antara muka Log ditunjukkan dalam rajah di bawah. Seperti yang dapat dilihat dari kelas pelaksanaan, MyBatis menyokong 7 pelaksanaan log yang berbeza, seperti berikut.
Berikut ialah penjelasan ringkas tentang beberapa yang biasa digunakan:
Pengelogan Apache Commons: Gunakan JCL untuk mengeluarkan log.
Log4j 2: Gunakan rangka kerja Log4j 2 untuk memasukkan log.
Java Util Logging: Gunakan modul pengelogan terbina dalam JDK untuk mengeluarkan log.
Log4j: Gunakan rangka kerja Log4j untuk mengeluarkan log.
Tiada Pembalakan: Tiada log dikeluarkan.
SLF4J: Gunakan fasad log SLF4J untuk mengeluarkan log.
Stdout: Log keluaran ke peranti output standard (seperti konsol).
Turutan MyBatis mencari rangka kerja log ialah
SLF4J→JCL→Log4j2→Log4j→JUL→Tiada Pengelogan.
Jika tiada rangka kerja pengelogan di bawah Classpath, kelas pelaksanaan log NoLoggingImpl digunakan, iaitu tiada log dikeluarkan.
Dynamic SQL binding
Dynamic SQL merujuk kepada fakta bahawa keadaan khusus tidak boleh diramalkan terlebih dahulu, dan pernyataan SQL perlu dijana secara dinamik mengikut situasi khusus semasa runtime.
Terdapat teg SQL dinamik yang kaya dalam MyBatis, seperti: <di mana>, <if> ;, <pilih|bila|sebaliknya> ;, <foreach>Tunggu. <where>、<if>、<choose|when|otherwise>、<foreach>等。
Dalam kod sumber MyBatis, terdapat objek SqlSource yang akan disimpan dalam objek MappedStatement sebagai sifat objek MappedStatement. Apabila Mapper dilaksanakan, kaedah getBoundSql() objek SqlSource dipanggil berdasarkan maklumat parameter masuk untuk mendapatkan objek BoundSql Proses ini melengkapkan proses menukar objek SqlNode kepada pernyataan SQL.
Contohnya:, #{} Pemegang tempat akaun akan digantikan dengan "?", dan kemudian kaedah setXXX() objek PreparedStatement dalam JDBC dipanggil untuk menetapkan nilai untuk pemegang tempat parameter dan pemegang tempat ${} akan diganti terus dengan teks parameter yang diluluskan kandungan. Ringkasan
Artikel ini adalah pengalaman keseluruhan analisis kod sumber MyBatis, saya harap ia akan membantu anda. 🎜🎜🎜
Atas ialah kandungan terperinci Selepas mempelajari kod sumber MyBatis dalam satu minggu, saya mendapat ringkasan 10,000 perkataan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn