Java java지도 시간 MyBatis 전체 미리보기 (1)

MyBatis 전체 미리보기 (1)

Mar 02, 2017 am 11:19 AM

제목: 최근 퇴근 후 마이바티스의 소스코드를 분석하게 되었습니다. 소스코드를 읽게 된 이유는 마이바티스의 물리적 페이징을 구현하기 위해서였습니다. 우리는 MyBatis가 논리적으로 페이징하고, 사용자 쿼리를 통해 결과를 캐싱하고, RowBounds 객체가 전달되었는지 확인하고, 그 안에 있는 오프셋 및 제한 값을 확인하고 있다는 것을 알고 있습니다. 이 두 값을 통해 반환된 결과 집합에서 값을 가로챕니다. 기간 내에. 그러나 이것은 그다지 좋지 않습니다. 쿼리하는 데이터의 양이 많지만 처음 몇 가지 항목이 유용하다면 이는 약간 낭비가 될 것입니다. 이전에 인터넷에서 페이징을 구현하는 방법에 대해서도 살펴보았는데, 가장 많이 사용되는 방법은 MyBatis 플러그인을 추가하고, Interceptor 인터페이스를 구현하고, StatementHandler 인터페이스에서 prepare 메소드를 인터셉트하는 방법이다. 이 인터페이스를 가로채는 방법은 나중에 소개됩니다. ResultSetHandler 인터페이스의 handlerResultSet 메소드를 가로채는 이유에 대해서는 뒤에서 소개하겠습니다. 그러나 이 방법은 페이징 SQL 문을 추가할 수 있지만 Mybatis가 SQL에 페이징 오프셋 및 제한 값을 동적으로 추가하는 것을 허용하지 않습니다. 그러나 이로 인해 SQL 주입 문제가 쉽게 발생합니다. 그래서 이것은 MyBatis의 내부 원리를 더 잘 이해하게 해주었습니다. 이번 글에서는

数据管家——Configuration:
    MyBatis在运行期的基本上所有的数据都会汇总到这个类。它的初始数据是来自开发人员配置在configuration的xml配置文件。通过用户配置的environments来获得系统运行的数据库环境,如事物管理以及数据源。下面给出了最基本的配置:
[html]
<configuration> 
<environments default="development"> 
<environment id="development"> 
<transactionManager type="JDBC" /> 
<dataSource type="POOLED"> 
<property name="driver" value="com.mysql.jdbc.Driver"/> 
<property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=GBK"/> 
<property name="username" value="root"/> 
<property name="password" value="root"/> 
</dataSource> 
</environment> 
</environments> 
<mappers> 
<mapper resource="com/bieber/mybatis/io/user-mapper.xml"/> 
</mappers> 
</configuration>
로그인 후 복사
这些配置对于MyBatis需要做哪些工作呢?通过阅读Configuration的源码会发现,Mybatis其实为configuration标签下面的子标签都有一个对应的变量来进行存储,例如:
[java]
protected final TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry();
로그인 후 복사
则是存储<typeHandlers></typeHandlers>标签下面配置的所有信息。其他的也类似可以找到。负责创建Configuration对象的则是XMLConfigurationBuilder,这里将完成从配置的XML数据映射到Configuration对象的数据。通过一下方法完成数据的映射:
[java]
private void parseConfiguration(XNode root) { 
    try { 
    propertiesElement(root.evalNode("properties"));         typeAliasesElement(root.evalNode("typeAliases")); 
        pluginElement(root.evalNode("plugins")); 
        objectFactoryElement(root.evalNode("objectFactory")); 
                  objectWrapperFactoryElement(root.evalNode("objectWrapperFactory")); 
      settingsElement(root.evalNode("settings")); 
      environmentsElement(root.evalNode("environments")); 
      databaseIdProviderElement(root.evalNode("databaseIdProvider")); 
      typeHandlerElement(root.evalNode("typeHandlers")); 
      mapperElement(root.evalNode("mappers")); 
    } catch (Exception e) { 
      throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e); 
    } 
  }
로그인 후 복사

보시다시피 각 요소에 대한 처리 방식에 해당하는 측면에서 MyBatis의 내부 구현을 분석해보겠습니다. 구성되었습니다. 여기서는 주로 www.2cto.com
(mapperElement, typeHandlerElement, typeAliasesElement, EnvironmentElement)
mapperElement——ORM
MyBatis가 주석 형식과 XML 형식 구성에서 ORM을 지원한다는 것을 알고 있습니다. 물론 이 두 가지 동작을 처리하는 두 개의 클래스가 있을 것입니다. XMLMapperBuilder와 MapperAnnotationBuilder가 각각 어떤 유형을 처리하는지 말할 필요는 없을 것 같습니다. 구성/매퍼 요소를 구문 분석하여 ORM 구성 정보를 얻습니다.
1) XML 기반 ORM 구성 및 방법 매퍼/매퍼 속성에 URL 또는 리소스 정보를 구성하면 MyBatis가 처리를 위해 XML을 사용하고 지정한 매퍼 경로를 읽도록 트리거됩니다. XMLMapperBuilder 클래스에는 다음과 같은 메소드가 있습니다:
[java]

private void configurationElement(XNode context) { 
 
    try { 
 
      String namespace = context.getStringAttribute("namespace"); 
 
      builderAssistant.setCurrentNamespace(namespace); 
 
      cacheRefElement(context.evalNode("cache-ref")); 
 
      cacheElement(context.evalNode("cache")); 
 
      parameterMapElement(context.evalNodes("/mapper/parameterMap")); 
 
      resultMapElements(context.evalNodes("/mapper/resultMap")); 
 
      sqlElement(context.evalNodes("/mapper/sql")); 
 
      buildStatementFromContext(context.evalNodes("select|insert|update|delete")); 
 
    } catch (Exception e) { 
 
      throw new RuntimeException("Error parsing Mapper XML. Cause: " + e, e); 
 
    } 
 
  }
로그인 후 복사

这个方法便是读取你mapper文件中所有制的ORM信息。该方法将通过调用XMLMapperBuilder的parse()方法触发。
    2)注解方式配置ORM信息加载,当你配置了mappers/package或者在mapper里面配置了class属性的时候将触发信息的读取,具体的过程我就再描述了,基本和上面差不多,只是读取的是注解的信息。
   
注意:MyBatis优先处理的是注解形式的方式,并且在mapper配置中,当配置了多个属性时,resource属性优先处理。
    那么在这样处理后Configuration会得到怎样的数据呢?通过这些处理在Configuration里面将会获得几个主要的变量值:sqlFragments,resultMaps,mappedStatements。其中sqlFragments就是我们定义在mapper里面的sql标签或者注解的内容,而resultMaps也是定义在mapper里面或者注解的resultMap内容。最重要的是mappedStatements,这是ORM的最关键部分。它里面通过键值对的方式存储,key这是我们配置的id属性加上namespace,而value则是MappedStatement对象,这个对象这就对应了我们配置的select/update/delete/insert标签的值。
    MappedStatement对象包含这条slq语句的ID,执行的类型(Inser,update,delte,select),statementType(指定产生Statement的类型,如PreparedStatement),还有一个就是SqlSource接口的子类对象,在MyBatis中有两种SqlSource,一种是动态的,另一种是静态的。不用解释,应该都明白,一个是生成动态SQL用的,另一个这是简单静态的SQL。在SqlSource中,包括你定义的SQL语句,以及引入的外部SQL语句块。MappedStatement最后还要包括一个重要的信息,这就是ParameterMap,这直接关系你定义的SQL语句中通过#{propertyName}定义的动态填充值。如果你的是一个POJO对象,那么MyBatis将会通过反射获得这个对象的属性,并依次填入到对应的propertyName所在的位置。
    注意:此时的MappedStatement中的SQL语句还是带有#{propertyName}这样占位符的字符串,还并没有解析成待问号(?)的占位符。要执行该操作是在执行具体的数据库操作的时候才替换成(?),只是为了很好的找到这个propertyName所对应的值所在的位置。
