>  기사  >  Java  >  일주일만에 마이바티스 소스코드를 학습한 후 10,000 단어 요약본을 받았습니다.

일주일만에 마이바티스 소스코드를 학습한 후 10,000 단어 요약본을 받았습니다.

Java后端技术全栈
Java后端技术全栈앞으로
2023-08-23 14:51:141217검색

우리 모두 알고 있듯이 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"));
        }
    }
}

说明:

数据库驱动:

Class.forName("com.mysql.jdbc.Driver");

获取连接:

Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);

创建Statement或者PreparedStatement

JDBC🎜는 캡슐화된 제품이므로 MyBatis 소스 코드에 대해 이야기하기 전에 먼저 이해해야 합니다🎜JDBC🎜. 🎜🎜

🎜JDCB🎜 🎜

JDBC 케이스: 🎜

Statement stmt = conn.createStatement();

설명: 🎜

데이터베이스 드라이버: 🎜

ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1");

링크 가져오기:🎜

System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));

만들기 또는 PreparedStatement객체: 🎜

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如果用到我们项目中基本上都会存在以下几个问题:

传统JDBC的问题

  • 创建数据库的连接存在大量的硬编码,
  • 执行statement时存在硬编码.
  • 频繁的开启和关闭数据库连接,会严重影响数据库的性能,浪费数据库的资源.
  • 存在大量的重复性编码

针对上面这些问题,于是一大堆持久化框架应运而生。

持久化框

做持久层的框架有很多,有orm系和utils系列。

  • orm系列的代表유: 최대 절전 모드,eclipseLinktopLink;orm系列的代表有:hibernateeclipseLinktopLink
  • utils系列的代表有:MyBatisdbUtilsjdbcTemplate
utils系列的代表有:

dbUtils,jdbcTemplate等;

하면对于这些框架做个简单概述:

至于 jpa ,它只是一规范标准,并不具体框架,不等同于spring-data-jpa;동일한 spring-data-jpa 也不是 jpa 的具体实现,它只是 jpa 规范标准的进一步封装。其他还有 eclipseLink,topLink。

MyBatis 的特点是에서 SQL을 优化时,复杂 SQL의 优化可控性高,框架内part调用层次简单,除了part分可以自动生成代码,还会有很多 SQL需要自行编码. spring-data-jpa(hibernate)는 SQL 编码开发, 当然也支持本地SQL来查询, 框架内询, 框架内部调用层次复杂 에서 특별하게 사용됩니다. 以上就可以根据实际的业务进titude and 业务支撑情况做出选择了。

MyBatis其实可以에서 동일한 时支持 MyBatis 와 jpa, 复杂SQL走 mybatis, 常用SQL走 spring-data-jpa.

🎜🎜鉴于前实际开发中使用数weight,我们选择🎜 进行分析。🎜

mybatis

처음 개발을 시작하는 친구들은 MyBatis의 전신을 모를 수도 있습니다. 2010년 이전에는 MyBatis, 이바티스. MyBatis ,叫ibatis

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs

MyBatis는 뛰어난 지속성 A 계층입니다. 맞춤형 SQL, 저장 프로시저, 고급 매핑을 지원하는 프레임워크입니다. MyBatis는 거의 모든 JDBC 코드와 매개변수의 수동 설정 및 결과 세트 검색을 방지합니다. MyBatis는 간단한 XML 또는 주석을 사용하여 구성할 수 있습니다. 기본 정보를 매핑하고 인터페이스를 Java의 POJO(Plain Ordinary Java Object, 일반 Java 객체)는 데이터베이스의 레코드에 매핑됩니다. 🎜<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>

创建一个表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 (&#39;1&#39;, &#39;tian&#39;, &#39;19&#39;, &#39;1&#39;);

创建该数据库表的实体类:

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&amp;characterEncoding=utf8&amp;autoReconnect=true&amp;useSSL=false&amp;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对象。

있음 );font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">SqlSessionFactory

对象之后,调用SqlSessionFactory对象的openSession()방법법即可获取一个与数据库建立连接的SqlSession实例。SqlSessionFactory对象之后,调用SqlSessionFactory对象的openSession()方法即可获取一个与数据库建立连接的SqlSession实例。

前面我们定义了UserMapper接口,这里需要调用SqlSessiongetMapper()方法创建一个动态代理对象,然后调用UserMapper代理实例的方法即可完成与数据库的交互。

针对上面这个案例,我们来梳理一下MyBatis

前face我们定义了UserMapper接口,这里需要调用SqlSessiongetMapper()방법법创建一个动态代理对象,然后调用UserMapper대리적 방법법即可完成与数据库的交互。

针对上面这个案例,我们来梳理一下MyBatis의 整体执行流程와 核心组件。

MyBatis 核心组件

MyBatis 执行流程

일주일만에 마이바티스 소스코드를 학습한 후 10,000 단어 요약본을 받았습니다.

🎜🎜🎜

Configuration

MyBatis의 주요 구성 정보. 다른 구성 요소가 구성 정보를 가져와야 하는 경우 구성 개체 획득. 또한 MyBatis는 애플리케이션이 시작될 때 Mapper 구성 정보, 유형 별칭, TypeHandler 등은 구성 구성요소, 다른 구성요소에 이 정보가 필요한 경우 구성 개체. MyBatis的主配置信息,其他组件需要获取配置信息时,直接通过Configuration对象获取。除此之外,MyBatis在应用启动时,将Mapper配置信息、类型别名、TypeHandler等注册到Configuration组件中,其他组件需要这些信息时,也可以从Configuration对象中获取。

MappedStatement

MappedStatement用于描述Mapper中的SQL配置信息,是对Mapper XML配置文件中b5d5a6a8d1a81baf21ea188537c0af35等标签或者@Select/@Update等注解配置信息的封装。

SqlSession

SqlSession是MyBatis提供的面向用户的API,表示和数据库交互时的会话对象,用于完成数据库的增删改查功能。SqlSession

🎜🎜MappedStatement🎜🎜🎜🎜MappedStatement는 Mapper에서 SQL 구성 정보를 설명하는 데 사용됩니다. Mapper XML구성 파일에서b5d5a6a8d1a81baf21ea188537c0af35 및 기타 태그 또는 @Select/@Update 및 기타 주석 구성 정보 캡슐화. 🎜🎜🎜🎜SqlSession🎜🎜🎜🎜SqlSession는 MyBatis에서 제공하는 사용자 지향 API로 데이터베이스와 상호작용할 때 세션 객체를 나타내며, 데이터베이스의 추가, 삭제, 수정, 쿼리 기능을 완성하는데 사용된다. SqlSession은 Executor 구성 요소의 모양입니다. 목적은 이해하기 쉽고 사용하기 쉬운 데이터베이스 운영 인터페이스를 제공하는 것입니다. 🎜

Executor

Executor MyBatis의 SQL 실행자입니다. MyBatis에서 데이터베이스의 모든 추가, 삭제, 수정 및 쿼리 작업은 Executor 구성 요소에 의해 완료됩니다. Executor是MyBatis的SQL执行器,MyBatis中对数据库所有的增删改查操作都是由Executor组件完成的。

StatementHandler

StatementHandler封装了对JDBC Statement对象的操作,比如为Statement对象设置参数,调用Statement接口提供的方法与数据库交互,等等。

ParameterHandler

MyBatis框架使用的Statement类型为CallableStatementPreparedStatement时,ParameterHandler用于为Statement对象参数占位符设置值。

ResultSetHandler

ResultSetHandler

🎜🎜StatementHandler🎜🎜🎜🎜StatementHandlerJDBC 문 객체 작업 , 예를 들어Statement 개체에 대한 매개 변수 설정, 데이터베이스와 상호 작용하기 위해 Database 인터페이스에서 제공하는 메서드 호출 등이 있습니다. 🎜🎜🎜🎜ParameterHandler🎜🎜🎜🎜WhenMyBatis 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);글꼴 계열: " operator mono consolas monaco menlo monospace break-all rgb>CallableStatement 코드> 및<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 ); 글꼴 계열: " operator mono consolas monaco menlo monospace break-all rgb>PreparedStatement, ParameterHandler는 명령문 개체 매개변수 자리 표시자의 값을 설정하는 데 사용됩니다. . 🎜🎜🎜🎜ResultSetHandler🎜🎜🎜🎜ResultSetHandlerJDBC에서 ResultSet 개체의 작업을 캡슐화합니다. SQL 유형 SELECT 문을 실행할 때 ResultSetHandler는 쿼리 결과를 Java 개체로 변환하는 데 사용됩니다. 🎜

TypeHandler

TypeHandler 이는 Java 유형과 JDBC 유형 간의 매핑을 처리하는 데 사용되는 MyBatis의 유형 프로세서입니다. 해당 기능은 주로 PreparedStatement 또는 CallableStatement 해당 객체 setXXX()

