Wie wir alle wissen, 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
Ja
JDBC
🎜 ist ein gekapseltes Produkt. Bevor wir also über den MyBatis-Quellcode sprechen, müssen wir ihn zunächst verstehen🎜<span style="display: none;">🎜<span style="display: inline-block;Hintergrund: rgb(239, 112, 96);Farbe: rgb(255, 255, 255 );padding: 3px 10px 1px;border-top-right-radius: 3px;border-top-left-radius: 3px;margin-right: 3px;">JDCB🎜<span style="display: inline-block; -align: bottom;border-bottom: 36px solid #efebe9;border-right: 20px solid transparent;"> 🎜<p data-tool="mdnice editor" style="padding-top: 8px padding- unten: 8px;Linienhöhe: 26px;Rand oben: 1px;Rand unten: 1px;">JDBC-Fall: 🎜</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">Statement stmt = conn.createStatement();</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>
<p data-tool="mdnice editor" style="padding-top: 8px ;padding- unten: 8px;Linienhöhe: 26px;Rand oben: 1px;Rand unten: 1px;">Beschreibung: 🎜</p>
<p data-tool="mdnice editor" style="padding-top: 8px; 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">Datenbanktreiber: 🎜</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1");</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>
<p data-tool="mdnice editor" style="padding-top: 8px ;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">Get link:🎜</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>
<p data-tool="mdnice editor" style="padding-top: 8px;padding-bottom: 8px;Linienhöhe: 26px;Rand oben: 1px;Rand unten: 1px;">Erstellen<code style="font-size: 14px;padding: 2px 4px;Randradius: 4px ;Rand rechts: 2px ;Rand links: 2px;Hintergrundfarbe: rgba(27, 31, 35, 0,05);Schriftfamilie: „Operator Mono“, Consolas, Monaco, Menlo, Monospace;Wortumbruch: break -all;Farbe: rgb (239, 112, 96);">Anweisung
oder PreparedStatement
Objekt: 🎜
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
utils
系列的代表有:,dbUtils
,jdbcTemplate
等;
下面对于这些框架做个简单概述:
至于 jpa,它只是一个规范标准, 并非具体框架, 不等同于spring-data-jpa;同时 spring-data-jpa 也不是 jpa 的具体实现, 它只是 jpa 规范标准的进一步封装.hibernate 是 jpa 最为常见的实现框架,当然其他还有 eclipseLink,topLink。MyBatis 的特点是在对 SQL 优化时, 除了部分可以自动生成代码, Verwenden Sie die SQL-Anweisung, um die SQL-Anweisungen anzuzeigen. spring-data-jpa(hibernate) 的特点是在开发过程中,脱离 SQL 编码开发,当然也支持本地SQL来查询,框架内部调用层次复杂. 以上就可以根据实际的业务进度和业务支撑情况做出选择了.
MyBatis
其实可以在一个项目Verwenden Sie MyBatis für spring-data-jpa und verwenden Sie SQL für mybatis und verwenden Sie SQL für spring-data-jpa.
Freunde, die neu in der Entwicklung sind, kennen den Vorgänger von MyBatis möglicherweise nicht. Vor 2010 haben sie MyBatis
, genannt ibatis
. MyBatis
,叫ibatis
。
MyBatis
是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis
可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs
MyBatis
kann einfaches XML oder Anmerkungen zum Konfigurieren verwenden und native Informationen zuordnen, kombinieren Sie die Schnittstelle mit Javas 数据库连接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>
创建一个表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;
插入一条数据:
INSERT INTO `t_user` VALUES ('1', 'tian', '19', '1');
创建该数据库表的实体类:
public class User { private Integer id; private String name; private Integer age; //set get }
创建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>
创建mapper接口:UserMapper.java
import com.tian.domain.User; public interface UserMapper { User selectUserById(Integer id); }
MyBatis 整体配置文件:
<?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>
上面这些就是我们使用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(); } } }
测试结果:
User{id=1, name='tian', age=19}
如上面的代码所示,SqlSession
是MyBatis中提供的与数据库交互的接口,SqlSession实例通过工厂模式创建。
为了创建SqlSession
对象,首先需要创建SqlSessionFactory
对象,而SqlSessionFactory
对象的创建依赖于SqlSessionFactoryBuilder
类,该类提供了一系列重载的build()方法,我们需要以主配置文件的输入流作为参数调用SqlSessionFactoryBuilder
对象的bulid()
方法,该方法返回一个SqlSessionFactory
对象。
有了SqlSessionFactory
对象的openSession()
方法即可获取一个与数据库建立连接的SqlSession
实例。SqlSessionFactory
对象之后,调用SqlSessionFactory
对象的openSession()
方法即可获取一个与数据库建立连接的SqlSession
实例。
前面我们定义了UserMapper
接口,这里需要调用SqlSession
的getMapper()
方法创建一个动态代理对象,然后调用UserMapper
代理实例的方法即可完成与数据库的交互。
针对上面这个案例,我们来梳理一下MyBatis
UserMapper
接口,这里需要调用SqlSession
的getMapper()
方法创建一个动态代理对象,然后调用UserMapper
个案例我们来梳理一下
Konfiguration
wird verwendet, um Die Hauptkonfigurationsinformationen von MyBatis
. Wenn andere Komponenten die Konfigurationsinformationen erhalten müssen, können sie Konfiguration
Objekterfassung. Darüber hinaus verwendet MyBatis Mapper-Konfigurationsinformationen, Typalias, TypeHandler
usw. sind registriert bei Konfiguration
Komponente: Wenn andere Komponenten diese Informationen benötigen, können sie auch Konfiguration
Objekt. MyBatis
的主配置信息,其他组件需要获取配置信息时,直接通过Configuration
对象获取。除此之外,MyBatis在应用启动时,将Mapper配置信息、类型别名、TypeHandler
等注册到Configuration
组件中,其他组件需要这些信息时,也可以从Configuration
对象中获取。
MappedStatement
MappedStatement用于描述Mapper中的SQL配置信息,是对Mapper XML
配置文件中<select|update|delete|insert>
等标签或者@Select/@Update
等注解配置信息的封装。
SqlSession
SqlSession
是MyBatis提供的面向用户的API,表示和数据库交互时的会话对象,用于完成数据库的增删改查功能。SqlSession
🎜🎜MappedStatement🎜🎜🎜🎜MappedStatement wird verwendet, um die SQL-Konfigurationsinformationen in Mapper zu beschreiben. Es ist ein Paar von Mapper XML
In der Konfigurationsdatei<select|update|delete|insert>
und andere Tags oder @Select/@Update
und andere Kapselung von Anmerkungskonfigurationsinformationen. 🎜🎜🎜🎜SqlSession🎜🎜🎜🎜
Executor
Executor
是MyBatis的SQL执行器,MyBatis中对数据库所有的增删改查操作都是由Executor组件完成的。
StatementHandler
StatementHandler
封装了对JDBC Statement
对象的操作,比如为Statement对象设置参数,调用Statement接口提供的方法与数据库交互,等等。
ParameterHandler
当MyBatis
框架使用的Statement类型为CallableStatement
和PreparedStatement
时,ParameterHandler
用于为Statement对象参数占位符设置值。
ResultSetHandler
ResultSetHandler
🎜🎜StatementHandler🎜🎜🎜🎜MyBatis</ code>Der vom Framework verwendete Anweisungstyp ist <code style=" font-size: rgba mono consolas monaco menlo monospace break-all rgb>CallableStatement code> und<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 ); Schriftfamilie: „Operator Mono“, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);“>PreparedStatement
, ResultSetHandler</code > Kapselt die Operation von ResultSet-Objekten in JDBC. Bei der Ausführung einer SQL-Anweisung vom Typ SELECT wird ResultSetHandler verwendet, um die Abfrageergebnisse in Java-Objekte zu konvertieren. 🎜<h4 data-tool=" mdnice><span style="display: none;"></span>TypeHandler<span style="display: none;"></span><p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;"><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);“>TypeHandler
Es handelt sich um einen Typprozessor in MyBatis, der für die Zuordnung zwischen Java-Typen und JDBC-Typen verwendet wird. Seine Funktion spiegelt sich hauptsächlich in der Fähigkeit wider, setXXX()
-Methode legt den Wert fest für das Statement-Objekt. Und kann den entsprechenden TypeHandler
是MyBatis中的类型处理器,用于处理Java类型与JDBC类型之间的映射。它的作用主要体现在能够根据Java类型调用PreparedStatement
或CallableStatement
对象对应的setXXX()
方法为Statement对象设置值,而且能够根据Java类型调用ResultSet对象对应的getXXX()
获取SQL执行结果。
使用JDBC API
Verwenden Sie PreparedStatement
interface Eine Reihe von PreparedStatement
接口中提供的一系列的setXXX()
方法,将Java类型转换为对应的JDBC类型并为参数占位符赋值。
执行SQL语句获取ResultSet
对象后,需要调用ResultSet对象的getXXX()
方法获取字段值,此时会将JDBC类型转换为Java类型。
MyBatis
提供的TypeHandler
及与Java类型和JDBC类型之间的对应关系:
小结
我们使用到了SqlSession
组件,它是用户层面的API。实际上SqlSession
是Executor组件的外观,目的是为用户提供更友好的数据库操作接口,这是设计模式中外观模式的典型应用。
真正执行SQL操作的是Executor组件,Executor可以理解为SQL执行器,它会使用StatementHandler
Führen Sie die SQL-Anweisung aus, um ResultSet
-Objekt, müssen Sie den getXXX()
ruft den Feldwert ab und zu diesem Zeitpunkt wird der JDBC-Typ in einen Java-Typ konvertiert.
TypeHandler
und Java-Typen und JDBC-Korrespondenz zwischen Typen : 🎜
Das obige ist der detaillierte Inhalt vonNachdem ich den MyBatis-Quellcode in einer Woche gelernt hatte, erhielt ich eine Zusammenfassung mit 10.000 Wörtern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!