Las 25 preguntas más comunes de la entrevista de MyBatis

Bienvenido a seguir
CSDN: programador lamb
Cuenta pública de WeChat: programador lamb

1. ¿Qué es Mybatis?

  1. Mybatis es un marco semi-ORM (Object Relational Mapping), que encapsula JDBC internamente. Solo necesita prestar atención a la declaración SQL en sí durante el desarrollo, y no necesita gastar energía para lidiar con procesos complicados como cargar controladores, crear conexiones y crear declaraciones. El programador escribe directamente el SQL ecológico original, que puede controlar estrictamente el rendimiento de ejecución de SQL y tiene una gran flexibilidad.
  2. MyBatis puede utilizar XML o anotaciones para configurar y mapear información nativa, y mapear POJOs a registros en la base de datos, evitando casi todos los códigos JDBC y configuración manual de parámetros y obtención de conjuntos de resultados. 3. Configure las diversas sentencias que se ejecutarán a través de archivos xml o anotaciones, y genere las sentencias SQL ejecutadas finales a través del objeto java y los parámetros dinámicos de sql en la sentencia. Finalmente, mybatis framework ejecuta sql y mapea los resultados a java. Objetar y devolver. (El proceso desde la ejecución de sql hasta la devolución del resultado).

2. Las ventajas de Mybaits

  1. Basado en la programación de sentencias SQL, es bastante flexible y no tendrá ningún impacto en el diseño existente de la aplicación o base de datos. SQL está escrito en XML, lo que desacopla el código sql y el código del programa y facilita la administración unificada; se proporcionan etiquetas XML para respaldar la escritura de sentencias SQL dinámicas Y se puede reutilizar.
  2. En comparación con JDBC, reduce la cantidad de código en más del 50%, elimina una gran cantidad de código redundante en JDBC y no requiere conexiones de conmutador manuales;
  3. Es muy compatible con varias bases de datos (porque MyBatis usa JDBC para conectarse a la base de datos, siempre que la base de datos soportada por JDBC sea soportada por MyBatis).
  4. Capaz de integrarse bien con Spring;
  5. Proporcionar etiquetas de mapeo para admitir el mapeo de relaciones de campo ORM entre objetos y bases de datos; proporcionar etiquetas de mapeo relacional de objetos para respaldar el mantenimiento de componentes relacionales de objetos.

3. Desventajas del marco MyBatis

  1. La carga de trabajo de escribir sentencias SQL es relativamente grande, especialmente cuando hay muchos campos y tablas asociadas, existen ciertos requisitos para que los desarrolladores escriban sentencias SQL.
  2. Las declaraciones SQL dependen de la base de datos, lo que resulta en una portabilidad deficiente de la base de datos y la base de datos no se puede reemplazar a voluntad.

4. Ocasiones aplicables del marco MyBatis

  1. MyBatis se centra en SQL en sí mismo y es una solución de capa DAO suficientemente flexible.
  2. Para proyectos que tienen requisitos de alto rendimiento o cambios en la demanda, como proyectos de Internet, MyBatis será una buena opción.

5. ¿Cuál es la diferencia entre MyBatis e Hibernate?

  1. Mybatis es diferente de hibernate en que no es exactamente un marco ORM, porque MyBatis requiere que los programadores escriban sentencias Sql.
  2. Mybatis escribe directamente SQL ecológico original, que puede controlar estrictamente el rendimiento de ejecución de SQL y tiene una alta flexibilidad. Es muy adecuado para el desarrollo de software que no requiere altos requisitos para los modelos de datos relacionales, ya que dichos requisitos de software cambian con frecuencia y, una vez que la demanda, los cambios requieren una salida rápida. Pero la premisa de la flexibilidad es que mybatis no puede lograr la independencia de la base de datos. Si necesita implementar software que admita múltiples bases de datos, necesita personalizar múltiples conjuntos de archivos de mapeo SQL, lo cual es mucho trabajo.
  3. Hibernate tiene fuertes capacidades de mapeo relacional / de objetos y buena independencia de base de datos. Para software con altos requisitos para modelos relacionales, si desarrolla con Hibernate, puede guardar mucho código y mejorar la eficiencia.

6. ¿Cuál es la diferencia entre # {} y $ {}?

# {} es procesamiento de precompilación , error de análisis de KaTeX: Se esperaba 'EOF', obtuvo '#' en la posición 22:… reemplazo. Cuando Mybatis procesa # ̲ {} , reemplaza $ {} con el valor de la variable cuando se usa # {... {} en sql .
El uso de # {} puede prevenir eficazmente la inyección de SQL y mejorar la seguridad del sistema

7. ¿Qué debo hacer cuando el nombre del atributo en la clase de entidad es diferente del nombre del campo en la tabla?

Tipo 1: al definir el alias del nombre del campo en la instrucción SQL de la consulta, el alias del nombre del campo es coherente con el nombre del atributo de la clase de entidad.

<select id=”selectorder” parametertype=”int” resultetype= me.gacl.domain.order”>
select order_id id, order_no orderno ,order_price price form orders where order_id=#{id};
</select>

Tipo 2: Hasta para mapear la correspondencia uno a uno entre los nombres de campo y los nombres de atributos de clase de entidad.


<select id="getOrder" parameterType="int" resultMap="orderresultmap"> 
	select * from orders where order_id=#{id}
</select>
<resultMap type=”me.gacl.domain.order” id=”orderresultmap”>
	<!–用 id 属性来映射主键字段–>
	<id property=”id” column=”order_id”>
	
	<!–用 result 属性来映射非主键字段,property 为实体类属性名,column 为数据表中的属性–>
	<result property = “orderno” column =”order_no”/>
	<result property=”price” column=”order_price” />
</reslutMap>

8. ¿Cómo escribir una declaración similar en una consulta difusa?

Tipo 1: agregue el comodín sql en el código Java.


string wildcardname = “%smi%”;
list<name> names = mapper.selectlike(wildcardname);


<select id=”selectlike”>
	select * from foo where bar like #{value}
</select>

Tipo 2: el empalme de comodines en declaraciones SQL provocará una inyección SQL

String wildcardname = “smi”;
list<name> names = mapper.selectlike(wildcardname);

<select id=”selectlike”>
	select * from foo where bar like "%"#{value}"%"
</select>

9. Por lo general, un archivo de mapeo Xml escribirá una interfaz Dao correspondiente a él ¿Cuál es el principio de funcionamiento de esta interfaz Dao? Cuando los parámetros de los métodos en la interfaz de Dao son diferentes, ¿se pueden sobrecargar los métodos?

La interfaz de Dao es la interfaz de Mapper. El nombre completo de la interfaz es el valor del espacio de nombres en el archivo de mapeo;
el nombre del método de la interfaz es el valor de id de la declaración del asignador en el archivo de mapeo;
los parámetros en el método de la interfaz son los parámetros pasados ​​a sql.
La interfaz Mapper no tiene una clase de implementación. Cuando se llama a un método de interfaz, el nombre completo de la interfaz + el nombre del método empalmando la
cadena de caracteres como el valor de la clave pueden localizar de forma única un MapperStatement. En Mybatis, cada
etiqueta y etiqueta se analizará como un
objeto MapperStatement.

Por ejemplo: com.mybatis3.mappers.StudentDao.findStudentById, se puede encontrar el
único MapperStatement cuyo espacio de nombres es com.mybatis3.mappers.StudentDao y cuya identificación es findStudentById.

Los métodos en la interfaz Mapper no se pueden sobrecargar, porque se utiliza la
estrategia de almacenamiento y búsqueda de nombre completo + nombre de método . El principio de funcionamiento de la interfaz Mapper es el proxy dinámico JDK. Cuando Mybatis se ejecuta, utilizará el
proxy dinámico JDK para generar un proxy de objeto proxy para la interfaz Mapper. El objeto proxy interceptará el método de la interfaz y ejecutará el sql representado por MapperStatement, y luego devolverá el resultado de la ejecución sql.

10.¿Cómo obtener el valor de la clave (primaria) generada automáticamente?

El método de inserción siempre devuelve un valor int, que representa el número de filas insertadas.
Si se adopta la estrategia de crecimiento propio, el valor de clave generado automáticamente se puede establecer en el objeto de parámetro pasado después de que se ejecute el método de inserción.
Ejemplo:

<insert id=”insertname” usegeneratedkeys=”true” keyproperty=”id”> 
	insert into names (name) values (#{name})
</insert>
name name = new name(); name.setname(“fred”);
int rows = mapper.insertname(name);
// 完成后,id 已经被设置到对象中
system.out.println(“rows inserted =+ rows); 
system.out.println(“generated key value =+ name.getid());

11. ¿Cómo pasar múltiples parámetros en el mapeador?

1. El primer tipo:
función de capa DAO

public UserselectUser(String name,String area);

XML correspondiente, # {0} representa el primer parámetro en la capa dao que se recibe, # {1} representa el segundo parámetro en la capa dao, se pueden agregar más parámetros más adelante.

<select id="selectUser"resultMap="BaseResultMap">
	select * fromuser_user_t whereuser_name = #{0} anduser_area=#{1}
</select>

2. El segundo: usa la anotación @param

public interface usermapper {
    
    
	user selectuser(@param(“username”) string username,@param(“hashedpassword”) string hashedpassword);
}

Luego, se puede usar en xml como el siguiente (se recomienda empaquetarlo como un mapa, pasar al asignador como un solo parámetro

<select id=”selectuser” resulttype=”user”>
select id, username, hashedpassword from some_table where username = #{username}
and hashedpassword = #{hashedpassword}
</select>

3. El tercer tipo: varios parámetros se encapsulan en un mapa

try {
    
    
//映射文件的命名空间.SQL 片段的 ID,就可以调用对应的映射文件中的SQL
	//由于我们的参数超过了两个,而方法中只有一个 Object 参数收集,因此我们使用 Map 集合来装载我们的参数
	Map < String, Object > map = new HashMap(); map.put("start", start);
	map.put("end", end);
	return sqlSession.selectList("StudentID.pagination", map);
} catch (Exception e) {
    
     
	e.printStackTrace(); sqlSession.rollback(); throw e;
}
finally {
    
    
	MybatisUtil.closeSqlSession();
}

12. ¿Cuál es el uso de SQL dinámico de Mybatis? ¿Como funciona? ¿Qué son los SQL dinámicos?

Mybatis dynamic sql puede escribir sql dinámico en forma de etiquetas en el archivo de mapeo Xml. El principio de ejecución es completar el juicio lógico basado en el valor de la expresión y empalmar dinámicamente la función sql.
Mybatis proporciona 9 tipos de etiquetas SQL dinámicas: recortar | donde | establecer | foreach | si | elegir | cuando | de lo contrario | enlazar.

13. En el archivo de mapeo Xml, además de las etiquetas comunes select | insert | update | delete, ¿qué otras etiquetas hay?

Respuesta: ,,,,, más 9 etiquetas para sql dinámico, entre las que se encuentran las etiquetas de fragmentos de sql, introducir fragmentos de sql a través de etiquetas y generar etiquetas de estrategia para claves primarias que no admiten el incremento automático.

14. En el archivo de mapeo Xml de Mybatis, ¿se puede repetir la identificación para diferentes archivos de mapeo Xml?

Para diferentes archivos de mapeo Xml, si el espacio de nombres está configurado, la identificación se puede repetir; si el espacio de nombres no está configurado, entonces la identificación no se puede repetir; la
razón es que el espacio de nombres + id se usa como la clave de Map <String, MapperStatement>, si no hay espacio de nombres, habrá Debajo de la identificación, la identificación duplicada hará que los datos se sobrescriban entre sí. Con un espacio de nombres, id se puede repetir de forma natural, y el espacio de nombres + id es naturalmente diferente si el espacio de nombres es diferente.

15. ¿Por qué Mybatis es una herramienta de mapeo ORM semiautomática? ¿Cuál es la diferencia entre esto y completamente automático?

Hibernate es una herramienta de mapeo ORM completamente automática.Cuando usa Hibernate para consultar objetos relacionados u objetos de colección relacionados, puede obtenerlos directamente de acuerdo con el modelo de relación de objetos, por lo que está completamente automatizado. Cuando Mybatis consulta objetos relacionados u objetos de colección relacionados, debe escribir manualmente sql para completar, por lo que se denomina herramienta de mapeo ORM semiautomática.

16. ¿Consultas relacionadas uno a uno y uno a varios?

	<mapper namespace="com.lcb.mapping.userMapper">
		<!--association 一对一关联查询 -->
		<select id="getClass" parameterType="int" resultMap="ClassesResultMap"> select * from class c,teacher t where c.teacher_id=t.t_id and c.c_id=#{
    
    id}
		</select>
		<resultMap type="com.lcb.user.Classes" id="ClassesResultMap">
			<!-- 实体类的字段名和数据表的字段名映射 -->
			<id property="id" column="c_id" />
			<result property="name" column="c_name" />
			<association property="teacher" javaType="com.lcb.user.Teacher">
				<id property="id" column="t_id" />
				<result property="name" column="t_name" />
			</association>
		</resultMap>
		<!--collection 一对多关联查询 -->
		<select id="getClass2" parameterType="int" resultMap="ClassesResultMap2">
			select * from class c,teacher t,student s where c.teacher_id=t.t_id and c.c_id=s.class_id and c.c_id=#{
    
    id}
		</select>
		<resultMap type="com.lcb.user.Classes" id="ClassesResultMap2">
			<id property="id" column="c_id" />
			<result property="name" column="c_name" />
			<association property="teacher" javaType="com.lcb.user.Teacher">
				<id property="id" column="t_id" />
				<result property="name" column="t_name" />
			</association>
			<collection property="student" ofType="com.lcb.user.Student">
				<id property="id" column="s_id" />
				<result property="name" column="s_name" />
			</collection>
		</resultMap>
	</mapper>

17. ¿De cuántas formas implementa MyBatis uno a uno? ¿Cómo se hace?

Hay consultas conjuntas y consultas anidadas. La consulta conjunta es una consulta conjunta de varias tablas, que se pueden consultar solo una vez. Se puede completar configurando el nodo de asociación en el resultMap para configurar una clase uno a uno;
la consulta anidada es verificar una tabla primero, de acuerdo con esta tabla La identificación de la clave externa del resultado en ella, para consultar datos en otra tabla, también se configura mediante asociación, pero la consulta de otra tabla se configura mediante el atributo select

18. Hay varias formas de realizar uno a muchos en MyBatis, ¿cómo operar?

Hay consultas conjuntas y consultas anidadas. Una consulta conjunta es una consulta conjunta de varias tablas, que solo se consulta una vez, y se puede completar configurando una clase de uno a varios en el nodo de colección en el resultMap; una consulta anidada es verificar una tabla primero, de acuerdo con el ID de clave externa del resultado en la tabla, La consulta de datos en otra tabla también se configura a través de la recopilación, pero la consulta de otra tabla se configura mediante el nodo de selección.

19. ¿Mybatis admite la carga diferida? Si es así, ¿cuál es su principio de implementación?

Respuesta: Mybatis solo admite la carga diferida de objetos de asociación y objetos de colección. La asociación se refiere a uno a uno y la colección se refiere a consultas de uno a varios. En el archivo de configuración de Mybatis, puede configurar si habilitar la carga diferida lazyLoadingEnabled = true | false.
Su principio es usar CGLIB para crear el objeto proxy del objeto objetivo. Cuando se llama al método objetivo, ingrese el método interceptor, como llamar a a.getB (). GetName (), el método invoke () del interceptor encuentra que a.getB () es valor nulo, luego enviará por separado la consulta sql previamente guardada asociada con el objeto B, consultará B hacia arriba y luego llamará a a.setB (b), por lo que el atributo del objeto b de a tiene un valor, y luego completará a.getB ( ) .getName ()
llamada al método. Este es el principio básico de la carga diferida.
Por supuesto, no solo Mybatis, sino casi todos, incluido Hibernate, admiten el principio de carga diferida.

20, caché primaria y secundaria de Mybatis

  1. Caché de nivel 1: Caché local HashMap basado en PerpetualCache. Su alcance de almacenamiento es Sesión. Después de que la sesión se descargue o cierre, se vaciarán todas las Caches de la sesión y la caché de Nivel 1 se activará de forma predeterminada.
  2. El mecanismo de la caché de segundo nivel es el mismo que el de la caché de primer nivel. El almacenamiento PerpetualCache y HashMap también se utilizan de forma predeterminada. La diferencia es que el alcance del almacenamiento es Mapper (espacio de nombres) y la fuente de almacenamiento se puede personalizar, como Ehcache. El caché de segundo nivel no está activado de forma predeterminada. Para habilitar el caché de segundo nivel, el uso de la clase de atributo de caché de segundo nivel debe implementar la interfaz de serialización serializable (que se puede usar para guardar el estado del objeto), que se puede configurar en su archivo de mapeo;
  3. Para el mecanismo de actualización de datos de caché, cuando se realiza una operación C / U / D en un determinado ámbito (sesión de caché de primer nivel / espacios de nombres de caché de segundo nivel), de forma predeterminada, se borrarán todas las cachés de selección bajo este ámbito.

21. ¿Qué es el enlace de interfaz de MyBatis? ¿Cuáles son las formas de lograrlo?

La vinculación de la interfaz es definir la interfaz arbitrariamente en MyBatis, y luego vincular los métodos en la interfaz a la declaración SQL, podemos llamar directamente al método de la interfaz, de modo que podamos tener opciones y configuraciones más flexibles que los métodos originales proporcionados por SqlSession .
Hay dos formas de implementar el enlace de la interfaz. Una es enlazar mediante anotaciones, que consiste en agregar @Select, @Update y otras anotaciones al método de la interfaz, que contiene sentencias Sql para enlazar; la otra es escribir SQL en xml Para enlazar, en este caso, el espacio de nombres en el archivo de mapeo xml debe ser el nombre de ruta completo de la interfaz. Cuando la declaración Sql es relativamente simple, use el enlace de anotación, cuando la declaración SQL es más compleja, use el enlace xml, generalmente use más el enlace xml.

22. ¿Cuáles son los requisitos al utilizar la interfaz del mapeador de MyBatis para llamar?

  1. El nombre del método de la interfaz Mapper es el mismo que el ID de cada SQL definido en mapper.xml;
  2. El tipo de parámetro de entrada del método de la interfaz Mapper es el mismo que el tipo de parámetro de cada SQL definido en mapper.xml;
  3. El tipo de parámetro de salida del método de interfaz Mapper es el mismo que el resultType de cada SQL definido en mapper.xml;
  4. El espacio de nombres en el archivo Mapper.xml es la ruta de clase de la interfaz del asignador.

23. ¿Cuáles son las distintas formas de escribir Mapper?

La primera: la clase de implementación de la interfaz hereda SqlSessionDaoSupport: para usar este método, debe escribir la interfaz del asignador, la clase de implementación de la interfaz del asignador y el archivo mapper.xml.
1. Configure la ubicación de mapper.xml en sqlMapCon fi g.xml

<mappers>
	<mapper resource="mapper.xml 文件的地址" />
	<mapper resource="mapper.xml 文件的地址" />
</mappers>

2. Definir la interfaz del mapeador
3. Implementar la integración de clases El método del mapeador SqlSessionDaoSupport se puede utilizar en this.getSqlSession () para la adición, eliminación y modificación de datos.
4. Configuración de primavera

<bean id=" " class="mapper 接口的实现">
	<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>

El segundo método: use org.mybatis.spring.mapper.MapperFactoryBean:
1. Configure la ubicación de mapper.xml en sqlMapCon fi g.xml. Si mapper.xml y la interfaz mappre tienen el mismo nombre y están en el mismo directorio, no es necesario configurar

<mappers>
	<mapper resource="mapper.xml 文件的地址" />
	<mapper resource="mapper.xml 文件的地址" />
</mappers>

2. Defina la interfaz del mapeador:

  1. El espacio de nombres en mapper.xml es la dirección de la interfaz del asignador
  2. El nombre del método en la interfaz del asignador es coherente con el id de la declaración definida en mapper.xml
  3. Definido en primavera
<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
	<property name="mapperInterface" value="mapper 接口地址" />
	<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

El tercer tipo: use el escáner de mapas:

  1. Escriba el archivo mapper.xml:
    el espacio de nombres en mapper.xml es la dirección de la
    interfaz del asignador; el nombre del método en la interfaz del asignador es coherente con el id de la declaración definida en
    mapper.xml ; si los nombres de mapper.xml y la interfaz del asignador son coherentes, No es necesario configurar en sqlMapCon fi g.xml.
  2. Defina la interfaz del asignador:
    tenga en cuenta que el nombre de archivo de mapper.xml es coherente con el nombre de la interfaz del asignador y se coloca en el mismo directorio
  3. Configure el escáner del asignador:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="mapper 接口包地址"></property>
	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
  1. Después de usar el escáner, obtenga el objeto de implementación del asignador del contenedor de resorte.

24. Describa brevemente el principio de funcionamiento del complemento Mybatis y cómo escribir un complemento.

Respuesta: Mybatis solo puede escribir complementos para las cuatro interfaces de ParameterHandler, ResultSetHandler, StatementHandler y Executor. Mybatis usa el proxy dinámico del JDK para generar objetos proxy para las interfaces que deben ser interceptadas para implementar la función de interceptación del método de interfaz. Siempre que se ejecutan estas cuatro interfaces Cuando el método del objeto, ingresará al método de interceptación, específicamente el método invoke () del InvocationHandler. Por supuesto, solo aquellos métodos que usted especifique para interceptar serán interceptados.
Escriba un complemento: implemente la interfaz Interceptor de Mybatis y anule el método intercept (), y luego escriba una anotación para el complemento para especificar qué métodos de qué interfaz desea interceptar. Recuerde, no olvide configurar el complemento que escribió en el archivo de configuración.

25. ¿De cuántas formas implementa MyBatis uno a uno ?, ¿cómo se hace?

Hay consultas conjuntas y consultas anidadas. La consulta conjunta es una consulta conjunta de varias tablas, que se puede consultar solo una vez. Se puede completar configurando el nodo de asociación en el resultMap para configurar una clase uno a uno;
la consulta anidada es verificar una tabla primero, de acuerdo con esta tabla El ID de clave externa del resultado dentro, para consultar datos en otra tabla, también se configura mediante asociación, pero la consulta de otra tabla se configura mediante el atributo select

Conexión extendida: haga clic aquí para estilos más atrevidos

El programador de cuentas públicas del blogger, Xiaoyang, solo publica tweets relacionados con entrevistas.
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_44395707/article/details/106328597
Recomendado
Clasificación