Tema de la entrevista golden nine silver ten sprint-MyBatis (incluidas las respuestas)

Escrito en el frente: Las preguntas avanzadas de la entrevista de back-end de Java necesarias para la entrevista en 2020. Una guía de revisión se resume en Github. El contenido es detallado, con imágenes y textos. ¡Los amigos que necesitan aprender pueden protagonizar!
Dirección de GitHub: https://github.com/abel-max/Java-Study-Note/tree/master

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 con alta flexibilidad.
(2) MyBatis puede usar 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 la configuración manual de parámetros y obteniendo conjuntos de resultados.
(3) Configure varias sentencias para ser ejecutadas por medio de archivos xml o anotaciones, y genere las sentencias SQL ejecutadas finales mapeando los objetos java y los parámetros dinámicos de sql en la sentencia. Finalmente, el framework mybatis ejecuta sql y mapea los resultados como objeto java y retorno. (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, que desacopla el código SQL y el código del programa para facilitar la gestión unificada; se proporcionan etiquetas XML para apoyar la escritura Las sentencias de SQL dinámico se pueden 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 necesita cambiar manualmente las conexiones;
(3) Es compatible con varias bases de datos (porque MyBatis usa JDBC para conectarse Base de datos, siempre que la base de datos soportada por JDBC sea soportada por MyBatis).
(4) Puede 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 de relaciones de objetos para apoyar el mantenimiento de componentes de relación de objetos.

3. Desventajas del marco MyBatis

(1) La carga de trabajo de escritura de declaraciones SQL es relativamente grande, especialmente cuando hay muchos campos y tablas asociadas, existen ciertos requisitos para que los desarrolladores escriban declaraciones SQL.
(2) Las sentencias SQL dependen de la base de datos, lo que da como resultado 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, no es exactamente un framework ORM, porque MyBatis requiere que los programadores escriban sentencias Sql.
(2) Mybatis escribe directamente el 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, porque los requisitos de este tipo de software cambian con frecuencia y, una vez que los requisitos cambian, requieren una salida rápida. . Pero la premisa de la flexibilidad es que mybatis no puede ser independiente 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 usa hibernate para desarrollar software, puede guardar mucho código y mejorar la eficiencia.

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

{} es el procesamiento previo a la compilación, $ {} es el reemplazo de la cadena

Cuando Mybatis esté procesando # {}, reemplazará # {} en sql con un?
Sign , y llamará al método set de PreparedStatement para asignar un valor; cuando Mybatis esté procesando , será {}, que esCuando , que es el {} sustituir el valor de la variable.
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>

El segundo tipo: para mapear la correspondencia uno a uno entre los nombres de campo y los nombres de atributos de la 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: empalmar 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 al método de la interfaz, la cadena de empalme del nombre completo de la interfaz + el nombre del método como el valor de la clave puede localizar de forma única un MapperStatement. En Mybatis, cada etiqueta ,, y 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. Mybatis utilizará el proxy dinámico JDK para generar el proxy del objeto proxy para la interfaz Mapper cuando se ejecute. 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 de sql.

10. ¿Cómo funciona la paginación de Mybatis? ¿Cuál es el principio del complemento de paginación?

Mybatis usa el objeto RowBounds para la paginación, que es la paginación de memoria para el conjunto de resultados ResultSet, no la paginación física. Puede escribir los parámetros con paginación física directamente en sql para completar la función de paginación física, o puede usar el complemento de paginación para completar la paginación física.
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 y luego reescribir el SQL, de acuerdo con el dialecto, agregar la declaración de paginación física y los parámetros de paginación físicos correspondientes.

11. ¿Cómo encapsula Mybatis el resultado de la ejecución de sql como un objeto de destino y lo devuelve? ¿Cuáles son las formas de mapeo?

La primera es usar etiquetas para definir la relación de mapeo entre los nombres de las columnas de la base de datos y los nombres de los atributos de los objetos uno por uno.
El segundo es usar la función de alias de la columna sql para escribir el alias de la columna como el nombre del atributo del objeto.
Con la relación de mapeo entre los nombres de las columnas y los nombres de los atributos, Mybatis crea objetos a través de la reflexión y usa los atributos reflejados en los objetos para asignar y devolver uno por uno. Aquellos atributos que no pueden encontrar la relación de mapeo no pueden ser asignados.

12. ¿Cómo realizar la inserción a granel?

Primero, cree una declaración de inserción simple:

<insert id=”insertname”>
insert into names (name) values (#{value})
</insert>
然后在 java 代码中像下面这样执行批处理插入:
list < string > names = new arraylist();
names.add(“fred”);
names.add(“barney”);
names.add(“betty”);
names.add(“wilma”);
// 注意这里 executortype.batch
sqlsession sqlsession =
sqlsessionfactory.opensession(executortype.batch);
try {
namemapper mapper = sqlsession.getmapper(namemapper.class);
for (string name: names) {
mapper.insertname(name);
}
sqlsession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
throw e;
}
finally {
sqlsession.close();
}

13.¿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());

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

1. El primer tipo:
función de capa DAO
public UserselectUser (nombre de cadena, área de cadena);
xml correspondiente, # {0} representa el primer parámetro en la capa dao, # {1} representa el primer parámetro en la capa dao Dos parámetros, más parámetros se pueden agregar más tarde.

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

2. El segundo tipo: use 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 y pasarlo 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();
}

15. ¿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.

16. 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 de SQL dinámico, entre ellas se encuentran las etiquetas de fragmentos de SQL, importar fragmentos de SQL a través de etiquetas y generar etiquetas de estrategia para claves primarias que no admiten el incremento automático.

17. 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, entonces 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, no queda nada En id, la id duplicada hará que los datos se sobrescriban entre sí.
Con un espacio de nombres, la identificación se puede repetir de forma natural, y el espacio de nombres + identificación es naturalmente diferente si el espacio de nombres es diferente.

18. ¿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 de ORM semiautomática.

19. ¿Consultas relacionadas uno a uno, 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>

20. ¿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 El ID de clave externa del resultado dentro se usa para consultar datos en otra tabla, que también se configura mediante asociación, pero la consulta de otra tabla se configura mediante el atributo select.

21. 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, Consultar datos en otra tabla también se configura mediante recopilación, pero la consulta de otra tabla se configura a través del nodo de selección.

22. ¿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 la consulta 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 utilizar 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 (), y el método invoke () del interceptor encuentra que a.getB () es valor nulo, luego enviará por separado la consulta sql guardada previamente 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 la carga diferida con el mismo principio.

23, caché primaria y secundaria de Mybatis

1) Caché de nivel 1: Caché local de HashMap basado en PerpetualCache, su alcance de almacenamiento es Sesión. Después de vaciar o cerrar la sesión, todos los Caches en la sesión se vaciarán y el 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 por defecto. La diferencia es que el alcance de almacenamiento es Mapper (Namespace) 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
la operación C / U / D se realiza en un determinado ámbito (sesión de caché de primer nivel / espacios de nombres de caché de segundo nivel ), todas las cachés seleccionadas en este ámbito se borrarán de forma predeterminada.

24. ¿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 instrucción SQL, podemos llamar directamente al método de la interfaz, de modo que podamos tener opciones y configuraciones más flexibles que el método original proporcionado 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 a los métodos de la interfaz, que contienen 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 instrucción Sql es relativamente simple, use el enlace de anotación, cuando la instrucción SQL es más compleja, use el enlace xml, generalmente use más el enlace xml.

25. ¿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 parámetroType de cada SQL definido en mapper.xml ;
3. El tipo de método de la interfaz Mapper El tipo de parámetro de salida
es el mismo que 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.

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

La primera: la clase de implementación de la interfaz hereda SqlSessionDaoSupport: para utilizar 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 sqlMapConfig.xml

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

(2) Defina la interfaz del mapeador
(3) En el
método mapeador de integración de clases de implementación SqlSessionDaoSupport , this.getSqlSession () se puede usar para agregar, eliminar, modificar y verificar datos.
(4) Configuración de resorte

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

El segundo: use org.mybatis.spring.mapper.MapperFactoryBean:
(1) Configure la ubicación de mapper.xml en sqlMapConfig.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 asignador:
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 la identificación de la declaración definida en mapper.xml 3. La definición en
Spring

<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 del asignador:
(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 consistente con la identificación de la declaración definida en mapper.xml; si No es necesario configurar el nombre de mapper.xml y la interfaz del asignador de forma coherente en sqlMapConfig.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 está ubicado 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>

(4) Obtenga el objeto de implementación del asignador del contenedor de resorte después de usar el escáner.

27. 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 ser interceptados 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.

Supongo que te gusta

Origin blog.csdn.net/doubututou/article/details/109128923
Recomendado
Clasificación