메소드가 값을 설정합니다. 그리고 해당 getXXX() SQL 실행 결과를 가져옵니다. TypeHandler是MyBatis中的类型处理器,用于处理Java类型与JDBC类型之间的映射。它的作用主要体现在能够根据Java类型调用PreparedStatementCallableStatement对象对应的setXXX()方法为Statement对象设置值,而且能够根据Java类型调用ResultSet对象对应的getXXX()获取SQL执行结果。

使用JDBC API

JDBC API애플리케이션 개발, One 더 성가신 측면 중 하나는 JDBC 유형과 Java 유형 간의 변환을 처리하는 것입니다. Java 유형 및 JDBC 유형 변환과 관련된 두 가지 상황은 다음과 같습니다. 🎜
  • PreparedStatement
개체는 매개변수 자리 표시자입니다. 기호 값을 설정할 때 PreparedStatement 인터페이스 일련의 setXXX() code> 메서드를 사용하여 Java 유형을 해당 JDBC 유형으로 변환하고 매개변수 자리 표시자에 값을 할당합니다.
PreparedStatement对象为参数占位符设置值时,需要调用PreparedStatement接口中提供的一系列的setXXX()方法,将Java类型转换为对应的JDBC类型并为参数占位符赋值。
  • 执行SQL语句获取ResultSet对象后,需要调用ResultSet对象的getXXX()方法获取字段值,此时会将JDBC类型转换为Java类型。
  • MyBatis提供的TypeHandler及与Java类型和JDBC类型之间的对应关系:

    일주일만에 마이바티스 소스코드를 학습한 후 10,000 단어 요약본을 받았습니다.

    小结

    我们使用到了SqlSession组件,它是用户层面的API。实际上SqlSession是Executor组件的外观,目的是为用户提供更友好的数据库操作接口,这是设计模式中外观模式的典型应用。

    真正执行SQL操作的是Executor组件,Executor可以理解为SQL执行器,它会使用StatementHandler

    SQL 문을 실행하여 ResultSet 객체의 경우 getXXX() 메소드는 필드값을 얻어오는데, 이때 JDBC 유형이 Java 유형으로 변환됩니다.

    MyBatis 제공 TypeHandler 및 Java 유형과 JDBC 유형 간 대응 : 🎜

    일주일만에 마이바티스 소스코드를 학습한 후 10,000 단어 요약본을 받았습니다.🎜 그림>

    요약

    우리는 SqlSession 구성 요소는 사용자 수준 API입니다. 실제로SqlSession은 Executor 구성 요소의 모양입니다. 디자인 패턴에 외관 패턴을 적용한 대표적인 데이터베이스 조작 인터페이스를 사용자에게 보다 친숙하게 제공하는 것이 목적입니다. 🎜

    실제로 SQL을 실행합니다. 작업은 실행기 구성 요소입니다. 실행기는 SQL 실행기로 이해될 수 있습니다. StatementHandler 구성 요소는 JDBC 문 개체에서 작동합니다. 🎜

    Statement 유형이 CallableStatement 및 PreparedStatement, 매개변수는 ParameterHandler가 차지합니다. 컴포넌트 캐릭터 할당. ParameterHandler 구성 요소는 다음에 따라 해당 항목을 찾습니다. Java 유형 TypeHandler 객체, TypeHandler가 전달됩니다. 개체 -크기: 14px; 패딩: 2px 4px; 테두리 반경: 4px; 여백 오른쪽: 2px; 여백 왼쪽: 2px; 배경 색상: rgba(27, 31, 35, 0.05); 글꼴 계열: " Operator Mono ", Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(239, 112, 96);">setXXX() 메소드(예: setString() 메소드)는 문 개체 매개 변수 자리 표시자 설정 값에 있습니다. CallableStatementPreparedStatement时,会通过ParameterHandler组件为参数占位符赋值。ParameterHandler组件中会根据Java类型找到对应的TypeHandler对象,TypeHandler中会通过Statement对象提供的setXXX()方法(例如setString()方法)为Statement对象中的参数占位符设置值。

    StatementHandler组件使用JDBC中的Statement对象与数据库完成交互后,当SQL语句类型为SELECT时,MyBatis通过ResultSetHandler

    StatementHandler 구성 요소는 JDBC After에서 명령문을 사용합니다. 개체는 데이터베이스와의 상호 작용을 완료합니다. SQL 문 유형이 SELECT인 경우 MyBatis는 ResultSetHandler 구성 요소는 State 개체에서 ResultSet 개체를 가져온 다음 ResultSet 개체를 Java 개체로 변환합니다.

    고급 기술

    디자인 패턴

    MyBatis에서는 디자인 패턴이 광범위하게 사용됩니다. 🎜
    • 팩토리 패턴
    • 템플릿 메소드 패턴
    • 에이전트 패턴
    • 빌더 패턴
    • 싱글턴 패턴
    • 적응 패턴
    • 데코레이터 모드
    • 책임 사슬 패턴
    • ...

    Caching

    웹 애플리케이션에서 캐싱은 필수 구성 요소입니다. 일반적으로 우리는 Redis 또는 memcached와 같은 캐싱 미들웨어를 사용하여 데이터베이스에 대한 많은 요청을 가로채고 데이터베이스에 대한 부담을 줄입니다. 중요한 구성 요소로서 MyBatis는 자연스럽게 내부적으로 해당 지원을 제공합니다. 프레임워크 수준에서 캐싱 기능을 추가하면 데이터베이스에 대한 부담을 줄이고 쿼리 속도를 향상시킬 수 있습니다. 일석이조라고 할 수 있습니다.

    MyBatis 캐시 구조는 一级缓存二级缓存로 구성됩니다. 두 캐시 수준 모두 Cache 인터페이스를 사용하는 구현 클래스입니다. 따라서 다음 장에서는 먼저 여러 Cache 구현 클래스의 소스 코드를 소개한 다음 1단계 및 2단계 캐시 구현을 분석합니다.

    MyBatis 1차 수준 캐시와 2차 수준 캐시 사용: MyBatis 1차 수준 캐시는 SqlSession 수준 캐시로 기본적으로 활성화되어 있으며 2차 수준 캐시를 켜야 합니다. MyBatis 기본 구성 파일에서 캐시Enabled 매개변수 값을 설정합니다.

    첫 번째 레벨 캐시는 Executor에서 구현됩니다. MyBatis의 Executor 구성 요소에는 SimpleExecutor 코드>, ReuseExecutor 및 BatchExecutor. 이 클래스는 모두 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">BaseExecutor에서 상속됩니다. code>, in BaseExecutor 클래스의 query() 메소드에서는 쿼리 결과를 먼저 캐시에서 가져옵니다. 결과를 가져올 수 없는 경우 데이터베이스에서 결과를 가져온 다음 쿼리 결과를 캐시합니다. MyBatis의 두 번째 수준 캐시는 데코레이터 모드를 통해 구현됩니다. 두 번째 수준 캐시가 캐시Enabled 매개변수를 통해 활성화되면 MyBatis 프레임워크는 SimpleExecutor, ReuseExecutor 또는 BatchExecutor가 데코레이팅되어 쿼리 작업이 수행되면 쿼리 결과가 캐시되고, 업데이트 작업이 수행되면 보조 캐시가 업데이트됩니다. 이 장에서는 마침내 MyBatisRedis 통합 방법 레벨 2 캐시로. SimpleExecutorReuseExecutorBatchExecutor。这些类都继承自BaseExecutor,在BaseExecutor类的query()方法中,首先从缓存中获取查询结果,如果获取不到,则从数据库中查询结果,然后将查询结果缓存起来。而MyBatis的二级缓存则是通过装饰器模式实现的,当通过cacheEnabled参数开启了二级缓存,MyBatis框架会使用CachingExecutor对SimpleExecutorReuseExecutor或者BatchExecutor进行装饰,当执行查询操作时,对查询结果进行缓存,执行更新操作时则更新二级缓存。本章最后介绍了MyBatis如何整合Redis作为二级缓存。

    除此之外,MyBatis还支持EhcacheOSCache

    또한 MyBatis는 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 ); 글꼴 계열: " operator mono consolas monaco menlo monospace break-all rgb>OSCache 등, 이 기능은 아님 일반적으로 사용되는.

    플러그인

    대부분의 프레임워크는 플러그인을 지원합니다. 사용자는 플러그인을 작성하여 기능을 확장할 수 있으며 Mybatis도 예외는 아닙니다.

    MyBatis는 Mapper 실행 시 SQL의 실행 동작을 변경할 수 있는 확장 메커니즘을 제공합니다. 이 확장 메커니즘은 인터셉터를 통해 구현되며 사용자 정의 인터셉터를 MyBatis 플러그인이라고도 합니다. 🎜

    MyBatis 프레임워크는 ExecutorParameterHandlerResultSetHandlerStatementHandler네 가지 구성 요소 메서드 차단을 지원합니다. MyBatis 플러그인의 구현 원리를 숙지한 후 페이징 쿼리 플러그인과 느린 SQL 통계 플러그인을 구현합니다. MyBatis 프레임워크에서 필요한 기능을 충족할 수 없는 경우 사용자 정의 플러그인을 통해 구현하는 것을 고려할 수 있습니다. -인.

    클래식 구현: PageHelper.

    Log

    MyBatis는 다양한 로깅 프레임워크에 해당하는 Log 인터페이스 구현을 제공합니다. Log 인터페이스의 구현 클래스는 아래 그림에 나와 있습니다. 구현 클래스에서 볼 수 있듯이 MyBatis는 다음과 같이 7가지 다른 로그 구현을 지원합니다.

    일주일만에 마이바티스 소스코드를 학습한 후 10,000 단어 요약본을 받았습니다.

    다음은 일반적으로 사용되는 몇 가지에 대한 간략한 설명입니다.

    • Apache Commons 로깅: JCL을 사용하여 로그를 출력합니다.
    • Log4j 2: Log4j 2 프레임워크를 사용하여 로그를 입력합니다.
    • Java Util Logging: JDK에 내장된 로깅 모듈을 사용하여 로그를 출력합니다.
    • Log4j: Log4j 프레임워크를 사용하여 로그를 출력합니다.
    • 로깅 없음: 로그가 출력되지 않습니다.
    • SLF4J: SLF4J 로그 파사드를 사용하여 로그를 출력합니다.
    • Stdout: 로그를 표준 출력 장치(예: 콘솔)로 출력합니다.

    MyBatis가 로그 프레임워크를 찾는 순서는

    SLF4J→JCL→Log4j2→Log4j→JUL→No Logging입니다.

    Classpath 아래에 로깅 프레임워크가 없으면 NoLoggingImpl 로그 구현 클래스가 사용됩니다. 즉, 로그가 출력되지 않습니다.

    동적 SQL 바인딩

    동적 SQL이란 특정 조건을 미리 예측할 수 없다는 뜻으로, 런타임 시 특정 상황에 따라 SQL 문을 동적으로 생성해야 한다는 의미입니다.

    MyBatis에는 다음과 같은 풍부한 동적 SQL 태그가 있습니다. 색상: rgba(27, 31, 35, 0.05); 글꼴 계열: "Operator Mono", Consolas, Monaco, Menlo, monospace; 단어 구분: break-all; 색상: rgb(239, 112, 96);" >22f13214d535b3a6f90647eb20dce94f

    , 878f78926d9809ae9b4ac70f1db9e212잠깐. 196185dae55b7edbe154a5051db664a7f3bf5eff46860b27119c8dd4e92f1e577c3646f85db7ce074bf2e07d38d2c6e1800a174bf160103126f2a6097b3e44a4等。

    在MyBatis源码中有个SqlSource对象会作为MappedStatement对象的属性保存在MappedStatement对象中。执行Mapper时,会根据传入的参数信息调用SqlSource对象的getBoundSql()方法获取BoundSql对象,这个过程就完成了将SqlNode对象转换为SQL语句的过程。

    比如:,#{}

    MyBatis 소스 코드에는 MappedStatement 개체의 속성으로 MappedStatement 개체에 저장될 SqlSource 개체가 있습니다. Mapper가 실행되면 들어오는 매개변수 정보를 기반으로 SqlSource 개체의 getBoundSql() 메서드를 호출하여 BoundSql 개체를 가져옵니다. 이 프로세스를 통해 SqlNode 개체를 SQL 문으로 변환하는 과정이 완료됩니다.

    예: #{} Account 자리 표시자는 "?"로 대체되며, JDBC의 ReadyStatement 객체의 setXXX() 메서드가 호출되어 매개 변수 자리 표시자의 값을 설정하고 ${} 자리 표시자는 전달된 매개 변수 텍스트로 직접 대체됩니다. 콘텐츠. Summary

    이 글은 MyBatis 소스 코드 분석의 전반적인 경험입니다. 여러분에게 도움이 되기를 바랍니다. 🎜🎜🎜

    위 내용은 일주일만에 마이바티스 소스코드를 학습한 후 10,000 단어 요약본을 받았습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 Java后端技术全栈에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제