Red de conocimiento informático - Conocimiento informático - Cómo encontrar el mapper.xml correspondiente y el grupo a través de la interfaz

Cómo encontrar el mapper.xml correspondiente y el grupo a través de la interfaz

Cuando se usa mybatis, un método es

BookMapper bookMapper = SqlSession().getMapper(BookMapper.class)

Obtenga la interfaz y luego llame al método de la interfaz. Siempre que el nombre del método sea el mismo que el nombre de identificación en el mapper.xml correspondiente, puede ejecutar sql.

Entonces, ¿cómo se corresponde la interfaz con mapper.xml?

Primero observe cómo funciona el método getMapper().

Configuration.getMapper() se llama en DefaultSqlSession.java

público T getMapper(Class tipo) {

devuelve configuración. T> getMapper(tipo, esto);

}

llamado mapperRegistry.getMapper(tipo, sqlSession) en Configuration.java;

público T getMapper(Class type, SqlSession sqlSession) {

return mapperRegistry.getMapper(type, sqlSession);

}

Aquí viene el punto clave, dinámico El proxy se implementa en MapperRegistry. java

public T getMapper(Class tipo, SqlSession sqlSession) {

final MapperProxyFactory mapperProxyFactory = (MapperProxyFactory)knownMappers. get(type);

if (mapperProxyFactory == null)

lanzar nueva BindingException("Type " + type + " no es conocido por MapperRegistry.");

intenta {

return mapperProxyFactory. newInstance(sqlSession);

} catch (Exception e) {

throw new BindingException("Error al obtener el asignador instancia."). Motivo: " + e, e);

}

}

Esta función se divide en dos partes. La primera parte es de la colección de mapas (el fuente de la colección de mapeo), la segunda parte es crear una instancia después de obtener el agente, obtener el método de interfaz y ejecutar sql.

Hay un método en MapperRegistry.java, a saber, addMappers() **. * Hay dos sobrecargas.

public void addMappers(String packageName, Class superType) {

ResolverUtil< Class> resolverUtil = new ResolverUtil>();

p>

// Busque todas las interfaces en el paquete por nombre de paquete para recorrerlas y colóquelas en la colección

resolverUtil.find(new ResolverUtil.IsA(superType), packageName) ;

Establecer<.Class > > mapperSet = resolverUtil.getClasses();

Para (Clase mapperCl)> mapperClass : mapperSet) {

addMapper(mapperClass);

}

}

//Resolución de interfaces bajo nombres de paquetes

public void addMappers(String paqueteName) {

addMappers(packageName, Object.class);

}

En SqlSessionFactory.

mapperElement(root) .evalNode("mappers" ));

mapperElement privado vacío (XNode padre) lanza una excepción {

if (padre! = nulo) {

for ( XNode child: parent.getChildren ()) {

//Utilice el nodo del paquete para analizar la configuración

if ("package".equals(child.getName())){

String mapperPackage = child.getStringAttribute("name");

Registre la interfaz en el paquete

configuration.addMappers(mapperPackage);

} else {

//Usar nodo asignador

String recurso = child.getStringAttribute("nombre");

}

}

Esto es para encontrar el xml correspondiente a través de la ruta completa de la interfaz. Hay dos métodos de análisis, que son las dos formas en que normalmente colocamos archivos xml.

La primera es no agregar un espacio de nombres, colocar el archivo xml y la interfaz en la misma ruta, y el nombre del xml y el nombre de la interfaz son los mismos. Por ejemplo, la interfaz es. se llama Student.java y el archivo xml es Student xml. en el mismo paquete.

Esto se puede hacer sin utilizar un espacio de nombres.

El segundo es agregar un espacio de nombres y encontrar el xml correspondiente a través del espacio de nombres.

Este es el xml para el nombre de la interfaz y todos los procedimientos de registro.

La segunda parte es obtener el nombre de la interfaz a través del proxy dinámico, que corresponde al id en xml.

Hay dos clases principales: MapperProxyFactory.java y MapperProxy.java

Para MapperProxyFactory.java

clase pública MapperProxyFactory {

Clase final privada mapperInterface;

Mapa privado {