Seperti yang kita semua tahu, MyBatis
MyBatis
是对JDBC
进行封装而成的产品,所以,聊MyBatis源码之前我们得先了解JDBC
。
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")); } } }
说明:
数据库驱动:
Class.forName("com.mysql.jdbc.Driver");
获取连接:
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
创建Statement
或者PreparedStatement
Ya
JDBC
🎜 ialah produk yang terkandung, jadi sebelum bercakap tentang kod sumber MyBatis, kita mesti memahaminya terlebih dahulu🎜JDBC
🎜. 🎜🎜kes JDBC: 🎜
Statement stmt = conn.createStatement();
Penerangan: 🎜
Pemacu pangkalan data: 🎜
ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1");
Dapatkan pautan:🎜
System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));
BuatPenyata
atau PreparedStatement
Objek: 🎜
Statement stmt = conn.createStatement();
执行sql数据库查询:
ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1");
解析结果集:
System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));
在使用的时候,业务处理完成后记得关闭相关资源
使用过JDCB的朋友都知道,JDBC如果用到我们项目中基本上都会存在以下几个问题:
针对上面这些问题,于是一大堆持久化框架应运而生。
做持久层的框架有很多,有orm
系和utils
系列。
orm
系列的代表有: hibernate
,eclipseLink
,topLink
;orm
系列的代表有:hibernate
,eclipseLink
,topLink
;utils
系列的代表有:MyBatis
,dbUtils
,jdbcTemplate
等;下面对于这些框架做个简单概述:
至于 jpa,它只是一个规范标准,并非具体框架,不等同于 spring-data-jpa;同时 spring-data-jpa 也不是 jpa 的具体实现,它只是 jpa 规范标准的进一步封装。hibernate 是 jpa 最为常见的实现框架,当然其他还有 eclipseLink,topLink。
MyBatis 的特点是在对 SQL 优化时,复杂 SQL 的优化可控性高,框架内部调用层次简单,除了部分可以自动生成代码,还会有很多 SQL 需要自行编码。 spring-data-jpa(hibernate) 的特点是在开发过程中,脱离 SQL 编码开发,当然也支持本地SQL来查询,框架内部调用层次复杂。 以上就可以根据实际的业务进度和业务支撑情况做出选择了。
其实可以在一个项目在同时支持 MyBatis 和 spring-data-jpa,复杂SQL走 mybatis,常用SQL走 spring-data-jpa。
鉴于前实际开发中使用数量,我们选择MyBatis
utils
系列的代表有:MyBatis
,dbUtils
,jdbcTemplate
等;下面对于这些框架做个简单概述:🎜
至于 jpa, 它 只 是 一 个 规范 标准, 并 非 框架 框架 不等 同于 同于 同于 同于 同于 同于 同于 同于 同于 同于 同于 同于 同于jpa;同时 spring-data-jpa 也不是 jpa 的具体实现,它只是 jpa 规范标准的进一步封装。hibernate 昀人 jpa当然其他还有 eclipseLink,topLink。🎜
MyBatis 的特点是在对 SQL 优化时, SQL的优化可控性高,框架内部调用层次简单,除了部分可以自动生成代码,还会爱行码。 spring-data-jpa(hibernate) 的特点是在开发过程中,脱离 SQL 编码开发,当然也支持本地SQL来查询,小為逢小為杂。 以上就可以根据实际的业务进度和业务支撑情况做出选择了。🎜
其实可以在一个项目在同时支持 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
, dipanggilibatis
.MyBatis
,叫ibatis
。
MyBatis
是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis
可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的POJOs
MyBatis
ialah lapisan A berterusan yang sangat baik rangka kerja yang menyokong SQL tersuai, prosedur tersimpan dan pemetaan lanjutan. MyBatis mengelakkan hampir semua kod JDBC dan tetapan manual parameter dan mendapatkan semula set hasil.MyBatis
boleh menggunakan XML atau anotasi mudah untuk Konfigurasikan dan petakan maklumat asli, gabungkan antara muka dengan JavaPOJO(Objek Java Biasa Biasa, objek Java biasa) dipetakan ke dalam rekod dalam pangkalan data. 🎜<h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 18px;"> <span style="display: none;"></span>特点<span style="display: none;"></span> </h4> <ul class="list-paddingleft-2" data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;"> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。</section></li> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">灵活:MyBatis 不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。</section></li> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。</section></li> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">提供映射标签,支持对象与数据库的orm字段关系映射</section></li> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">提供对象关系映射标签,支持对象关系组建维护</section></li> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">提供xml标签,支持编写动态sql。</section></li> </ul> <h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 18px;"> <span style="display: none;"></span>案例<span style="display: none;"></span> </h4> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">需要来源两个jar包:<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;word-break: break-all;color: rgb(239, 112, 96);'>MyBatis
的jar包和MySQL
数据库连接jar包。<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency>Salin selepas log masuk创建一个表t_user(数据库也是肯定要自己创建的哈)
CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;Salin selepas log masuk插入一条数据:
INSERT INTO `t_user` VALUES ('1', 'tian', '19', '1');Salin selepas log masuk创建该数据库表的实体类:
public class User { private Integer id; private String name; private Integer age; //set get }Salin selepas log masuk创建mapper配置文件:
UserMapper.xml
<?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"> <mapper namespace="com.tian.mapper.UserMapper"> <select id="selectUserById" resultType="com.tian.domain.User"> select * from t_user where id = #{id} </select> </mapper>Salin selepas log masuk创建mapper接口:
UserMapper.java
import com.tian.domain.User; public interface UserMapper { User selectUserById(Integer id); }Salin selepas log masukMyBatis 整体配置文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mblog?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mappers/UserMapper.xml"/> </mappers> </configuration>Salin selepas log masuk上面这些就是我们使用
MyBatis
基本开发代码。下面我们来写一个测试类:
import com.tian.domain.User; import com.tian.mapper.UserMapper; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class MybatisApplication { public static void main(String[] args) { String resource = "mybatis-config.xml"; InputStream inputStream = null; SqlSession sqlSession =null; try { //读取配置文件 inputStream = Resources.getResourceAsStream(resource); //创建SqlSession工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //创建sql操作会话 sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); //获取数据并解析成User对象 User user = userMapper.selectUserById(1); //输出 System.out.println(user); } catch (Exception e) { e.printStackTrace(); }finally { //关闭相关资源 try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } sqlSession.close(); } } }Salin selepas log masuk测试结果:
User{id=1, name='tian', age=19}
如上面的代码所示,
SqlSession
是MyBatis中提供的与数据库交互的接口,SqlSession实例通过工厂模式创建。为了创建
SqlSession
对象,首先需要创建SqlSessionFactory
对象,而SqlSessionFactory
对象的创建依赖于SqlSessionFactoryBuilder
类,该类提供了一系列重载的build()方法,我们需要以主配置文件的输入流作为参数调用SqlSessionFactoryBuilder
对象的bulid()
方法,该方法返回一个SqlSessionFactory
对象。有了
对象的SqlSessionFactory
对象之后,调用SqlSessionFactoryopenSession()
方法即可获取一个与数据库廞掫 gaya ="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;word-break: break-all;color: rgb(239, 112, 96);">SqlSession实例。SqlSessionFactory
对象之后,调用SqlSessionFactory
对象的openSession()
方法即可获取一个与数据库建立连接的SqlSession
实例。前面我们定义了
UserMapper
接口,这里需要调用SqlSession
的getMapper()
方法创建一个动态代理对象,然后调用UserMapper
代理实例的方法即可完成与数据库的交互。针对上面这个案例,我们来梳理一下
前面我们定义了 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;word-break: break-all;color: rgb(239, 112, 96);">UserMapper接口,这里需要调用MyBatis
SqlSession
的getMapper()
方法创建一个动态代理对象,然后调用Pengguna Pengguna代理实例的方法即可完成与数据库的交麜亓的交麓的交亓的交亓。案例,我们来梳理一下 MyBatis
的整体执行流程 和 核心 组件 。
Konfigurasi
digunakan untuk menerangkan
Maklumat konfigurasi utama MyBatis
. Apabila komponen lain perlu mendapatkan maklumat konfigurasi, mereka boleh terus melaluiKonfigurasi
pemerolehan objek. Selain itu, MyBatis akan menggunakan maklumat konfigurasi Mapper, jenis alias,TypeHandler
dan seterusnya didaftarkan padaKonfigurasi
komponen, apabila komponen lain memerlukan maklumat ini, mereka juga boleh menggunakanKonfigurasi
objek.MyBatis
的主配置信息,其他组件需要获取配置信息时,直接通过Configuration
对象获取。除此之外,MyBatis在应用启动时,将Mapper配置信息、类型别名、TypeHandler
等注册到Configuration
组件中,其他组件需要这些信息时,也可以从Configuration
对象中获取。MappedStatement
MappedStatement用于描述Mapper中的SQL配置信息,是对
Mapper XML
配置文件中<select|update|delete|insert>
等标签或者@Select/@Update
等注解配置信息的封装。SqlSession
🎜🎜MappedStatement🎜🎜🎜🎜MappedStatement digunakan untuk menerangkan maklumat konfigurasi SQL dalam Mapper Ia adalah sepasang
SqlSession
是MyBatis提供的面向用户的API,表示和数据库交互时的会话对象,用于完成数据库的增删改查功能。SqlSession
XML Mapper
Dalam 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组件完成的。StatementHandler
StatementHandler
封装了对JDBC Statement
对象的操作,比如为Statement对象设置参数,调用Statement接口提供的方法与数据库交互,等等。ParameterHandler
当
MyBatis
框架使用的Statement类型为CallableStatement
和PreparedStatement
时,ParameterHandler
用于为Statement对象参数占位符设置值。ResultSetHandler
🎜🎜ParameterHandler🎜🎜🎜🎜Apabila
ResultSetHandler
MyBatis 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 memanggilPreparedStatement 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 memanggilgetXXX()
Dapatkan hasil pelaksanaan SQL.TypeHandler
是MyBatis中的类型处理器,用于处理Java类型与JDBC类型之间的映射。它的作用主要体现在能够根据Java类型调用PreparedStatement
或CallableStatement
对象对应的setXXX()
方法为Statement对象设置值,而且能够根据Java类型调用ResultSet对象对应的getXXX()
获取SQL执行结果。使用
GunakanJDBC API
JDBC API
Membangunkan 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 memanggilPreparedStatement
antara muka Satu sirisetXXX() kod> Kaedah, tukar jenis Java kepada jenis JDBC yang sepadan dan tetapkan nilai kepada ruang letak parameter.
PreparedStatement
对象为参数占位符设置值时,需要调用PreparedStatement
接口中提供的一系列的setXXX()
方法,将Java类型转换为对应的JDBC类型并为参数占位符赋值。执行SQL语句获取 ResultSet
对象后,需要调用ResultSet对象的getXXX()
方法获取字段值,此时会将JDBC类型转换为Java类型。
MyBatis
提供的TypeHandler
及与Java类型和JDBC类型之间的对应关系:小结
我们使用到了
SqlSession
组件,它是用户层面的API。实际上SqlSession
是Executor组件的外观,目的是为用户提供更友好的数据库操作接口,这是设计模式中外观模式的典型应用。真正执行SQL操作的是Executor组件,Executor可以理解为SQL执行器,它会使用
Laksanakan pernyataan SQL untuk mendapatkanStatementHandler
ResultSet
objek, anda perlu memanggilgetXXX()
memperoleh nilai medan, dan pada masa ini jenis JDBC akan ditukar kepada jenis Java., parameter akan diduduki oleh ParameterHandler tugasan watak komponen.
MyBatis
DisediakanTypeHandler
dan jenis Java dan JDBC Correspondence antara jenis : 🎜ParameterHandler
komponen akan mencari yang sepadan mengikut jenis JavaTypeHandler
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
组件使用JDBC中的Statement对象与数据库完成交互后,当SQL语句类型为SELECT时,MyBatis通过ResultSetHandler
StatementHandler
komponen menggunakan Statement dalam JDBC After objek melengkapkan interaksi dengan pangkalan data, apabila jenis pernyataan SQL ialah SELECT, MyBatis melepasiResultSetHandler
komponen memperoleh objek ResultSet daripada objek Statement, dan kemudian menukar objek ResultSet kepada objek Java.Advanced Skills
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!