Puntos de conocimiento de la entrevista Mybatis, puntos de conocimiento del trabajo, intercambio de productos secos (no lo encuentre, todo está aquí)

Preguntas de entrevista

1. ¿Qué es mybatis?

Mybatis es un marco semi-ORM (Object Relational Mapping), que encapsula JDBC internamente y puede definir declaraciones en xml y anotaciones.

2. Habla de mybatis mejor que jdbc

(1) Mybatis reduce el código redundante, rs.getString de jdbc

(2) La declaración SQL se puede configurar para reducir la cantidad de escritura de código.

(3) El grupo de conexiones está integrado y jdbc debe implementarse con grupos de conexiones como druid.

 

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

#{}Es procesamiento de precompilación y ${}reemplazo de cadenas.

Cuando Mybatis esté procesando #{}, #{}reemplazará el sql con? Sign y llamará al método set de PreparedStatement para asignar;

Cuando Mybatis está procesando ${}, lo ${}reemplaza con el valor de la variable.

El uso #{}puede prevenir eficazmente la inyección de SQL y mejorar la seguridad del sistema.

4. ¿Qué debo hacer si el nombre del campo de la tabla es diferente del nombre del atributo de la clase de entidad?

(1) Puede usar el alias select user_id como id en la declaración

  (2) Puede utilizar resultMap para mapear la relación correspondiente.

<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> 

5. ¿Cómo escribir una instrucción similar a una consulta difusa?

Utilice la línea vertical doble de Oracle || para conectar la cadena%, cadena precompilada indirectamente.

<select id = "select3" resultMap = "myMap">

        seleccione * de estudiante donde nombre como '%' || # {nombre} || '%'

</select>

No se recomienda otro # {value} directo

6. ¿Cuál es el principio de funcionamiento de la 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 Dao es la interfaz Mapper. El espacio de nombres en xml asigna la ruta de la interfaz dao, el nombre del método de la interfaz asigna el atributo id de cada etiqueta de declaración en xml, y los parámetros en el método de la interfaz son los parámetros pasados ​​a sql.

En mybatis, cada uno de <select>, <insert>, <update>, <delete>etiqueta, se resuelve a un objeto MapperStatement.

El método no se puede sobrecargar, porque mybatis usa el nombre de la interfaz + el nombre del método como la única clave para encontrar la etiqueta de declaración en el xml. La etiqueta de declaración se almacena en MapperStatement, y la única clave-MapperStatement

El principio de funcionamiento de la interfaz Mapper es el proxy dinámico JDK. Mybatis utilizará el proxy dinámico JDK para generar el objeto proxy MapperProxy para la interfaz Mapper cuando se ejecute Mybatis. El objeto proxy interceptará el método de interfaz y ejecutará el sql representado por MapperStatement en su lugar, y luego devuelve el resultado de la ejecución de sql.

7. 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, la identificación no se puede repetir;

8. ¿Cómo realiza Mybatis la paginación? ¿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 realizada 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 del dialecto, agregue la declaración de paginación física correspondiente y los parámetros de paginación física.

9. ¿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 <resultMap>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 asignarlos y devolverlos uno por uno. Aquellos atributos que no pueden encontrar la relación de mapeo no pueden ser asignados.

El tercer tipo, configuración automática de joroba:

        <setting name="mapUnderscoreToCamelCase" value="true"/>

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

La primera:

// DAO层的函数  
Public UserselectUser(String name,String area);  
// 对应的xml,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。  
<select id="selectUser"resultMap="BaseResultMap">    
  select *  fromuser_user_t whereuser_name = #{0} anduser_area=#{1}     
</select> 

El segundo: use la anotación @param:

public interface usermapper {  
   user selectuser(@param(“username”) string username,@param(“hashedpassword”) string hashedpassword);  
 }  