以上就将整个SqlSession的初始化过程所做的操作进行了解剖。完成这些操作之后,那么就等待用户触发对数据库的操作了。
   后续将会给出,MyBatis是如何触发用户自定义的插件的过程以及开发自己的TypeHandler。MyBatis允许用户的插件可以拦截ParameterHandler,ResultSetHandler,StatementHandler,Executor接口,从而进行一些操作。
   本文到此继续,后续会有新的更新。如有严重不对的地方,还望各位能够及时提出,毕竟对MyBatis的接触也只有一个星期,未免有些地方不对,还望大家谅解。

 以上就是MyBatis整体预览(一)的内容,更多相关内容请关注PHP中文网(www.php.cn)!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

iBatis vs. MyBatis: 어느 것이 당신에게 더 좋나요? iBatis vs. MyBatis: 어느 것이 당신에게 더 좋나요? Feb 19, 2024 pm 04:38 PM

iBatis vs. MyBatis: 무엇을 선택해야 할까요? 소개: Java 언어의 급속한 발전으로 인해 많은 지속성 프레임워크가 등장했습니다. iBatis와 MyBatis는 두 가지 인기 있는 지속성 프레임워크로, 둘 다 간단하고 효율적인 데이터 액세스 솔루션을 제공합니다. 이 기사에서는 iBatis와 MyBatis의 기능과 장점을 소개하고 적절한 프레임워크를 선택하는 데 도움이 되는 몇 가지 특정 코드 예제를 제공합니다. iBatis 소개: iBatis는 오픈 소스 지속성 프레임워크입니다.

MyBatis 동적 SQL 태그의 Set 태그 기능에 대한 자세한 설명 MyBatis 동적 SQL 태그의 Set 태그 기능에 대한 자세한 설명 Feb 26, 2024 pm 07:48 PM

MyBatis 동적 SQL 태그 해석: Set 태그 사용법에 대한 자세한 설명 MyBatis는 풍부한 동적 SQL 태그를 제공하고 데이터베이스 작업 명령문을 유연하게 구성할 수 있는 탁월한 지속성 계층 프레임워크입니다. 그 중 Set 태그는 업데이트 작업에서 매우 일반적으로 사용되는 UPDATE 문에서 SET 절을 생성하는 데 사용됩니다. 이 기사에서는 MyBatis에서 Set 태그의 사용법을 자세히 설명하고 특정 코드 예제를 통해 해당 기능을 보여줍니다. Set 태그란 무엇입니까? Set 태그는 MyBati에서 사용됩니다.

JPA와 MyBatis의 기능 및 성능 비교 분석 JPA와 MyBatis의 기능 및 성능 비교 분석 Feb 19, 2024 pm 05:43 PM

JPA와 MyBatis: 기능과 성능의 비교 분석 소개: Java 개발에서 지속성 프레임워크는 매우 중요한 역할을 합니다. 일반적인 지속성 프레임워크에는 JPA(JavaPersistenceAPI) 및 MyBatis가 포함됩니다. 이 기사에서는 두 프레임워크의 기능과 성능을 비교 분석하고 구체적인 코드 예제를 제공합니다. 1. 기능 비교: JPA: JPA는 JavaEE의 일부이며 객체 지향 데이터 지속성 솔루션을 제공합니다. 주석 또는 X가 전달되었습니다.

MyBatis에서 일괄 삭제 작업을 구현하는 다양한 방법 MyBatis에서 일괄 삭제 작업을 구현하는 다양한 방법 Feb 19, 2024 pm 07:31 PM

MyBatis에서 일괄 삭제 문을 구현하는 여러 가지 방법에는 특정 코드 예제가 필요합니다. 최근 몇 년 동안 데이터 양이 증가함에 따라 일괄 작업이 데이터베이스 작업의 중요한 부분이 되었습니다. 실제 개발에서는 데이터베이스의 레코드를 일괄적으로 삭제해야 하는 경우가 많습니다. 이 기사에서는 MyBatis에서 일괄 삭제 문을 구현하는 여러 가지 방법에 중점을 두고 해당 코드 예제를 제공합니다. 일괄 삭제를 구현하려면 foreach 태그를 사용하세요. MyBatis는 세트를 쉽게 탐색할 수 있는 foreach 태그를 제공합니다.

MyBatis 일괄 삭제 문 사용 방법에 대한 자세한 설명 MyBatis 일괄 삭제 문 사용 방법에 대한 자세한 설명 Feb 20, 2024 am 08:31 AM

