Cómo encontrar el mapper.xml correspondiente y el grupo a través de la interfaz
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
devuelve configuración. T> getMapper(tipo, esto);
}
llamado mapperRegistry.getMapper(tipo, sqlSession) en Configuration.java;
público
return mapperRegistry.getMapper(type, sqlSession);
}
Aquí viene el punto clave, dinámico El proxy se implementa en MapperRegistry. java
public
final MapperProxyFactory
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 extiende Clase > > > 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())){ p> String mapperPackage = child.getStringAttribute("name"); Registre la interfaz en el paquete configuration.addMappers(mapperPackage); } else {
//Usar nodo asignador
String recurso = child.getStringAttribute("nombre");
} p>
}
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
Mapa privado