dirección de GitHub
Fuente resolver la dirección
https://github.com/erlieStar/mybatis-3
depurar el código fuente con el proyecto
https://github.com/erlieStar/mybatis-examples
introducción
Mybatis procesos centrales se dividen en dos etapas
- Fase de inicialización: archivos de configuración XML de lectura y la información de configuración en las notas, cree un objeto de configuración, y la terminación de la inicialización de cada módulo
- Agente etapa dinámica: Una vez finalizada la ejecución de SQL, clase proxy dinámico, asignación de parámetros, la ejecución de SQL, los resultados de los mapas
Mybatis la fase de código de inicialización es todavía muy clara, sustancialmente es a diversos atributos en el archivo de configuración es analizada, entonces el valor almacenado a objeto de configuración. Perfiles divididos en dos partes, el perfil 1.mybatis, 2.mapper archivo de asignación.
Debido a analizar el archivo de configuración es bastante compleja, por lo que mybatis con el modo de constructor, el proceso de creación de objetos y los objetos se desacopla. La figura Builder como UML
Principalmente tiene las siguientes cuatro funciones:
- Comportamiento de diferentes partes del objeto: Constructor (Constructor) Interfaz
- constructor DETALLADA (ConcreteBuilder): En general hay dos tipos de métodos, un método de construcción, tales como buildPart1 (), 2 método de construcción para la obtención de unos buenos objetos de productos, tales como el método obtenerProducto ().
- Director (director): llamando a un constructor específico, cree productos necesarios
- Los usuarios tienen que utilizar objetos complejos: Producto (Producto)
XMLConfigBuilder: main-config.xml responsable de analizar la mybatis
XMLMapperBuilder: el principal responsable de resolver el mapa fichero de configuración de caché-ref, caché, parameterMap, resultMap, sql nodo
XMLStatementBuilder: el principal responsable de analizar el archivo de configuración de asignación de seleccionar, insertar, actualizar, eliminar lo cuatro tipos de nodos
El proyecto de ejemplo de la siguiente manera
public class Part4Main {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config4.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 这一句执行完后,Mybatis环境就初始化完了
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = null;
try {
sqlSession = sqlSessionFactory.openSession(true);
AuthorMapper authorMapper = sqlSession.getMapper(AuthorMapper.class);
List<Author> authorList = authorMapper.selectAuthortList();
authorList.forEach(item -> {
System.out.println(item);
});
} catch(Exception e) {
e.printStackTrace();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
}
Cuando se empieza a mirar el código fuente de una línea a ver, a ver el retorno final SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
Varios análisis gobierna No me describe en detalle, en contra de sus propios archivos de configuración de depuración cuantas veces lo sabrá. Un diagrama de tiempos del proceso de resolución es el siguiente
Persecución encontró última SqlSessionFactory volvió a DefaultSqlSessionFactory
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
Se puede ver el último analizado mediante la generación de un objeto de configuración, que se utiliza para almacenar diversas propiedades, y se puso a DefaultSqlSessionFactory, el objeto de configuración para ver lo que al final mantenido las cosas
public DefaultSqlSessionFactory(Configuration configuration) {
this.configuration = configuration;
}
Algunos pueden estar dispuestos en un booleano <configuración> nodo, se correlaciona directamente con atributos de los objetos de configuración puede mirar a la página oficial de la función de cada atributo
protected boolean safeRowBoundsEnabled;
protected boolean safeResultHandlerEnabled = true;
protected boolean mapUnderscoreToCamelCase;
protected boolean aggressiveLazyLoading;
Dijo que algunos de los atributos más importantes mappedStatements
protected final MapperRegistry mapperRegistry = new MapperRegistry(this);
Inicializado ha generado una fábrica dinámica clase de proxy para cada interfaz, esta clase se utilizará en el tiempo de seguimiento de los proxies dinámicos
protected final Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>("Mapped Statements collection");
Mapeo del archivo de configuración del nodo SQL se analiza en objetos MappedStatement, que las sentencias SQL se analizan en objetos SqlSource
Puedo ver un SQL poner 2 horas, nombres claves y métodos de interfaz está plenamente cualificado método de nombre + para poner un nombre a.
Algunos sencilla SQL tiempo de inicialización, se ha resuelto StaticSqlSource (puede contener? El texto sql), de manera que cuando se ejecuta siempre que los parámetros correspondientes será capaz de reemplazar lo que la ejecución
<delete id="deleteById" parameterType="int">
delete from book where id = #{id}
</delete>
Uso este ejemplo para correr detrás del proceso de proxy, no seleccione un nodo con el fin de que pueda entender rápidamente todo el proceso, y seleccionar el código de mapeo de los ganglios es bastante complejo
Mientras que algunos otros complejos de SQL no es así, siga Añadiré
el blog de referencia
[1] https://www.jianshu.com/p/7bc6d3b7fb45