MyBatis 일괄 삭제 문을 사용하는 방법에 대한 자세한 설명에는 특정 코드 예제가 필요합니다. 소개: MyBatis는 풍부한 SQL 작업 기능을 제공하는 뛰어난 지속성 계층 프레임워크입니다. 실제 프로젝트 개발을 하다 보면, 데이터를 일괄적으로 삭제해야 하는 상황이 자주 발생합니다. 이 기사에서는 MyBatis 일괄 삭제 문을 사용하는 방법을 자세히 소개하고 특정 코드 예제를 첨부합니다. 사용 시나리오: 데이터베이스의 많은 양의 데이터를 삭제할 때 삭제 문을 하나씩 실행하는 것은 비효율적입니다. 이때 MyBatis의 일괄삭제 기능을 사용할 수 있습니다.

MyBatis 캐시 메커니즘에 대한 자세한 설명: 한 기사에서 캐시 저장 원리를 이해합니다. MyBatis 캐시 메커니즘에 대한 자세한 설명: 한 기사에서 캐시 저장 원리를 이해합니다. Feb 23, 2024 pm 04:09 PM

MyBatis 캐싱 메커니즘에 대한 자세한 설명: 한 기사에서 캐시 저장의 원리를 읽어보세요. 소개 MyBatis를 데이터베이스 액세스에 사용할 때 캐싱은 데이터베이스에 대한 액세스를 효과적으로 줄이고 시스템 성능을 향상시킬 수 있는 매우 중요한 메커니즘입니다. 이 기사에서는 캐시 분류, 저장 원칙 및 특정 코드 예제를 포함하여 MyBatis의 캐싱 메커니즘을 자세히 소개합니다. 1. 캐시 분류 MyBatis 캐시는 주로 1단계 캐시와 2단계 캐시의 두 가지 유형으로 구분됩니다. 첫 번째 수준 캐시는 SqlSession 수준 캐시입니다.

MyBatis 1차 캐시에 대한 자세한 설명: 데이터 액세스 효율성을 향상시키는 방법은 무엇입니까? MyBatis 1차 캐시에 대한 자세한 설명: 데이터 액세스 효율성을 향상시키는 방법은 무엇입니까? Feb 23, 2024 pm 08:13 PM

MyBatis 1차 캐시에 대한 자세한 설명: 데이터 액세스 효율성을 향상시키는 방법은 무엇입니까? 개발 과정에서 효율적인 데이터 액세스는 항상 프로그래머의 초점 중 하나였습니다. MyBatis와 같은 지속성 계층 프레임워크의 경우 캐싱은 데이터 액세스 효율성을 향상시키는 주요 방법 중 하나입니다. MyBatis는 두 가지 캐싱 메커니즘을 제공합니다: 첫 번째 수준 캐시와 두 번째 수준 캐시는 기본적으로 활성화됩니다. 이 기사에서는 MyBatis 1단계 캐시의 메커니즘을 자세히 소개하고 독자의 이해를 돕기 위해 구체적인 코드 예제를 제공합니다.

MyBatis의 캐싱 메커니즘 분석: 1단계 캐시와 2단계 캐시의 특성 및 사용량 비교 MyBatis의 캐싱 메커니즘 분석: 1단계 캐시와 2단계 캐시의 특성 및 사용량 비교 Feb 25, 2024 pm 12:30 PM

MyBatis 캐싱 메커니즘 분석: 1단계 캐시와 2단계 캐시의 차이점 및 적용 MyBatis 프레임워크에서 캐싱은 데이터베이스 작업 성능을 효과적으로 향상시킬 수 있는 매우 중요한 기능입니다. 그중 1단계 캐시와 2단계 캐시는 MyBatis에서 일반적으로 사용되는 두 가지 캐싱 메커니즘입니다. 이 기사에서는 1차 수준 캐시와 2차 수준 캐시의 차이점과 적용을 자세히 분석하고 설명할 구체적인 코드 예제를 제공합니다. 1. 레벨 1 캐시 레벨 1 캐시는 로컬 캐시라고도 하며 기본적으로 활성화되어 있으며 끌 수 없습니다. 첫 번째 수준 캐시는 SqlSes입니다.

See all articles