Maison > Java > javaDidacticiel > le corps du texte

Comment configurer le fichier de mappage Mapper.xml pour l'initialisation de Java Mybatis

王林
Libérer: 2023-05-03 23:10:09
avant
1421 Les gens l'ont consulté
Avant-propos :

Après avoir analysé le fichier de configuration global, l'étape suivante consiste à analyser le fichier Mapper, qui est analysé via XMLMapperBuilder

Analyser l'entrée du fichier Mapper

Méthode parse() de XMLMapperBuilder :

public void parse() {
    if (!configuration.isResourceLoaded(resource)) {
      configurationElement(parser.evalNode("/mapper"));
      configuration.addLoadedResource(resource);
      bindMapperForNamespace();
    }

    parsePendingResultMaps();
    parsePendingCacheRefs();
    parsePendingStatements();
  }
Copier après la connexion
  • Appelez la méthode configurationElement() pour analyser le fichier Mapper si le fichier Mapper actuel n'a pas été chargé. Ajoutez-le à la collection Configuration.loadedResources pour éviter un chargement répété. Obtenez l'interface Mapper correspondant au fichier Mapper et enregistrez-le pour le traitement. . Balises <resultMap> dont l'analyse a échoué

  • Gérer les balises <cache-ref> dont l'analyse a échoué

  • Gérer les instructions SQL qui ont échoué. parse

  • Focus sur la méthode configurationElement() de la classe XMLMapperBuilder<resultMap>标签

  • 处理解析失败的<cache-ref>标签

  • 处理解析失败的SQL语句

重点看一下XMLMapperBuilder类的configurationElement()方法

解析Mapper文件

MLMapperBuilder类的configurationElement()方法:

private void configurationElement(XNode context) {
    try {
      String namespace = context.getStringAttribute("namespace");
      if (namespace == null || namespace.isEmpty()) {
        throw new BuilderException("Mapper&#39;s namespace cannot be empty");
      }
      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 BuilderException("Error parsing Mapper XML. The XML location is &#39;" + resource + "&#39;. Cause: " + e, e);
    }
  }
Copier après la connexion
  • 解析Mapper文件的namespace属性

  • 解析<cache-ref>标签,这个标签是用来引用别的Cache缓存

  • 解析<cache>标签,这个标签是用来启用Mybatis的二级缓存的,一级缓存是默认开启的,在这个方法里解析到MapperBuilderAssistant类完成Cache的创建,保存在Configuration.caches的集合中,集合的key是namespace,值是Cache对象

  • 解析<parameterMap>标签,这个标签已经废弃了,一般使用parameterType 来定义参数的类名

  • 解析<resultMap>标签,这个标签是结果映射,它标签下的所有子标签解析后保存在ResultMap对象中,具体会解析先获取resultMap中的type,type是结果集映射成的java对象,然后解析resultMap标签的子标签,包括<constructor>、<id>、<result>、<collection>等标签,这些标签生成ResultMapping对象,然后获取id extends等属性,构建ResultMapResolver对象,创建ResultMap对象保存到Configuration.resultMaps集合中

  • 解析sql标签,这个标签是用来定义重复的sql片段的,解析出保存在Configuration.sqlFragments中

  • 解析<select>、<insert>、<update>、<delete>等SQL节点,这些标签大家肯定就熟悉了,就是我们的增删改查的sql语句,通过XMLStatementBuilder来进行解析,它会先解析<include>标签,然后解析<selectKey>

    Analyser le fichier Mapper
🎜La méthode configurationElement() de la classe MLMapperBuilder :🎜🎜rrreee🎜🎜🎜Analyser l'attribut d'espace de noms du fichier Mapper🎜 🎜🎜🎜Parse la balise <cache -ref>, cette balise est utilisée pour référencer d'autres caches Cache 🎜🎜🎜🎜Parsing la balise <cache>, cette balise est utilisée pour activer le cache de deuxième niveau de Mybatis, le cache de premier niveau est activé par défaut. Dans cette méthode, la classe MapperBuilderAssistant est analysée pour terminer la création du cache, qui est enregistré dans la collection Configuration.caches. La collection est un espace de noms et la valeur est l'objet Cache. 🎜🎜🎜🎜Parse la balise < du paramètre 🎜🎜🎜🎜Parsing de la balise <resultMap>, cette balise Il s'agit d'un mappage de résultats. Toutes les sous-balises sous sa balise sont analysées et stockées dans l'objet ResultMap Plus précisément, le type. dans resultMap est d'abord obtenu. Le type est l'objet Java mappé à l'ensemble de résultats, puis les sous-balises de la balise resultMap sont analysées, y compris <constructor>, <id>, <result>, <collection> et d'autres balises, ces balises génèrent des objets ResultMapping, puis obtiennent des attributs tels que id extends, construisent des objets ResultMapResolver, créent des objets ResultMap et les enregistrent dans la configuration 🎜🎜🎜🎜analysez la balise sql dans le .resultMaps Cette balise est utilisée pour définir des fragments SQL répétés. Les informations analysées sont enregistrées dans Configuration.sqlFragments, . /code> et d'autres nœuds SQL, ces étiquettes doivent être familières à tout le monde. Ce sont nos instructions SQL d'ajout, de suppression, de modification et d'interrogation, qui sont analysées via XMLStatementBuilder. Il analysera d'abord < , puis analysez la balise <selectKey>, enregistrez-la dans la collection Configuration.keyGenerators et enfin créez l'objet SqlSource via la méthode LanguageDriver.createSqlSource() pour créer l'objet MappedStatement, le sqlSource de le MappedStatement enregistre l'instruction SQL, sqlCommandType enregistre le type de l'instruction SQL et l'enregistre dans la collection Configuration.mappedStatements🎜🎜🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal