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

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

王林
王林avant
2023-05-03 23:10:091381parcourir
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();
  }
  • 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 68a9ca67c267b134c127fbeac6659d23 dont l'analyse a échoué

  • Gérer les balises c9f60baecdceda902422ce5608e73ae9 dont l'analyse a échoué

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

  • Focus sur la méthode configurationElement() de la classe XMLMapperBuilder68a9ca67c267b134c127fbeac6659d23标签

  • 处理解析失败的c9f60baecdceda902422ce5608e73ae9标签

  • 处理解析失败的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'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 '" + resource + "'. Cause: " + e, e);
    }
  }
  • 解析Mapper文件的namespace属性

  • 解析c9f60baecdceda902422ce5608e73ae9标签,这个标签是用来引用别的Cache缓存

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

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

  • 解析68a9ca67c267b134c127fbeac6659d23标签,这个标签是结果映射,它标签下的所有子标签解析后保存在ResultMap对象中,具体会解析先获取resultMap中的type,type是结果集映射成的java对象,然后解析resultMap标签的子标签,包括3edd161182fff2dd0b855ad5d33f9b63、53384f78b45ee9f1e3082cf378b9c5b4、350c21220441cc2f18e31a24358fe33a、8a69e10c947129bb1dfe1f677169415f等标签,这些标签生成ResultMapping对象,然后获取id extends等属性,构建ResultMapResolver对象,创建ResultMap对象保存到Configuration.resultMaps集合中

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

  • 解析221f08282418e2996498697df914ce4e、3cdbca7b6e47052f0af62aa0d4c6123a、48dd0c1f550330068948da43aff71ce0、5cc62b85a20462d19109e58cc4ad0bf9等SQL节点,这些标签大家肯定就熟悉了,就是我们的增删改查的sql语句,通过XMLStatementBuilder来进行解析,它会先解析dcf91641426a34cf32ecc36140f28baf标签,然后解析d81480a879ba657d83c408e5fa1b948b

    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 7dcb86e21553f0921cace5da2772a6c9, cette balise est utilisée pour référencer d'autres caches Cache 🎜🎜🎜🎜Parsing la balise 62aecd17e676a41d3547c3bf97bb07b0, 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 <code>68a9ca67c267b134c127fbeac6659d23, 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 3edd161182fff2dd0b855ad5d33f9b63, 53384f78b45ee9f1e3082cf378b9c5b4, 350c21220441cc2f18e31a24358fe33a, 8a69e10c947129bb1dfe1f677169415f 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, 5cc62b85a20462d19109e58cc4ad0bf9. /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 <code>d81480a879ba657d83c408e5fa1b948b, 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer