Varias preguntas sobre mybatis


1. ¿Cuál es la diferencia entre # {} y $ {} en MyBatis?

# {} es procesamiento de precompilación, $ {} significa empalme de cadenas. El motor mysql traducirá automáticamente # {} a? Luego, los parámetros se compilan previamente a través de readyStatement, que puede evitar la inyección de sql, pero $ {} no puede evitar la inyección de cadenas.

2. ¿Cuántos métodos de paginación tiene MyBatis? ¿Cuál es la diferencia entre ellos?

Hay dos métodos principales de paginación:

  • Paginación lógica: paginación a través de RowBounds integrados. Consultar muchos datos a la vez y luego recuperar los datos paginados en los resultados. Esto aumentará el consumo de memoria, provocará fácilmente un desbordamiento de la memoria y ejercerá más presión sobre la base de datos.
  • Paginación física: consulta una cantidad específica de datos codificando manualmente sql o mediante el complemento de paginación PageHelper. Este método de paginación puede prevenir eficazmente el desbordamiento de la memoria

3. ¿RowBounds consulta todos los resultados a la vez? ¿Por qué?

No, RowBounds no encontrará todos los datos a la vez. Debido a que mybatis es un paquete de jdbc y el controlador jdbc tiene una configuración de Fetch Size, esta configuración controla la cantidad máxima de datos que se pueden consultar desde la base de datos a la vez . En términos generales, el valor predeterminado de este parámetro es 1000, lo que significa que como máximo se pueden encontrar 1000 datos de la base de datos cada vez. Al hacer clic en Siguiente, se cargarán otros 1000 datos de la base de datos (si hay 1000 más), De esta forma, puede reducir eficazmente el riesgo de desbordamiento de la memoria.

4. ¿MyBatis admite la carga diferida? ¿Cuál es el principio de carga diferida?

MyBatis admite la carga diferida, simplemente configure lazyLoadingEnabled = true.
El principio de la carga diferida es activar la carga al llamar, en lugar de cargar información al inicializar. Por ejemplo, a.getB (). GetName (), no hay datos del objeto b en el objeto a. En este momento, cuando se llama al método getB (), se llamará a la consulta sql almacenada en jdbc , que desencadenar la asociación guardada b por separado. El SQL del objeto es consultar los datos relevantes del objeto b de la base de datos, y usar el método setter para asignarlo, y luego obtener la propiedad del nombre del objeto b para obtener los datos. Lo anterior es el principio básico de la carga diferida.

Quinto, ¿qué pasa con la caché de primer nivel y la caché de segundo nivel de MyBatis?

Caché de nivel 1: Caché local HashMap basado en PerpetualCache. Su ciclo de vida es consistente con SQLSession. Si hay múltiples SQLSessions u operaciones de base de datos en un entorno distribuido, pueden aparecer datos sucios. Después de vaciar o cerrar la sesión, todos los cachés de la sesión se vacían y el caché de primer nivel está habilitado de forma predeterminada.
Caché de segundo nivel: caché local HashMap basada en PerpetualCache. La diferencia es que su alcance de almacenamiento es el nivel del asignador. Si varias sesiones SQL necesitan compartir el caché, debe usar el caché de segundo nivel y el caché de segundo nivel puede personalizar la fuente de almacenamiento, como Ehcache. La caché de segundo nivel no está activada de forma predeterminada. Para habilitar la caché de segundo nivel, el uso de la clase de atributo de la caché de segundo nivel debe implementar la interfaz de serialización serializable (que se puede usar para guardar el estado del objeto) .

6. ¿Cuáles son las diferencias entre MyBatis e hibernate?

1. Flexibilidad: MyBatis es más flexible, usted mismo puede escribir sentencias SQL, lo cual es más conveniente de usar.
2. Portabilidad: MyBatis tiene mucho SQL escrito por sí mismo, porque el SQL de cada base de datos puede ser diferente, por lo que la portabilidad es relativamente pobre.
3. El umbral de aprendizaje y uso: MyBatis es relativamente sencillo de empezar y el umbral de uso también es más bajo.
4. Caché de segundo nivel: hibernate tiene una mejor caché de segundo nivel, y su caché de segundo nivel se puede reemplazar por una caché de segundo nivel de terceros.

7. ¿Qué ejecutores (Ejecutor) tiene MyBatis?

SimpleExecutor: abre un objeto Statement cada vez que se ejecuta una actualización o selección, y cierra el objeto Statement tan
pronto como se agote ; ReuseExecutor: ejecuta actualizar o seleccionar, utiliza SQL como clave para encontrar el objeto Statement, úsalo si existe , créelo si no existe y no lo cierre después de su uso. El objeto Statement se coloca en el mapa para el próximo uso. En resumen, es reutilizar el objeto Statement;
BatchExecutor: ejecutar la actualización (sin seleccionar, el procesamiento por lotes de jdbc no admite la selección), agregar todo el SQL al lote (addBatch ()), esperar la ejecución unificada (executeBatch ()), Almacena en caché varios objetos Statement, y cada objeto Statement espera el procesamiento por lotes de executeBatch () después de que se completa addBatch (), que es lo mismo que el procesamiento por lotes de jdbc.

8. ¿Cuál es el principio de realización del complemento de paginación MyBatis?

El principio básico del complemento de paginación es utilizar la interfaz del complemento proporcionada por MyBatis para implementar un complemento personalizado, interceptar el SQL que se ejecutará en el método de interceptación del complemento, luego reescribir el SQL y agregar el correspondiente declaración de paginación física y parámetros de paginación física según el dialecto del dialecto.

9. ¿Cómo escribir un complemento personalizado para MyBatis?

Principio de implementación del
complemento personalizado MyBatis El complemento personalizado intercepta los cuatro objetos principales de MyBatis (Executor, StatementHandler, ParameterHandler, ResultSetHandler):
Executor: intercepta al ejecutor interno, que se encarga de llamar al StatementHandler para operar la base de datos y mapear automáticamente el resultado establecido a través del ResultSetHandler. Además, también maneja la operación de la caché de segundo nivel;
StatementHandler: intercepta el procesamiento de la construcción de la gramática SQL, es el objeto de MyBatis ejecutar scripts SQL directamente con la base de datos, y también implementa el caché de primer nivel de MyBatis;
ParameterHandler: intercepta el procesamiento de parámetros;
ResultSetHandler: Intercepta el procesamiento del conjunto de resultados.

Clave de implementación del complemento personalizado El complemento
MyBatis debe implementar la interfaz Interceptor. Los métodos contenidos en la interfaz son los siguientes:

public interface Interceptor {
    
    
	Object intercept(Invocation invocation) throws Throwable;
	Object plugin(Object target);
	void setProperties(Properties properties);
}

El método setProperties consiste en configurar propiedades relacionadas personalizadas al configurar el complemento en MyBatis, a saber: la configuración de parámetros del objeto de implementación de la interfaz; el
método del complemento es utilizado por el complemento para encapsular el objeto de destino, a través de este método podemos devolver el objeto de destino en sí, o devolver Uno de sus agentes puede decidir si interceptar y luego decidir qué tipo de objeto de destino devolver. Se proporciona el ejemplo oficial: return Plugin. wrap (destino, esto); El
método de intercepción es el método a ejecutar al interceptar.
Ejemplo de implementación de complemento personalizado Implementación de
complemento oficial:

@Intercepts({
    
    @Signature(type = Executor. class, method = "query",
args = {
    
    MappedStatement. class, Object. class, RowBounds. class, ResultHandler. class})})
public class TestInterceptor implements Interceptor {
    
    
	public Object intercept(Invocation invocation) throws Throwable {
    
    
		Object target = invocation. getTarget(); //被代理对象
		Method method = invocation. getMethod(); //代理方法
		Object[] args = invocation. getArgs(); //方法参数
		// do something . . . . . . 方法拦截前执行代码块
		Object result = invocation. proceed();
		// do something . . . . . . . 方法拦截后执行代码块
		return result;
	}
	
	public Object plugin(Object target) {
    
    
		return Plugin. wrap(target, this);
	}
}

10. Hablar sobre el principio de inicialización y el principio de ejecución de MyBatis.

Principio de inicialización:

  1. Llame al método build (inputStream) del objeto SqlSessionFactoryBuilder;
  2. SqlSessionFactoryBuilder creará un objeto XMLConfigBuilder basado en el flujo de entrada inputStream y otra información;
  3. SqlSessionFactoryBuilder llama al método parse () del objeto XMLConfigBuilder;
  4. El objeto XMLConfigBuilder devuelve el objeto Configuración;
  5. SqlSessionFactoryBuilder crea un objeto DefaultSessionFactory basado en el objeto de configuración;
  6. SqlSessionFactoryBuilder devuelve el objeto DefaultSessionFactory al Cliente para que lo utilice el Cliente;

Principio de implementación:
Paso 1, lea el archivo de configuración y almacénelo en el objeto de configuración para crear una SqlSessionFactory; el
paso 2, el proceso de ejecución de SqlSession, utiliza principalmente un mecanismo de reflexión y un proxy dinámico para completar la llamada subyacente de jdbc.

SqlSessionFactoryBuilder : el constructor de SqlSessionFactory, utilizado para crear SqlSessionFactory . Se adopta la
configuración del patrón de diseño Builder : Este objeto es toda la información de configuración de mybatis en el archivo mybatis-config.xml
SqlSessionFactory : clase de fábrica SqlSession. Cree el objeto SqlSession en forma de fábrica, utilizando el patrón de diseño de fábrica de fábrica
XmlConfigParser : responsable de analizar el archivo de configuración mybatis-config.xml en un objeto de configuración, que es utilizado por SqlSessonFactoryBuilder para crear SqlSessionFactory

Supongo que te gusta

Origin blog.csdn.net/qq_42697271/article/details/113853463
Recomendado
Clasificación