Après avoir analysé le fichier de configuration global, l'étape suivante consiste à analyser le fichier Mapper, qui est analysé via XMLMapperBuilder
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 <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()方法
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属性
解析<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>
<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!