// 然后,就可以在xml像下面这样使用(推荐封装为一个map,作为单个参数传递给mapper):  
<select id=”selectuser” resulttype=”user”>  
         select id, username, hashedpassword  
         from some_table  
         where username = #{username} and hashedpassword = #{hashedpassword}   
</select>  

El tercer tipo: múltiples parámetros se encapsulan en el 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();   
 }  

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

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

<resultMap>,, <parameterMap>, <sql>, <include>, <selectKey>Plus SQL dinámico nueve etiquetas, en el que la etiqueta es un fragmento sql, por <include>el marcador incorporado fragmento sql, <selectKey>generando etiqueta de directiva que no admite la clave primaria de incremento automático.

13. ¿Consultas relacionadas uno a uno, uno a varios?

Asociación de uso uno a uno, colección de uso uno a muchos

<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>   

14. ¿Cuál es la implementación subyacente de las cachés primaria y secundaria de Mybatis? ¿Cómo activar la caché secundaria?

La caché de primer nivel es una implementación de almacenamiento HashMap, el alcance es sqlsession, la caché de primer nivel está activada de forma predeterminada.

HashMap también implementa la caché secundaria. El ámbito es el nivel del espacio de nombres, que está cerrado de forma predeterminada.

Para el mecanismo de actualización de datos de caché, cuando se realiza una operación C / U / D en un ámbito determinado (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.

public class MybatisTest {

	public static void main(String[] args) throws IOException {
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		SqlSession  session = sqlSessionFactory.openSession();
		DeptMapper mapper = session.getMapper(DeptMapper.class);
		Dept dept = mapper.selectByPrimaryKey(10);
		System.out.println(dept);

		DeptMapper mapper1 = session.getMapper(DeptMapper.class);
		Dept dept1 = mapper.selectByPrimaryKey(10);
		System.out.println(dept1);
	}
}

 //一级缓存验证:结果显示 查询语句只打印了一次

Implemente la caché de segundo nivel:

1. Configure para habilitar <nombre de configuración = "cacheEnabled" value = "true" /> <! - Habilitar caché secundaria ->

2. Para habilitar la caché de segundo nivel, el objeto POJO también debe implementar la interfaz serializable; de ​​lo contrario, se lanzará una excepción. 

15. ¿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 el método original proporcionado por SqlSession.

Hay dos formas de implementar el enlace de interfaz. Una es enlazar mediante anotaciones, es decir, agregar @Select, @Update y otras anotaciones al método de interfaz, que contiene sentencias Sql para enlazar; la otra es escribir SQL en xml para bind, 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.

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

El nombre del método de la interfaz Mapper es el mismo que el ID de cada SQL definido en mapper.xml;

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;

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;

El espacio de nombres en el archivo Mapper.xml es la ruta de clase de la interfaz del asignador.

17. ¿Cuáles son las 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.

Configure la ubicación de mapper.xml en sqlMapConfig.xml

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

Definir la interfaz del mapeador

Integración de clases de implementación SqlSessionDaoSupport

En el método del asignador, this.getSqlSession () se puede usar para agregar, eliminar, modificar y verificar datos.

configuración de resorte

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

El segundo: use org.mybatis.spring.mapper.MapperFactoryBean:

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 configurarlo aquí

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

Defina la interfaz del mapeador:

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 la identificación de la declaración definida en mapper.xml

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 un escáner de mapas:

El archivo mapper.xml está escrito:

  • 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 se mantienen iguales, no es necesario configurarlos en sqlMapConfig.xml.

  • 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

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

Respuesta: Mybatis solo puede escribir complementos para las 4 interfaces de ParameterHandler, ResultSetHandler, StatementHandler y Executor. Mybatis usa el proxy dinámico del JDK para generar objetos proxy para las interfaces que necesitan ser interceptadas para implementar la función de interceptación del método de interfaz. , y siempre que estas 4 interfaces se ejecuten 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 especifiques que necesitan 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/x18094/article/details/115261377
Recomendado
Clasificación