Compartir tecnología

[MyBatis] Teoría MyBatis 40 preguntas (2)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Teoría MyBatis 40 preguntas》Contiene los siguientes 2 artículos:


Teoría MyBatis 40 preguntas (2)

21. ¿Cómo obtener la clave primaria generada?

Agregar nueva etiqueta:keyProperty=“ID” Eso es todo.

<insert id="insert" useGeneratedKeys="true" keyProperty="userId" >
	insert into user(user_name, user_password, create_time)
	values(#{userName}, #{userPassword} , #{createTime, jdbcType=TIMESTAMP})
</insert>
  • 1
  • 2
  • 3
  • 4

22.Cuandoclase de entidad¿Qué debo hacer si los nombres de los atributos son diferentes de los nombres de los campos en la tabla?

(1) Consultando SQL Defina el alias del nombre del campo en la declaración para que el alias del nombre del campo sea coherente con el nombre del atributo de la clase de entidad.

<select id="getOrder" parameterType="int" resultType="com.jourwon.pojo.Order">
	select order_id id, order_no orderno, order_price price form orders
	where order_id=#{id};
</select>
  • 1
  • 2
  • 3
  • 4

(2) Pase <resultMap> Mapear la correspondencia uno a uno entre los nombres de los campos y los nombres de los atributos de la clase de entidad.

<select id="getOrder" parameterType="int" resultMap="orderResultMap">
	select * from orders where order_id=#{id}
</select>

<resultMap type="com.jourwon.pojo.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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

(1) Herencia de clases de implementación de interfaz SqlSessionDaoSupport: Para utilizar este método, debe escribir mapper interfaz,mapper Clase de implementación de interfaz,mapper.xml documento.

  • existir sqlMapConfig.xml Configuración mediamapper.xml s posición.
<mappers>
	<mapper resource="mapper.xml 文件的地址" />
	<mapper resource="mapper.xml 文件的地址" />
</mappers>
  • 1
  • 2
  • 3
  • 4
  • definición mapper interfaz.
  • Implementar la integración de clases SqlSessionDaoSupportmapper Se puede utilizar en métodos.this.getSqlSession() Realizar la adición, eliminación, modificación y verificación de datos.
  • spring configuración.
<bean id=" " class="mapper 接口的实现">
	<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
  • 1
  • 2
  • 3

(2) Uso org.mybatis.spring.mapper.MapperFactoryBean

  • existir sqlMapConfig.xml Configuración mediamapper.xml posición simapper.xml ymapper Las interfaces tienen el mismo nombre y están en el mismo directorio, por lo que no se requiere configuración aquí.
  • definición mapper interfaz.
<mappers>
	<mapper resource="mapper.xml 文件的地址" />
	<mapper resource="mapper.xml 文件的地址" />
</mappers>
  • 1
  • 2
  • 3
  • 4
  • mapper.xml medionamespace paramapper La dirección de la interfaz.
  • mapper El nombre del método en la interfaz ymapper.xml definido enstatement deid se consistente.
  • Spring definido en.
<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
	<property name="mapperInterface" value="mapper 接口地址" />
	<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
  • 1
  • 2
  • 3
  • 4

(3) Uso mapper escáner.

  • mapper.xml Redacción de documentos.
    • mapper.xml medionamespace paramapper La dirección de la interfaz;
    • mapper El nombre del método en la interfaz ymapper.xml definido enstatement deid se consistente;
    • Si mapper.xml ymapper Si el nombre de la interfaz sigue siendo consistente, no es necesariosqlMapConfig.xml Configurar en .
  • definición mapper interfaz.Avisomapper.xml nombre del archivo ymapper Los nombres de las interfaces deben ser coherentes y estar ubicados en el mismo directorio.
  • Configuración mapper escáner.
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="mapper 接口包地址"></property>
	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
  • 1
  • 2
  • 3
  • 4
  • Después de usar el escáner desde spring Obtener del contenedormapper objeto de implementación.

24. ¿Qué es? Mi Batis enlace de interfaz? ¿Cuáles son los métodos de implementación?

El enlace de interfaz consiste en definir una interfaz arbitrariamente en MyBatis y luego combinar los métodos en la interfaz con SQL declaraciónEnlazado, podemos llamar directamente al método de interfaz, por lo que en comparación con el original SqlSession Los métodos proporcionados nos permiten tener opciones y configuraciones más flexibles.

Hay dos formas de implementar el enlace de interfaz:

  • Vincular a través de anotaciones es agregar @Select@Update Espere a que se vinculen las anotaciones, que contienen sentencias SQL;
  • aprobar xml Escriba SQL dentro para vincular. En este caso, debe especificar.xml en el archivo de mapeonamespace Debe ser la ruta completa de la interfaz.Cuando la declaración SQL es relativamente simple, use el enlace de anotaciones. Cuando la declaración SQL es relativamente compleja, use el enlace.xml Encuadernación, uso generalxml Hay más fijaciones.

25. ¿Cuáles son los requisitos para llamar usando la interfaz del mapeador MyBatis?

  • Nombre del método de la interfaz del asignador y mapper.xml de cada sql definido enid mismo.
  • Los tipos de parámetros de entrada de los métodos de la interfaz Mapper y mapper.xml de cada sql definido enparameterType del mismo tipo.
  • Los tipos de parámetros de salida de los métodos de la interfaz Mapper y mapper.xml de cada sql definido enresultType del mismo tipo.
  • Mapper.xml en el archivonamespace Esa es la ruta de clase de la interfaz Mapper.

26. ¿Cómo funciona esta interfaz Dao? Si el método en la interfaz Dao tiene diferentes parámetros, ¿se puede sobrecargar el método?

  • El principio de funcionamiento de la interfaz Dao es el proxy dinámico JDK. MyBatis utilizará el proxy dinámico JDK para generar un proxy para la interfaz Dao cuando se ejecute. proxy objeto, objeto proxyproxy Los métodos de interfaz serán interceptados y ejecutados en su lugar.MappedStatement representa el SQL y luego devuelve los resultados de la ejecución de SQL.
  • Los métodos en la interfaz Dao no se pueden sobrecargar porque Nombre completo + nombre del método Estrategias de ahorro y búsqueda.

27. En el archivo de mapeo Xml de MyBatis, ¿se puede repetir la identificación en diferentes archivos de mapeo Xml?

  • Diferentes archivos de mapeo XML, si están configurados namespace,Entonces id Se puede repetir si no está configuradonamespace,Entonces id no se puede repetir; después de todonamespace No es obligatorio, solo las mejores prácticas.
  • La razón es namespace + id es como Mapa &lt; Cadena, Declaración mapeada &gt; Mapa<String, MappedStatement>METROETROapag<Calleaengramo,METROETROapáginasmidCalleaamimetrominortea> La clave a utilizar, si no hay ningunanamespace, sólo el resto id,Entonces,id La duplicación puede hacer que los datos se sobrescriban entre sí.Entiendonamespace,naturaleza id Puedes repetirlo,namespace diferente,namespace + id Naturalmente es diferente.

28. Describa brevemente la relación de mapeo entre el archivo de mapeo Xml de MyBatis y la estructura de datos interna de MyBatis.

MyBatis encapsula toda la información de configuración XML en objetos pesados ​​todo en uno Configuration interno. En el archivo de mapeo XML,<parameterMap> La etiqueta se analizará comoParameterMap objeto, cada uno de sus elementos secundarios se analizará comoParameterMapping objeto.<resultMap> La etiqueta se analizará comoResultMap objeto, cada uno de sus elementos secundarios se analizará comoResultMapping objeto.Cada<select><insert><update><delete> Las etiquetas se analizarán comoMappedStatement Objeto, el SQL en la etiqueta se analizará comoBoundSql objeto.

29. ¿Cómo encapsula MyBatis los resultados de la ejecución de SQL en objetos de destino y los devuelve? ¿Cuáles son las formas de mapeo?

  • La primera es utilizar <resultMap> Las etiquetas definen la relación de mapeo entre los nombres de las columnas y los nombres de los atributos del objeto uno por uno.
  • El segundo es usar la función de alias de columna SQL y escribir el alias de columna como el nombre del atributo del objeto, como T_NAME AS NAME, el nombre del atributo del objeto es generalmente name, minúsculas, pero los nombres de las columnas no distinguen entre mayúsculas y minúsculas. MyBatis ignorará las mayúsculas y minúsculas de los nombres de las columnas y encontrará de forma inteligente los nombres de los atributos del objeto correspondientes. T_NAME AS NaMe, MyBatis aún puede funcionar normalmente.

Después de tener 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 la reflexión para asignar valores uno por uno a las propiedades del objeto y devolverlos para aquellas propiedades que no pueden encontrar la relación de mapeo. , la tarea no se puede completar.

30. Además de las etiquetas comunes seleccionar | insertar | actualizar | eliminar, ¿qué otras etiquetas hay en el archivo de mapeo XML?

Hay muchas otras etiquetas, <resultMap><parameterMap><sql><include><selectKey>, además de SQL dinámico 9 9 9 etiquetas:trimwheresetforeachifchoosewhenotherwisebind esperar.en<sql> Para etiquetas de fragmentos de SQL, pase<include> Las etiquetas introducen fragmentos de SQL,<selectKey> Genere etiquetas de políticas para claves primarias que no admiten el incremento automático.

31. En el archivo de mapeo MyBatis, si la etiqueta A hace referencia al contenido de la etiqueta B mediante inclusión, ¿se puede definir la etiqueta B después de la etiqueta A o debe definirse delante de la etiqueta A?

Aunque MyBatis analiza el archivo de mapeo XML en orden, la etiqueta B a la que se hace referencia aún se puede definir en cualquier lugar y MyBatis puede identificarla correctamente.

El principio es que MyBatis analiza la etiqueta A y descubre que la etiqueta A hace referencia a la etiqueta B, pero la etiqueta B no ha sido analizada y aún no existe. En este momento, MyBatis marcará la etiqueta A como sin resolver y luego continuará. Para analizar las etiquetas restantes, incluidas las etiquetas B, después de analizar todas las etiquetas, MyBatis volverá a analizar las etiquetas marcadas como no resueltas. Al analizar la etiqueta A, la etiqueta B ya existe y la etiqueta A se puede analizar normalmente.

32. ¿Puede MyBatis realizar consultas de contacto uno a muchos y uno a uno? ¿Cuáles son los métodos de implementación?

Puede, no sólo puede Uno a muchos, uno a uno,Lo suficientemente bien Muchos a muchos, muchos a uno. . Esto se consigue de la siguiente manera:

  • Envíe un SQL separado para consultar el objeto relacionado, asígnelo al objeto principal y luego devuelva el objeto principal.
  • Al utilizar consultas anidadas, similares a las consultas JOIN, una parte es el valor del atributo del objeto A y la otra parte es el valor del atributo del objeto asociado B. La ventaja es que siempre que se envíe un valor de atributo, el objeto principal y el se puede encontrar el objeto asociado.
  • subconsulta

33.¿Puede MyBatis asignar la clase de enumeración Enum?

MyBatis puede asignar clases de enumeración. No solo puede asignar clases de enumeración, MyBatis puede asignar cualquier objeto a una columna de la tabla.El método de mapeo es personalizado.TypeHandler,lograr TypeHandler desetParameter() ygetResult() métodos de interfaz.

TypeHandler Tiene dos funciones, una es completar eljavaType ajdbcType La conversión, la segunda se completa.jdbcType ajavaType La conversión se refleja comosetParameter() ygetResult() Los dos métodos representan configurar los parámetros del marcador de posición del signo de interrogación SQL y obtener los resultados de la consulta de la columna, respectivamente.

34. ¿Qué hace MyBatis SQL dinámico? ¿Qué tipo de SQL dinámico existen? ¿Puede describir brevemente el principio de ejecución del SQL dinámico?

MyBatis Dynamic SQL nos permite escribir SQL dinámico en forma de etiquetas en el archivo de mapeo Xml para completar las funciones de juicio lógico y empalme dinámico que proporciona MyBatis. 9 9 9 Etiquetas SQL dinámicas:trimwheresetforeachifchoosewhenotherwisebind

Su principio de ejecución es utilizar OGNL Calcule el valor de la expresión a partir del objeto de parámetro SQL y empalme SQL dinámicamente de acuerdo con el valor de la expresión para completar la función de SQL dinámico.

35. ¿Cómo realiza MyBatis la paginación? ¿Cuál es el principio del complemento de paginación?

Usos de MyBatis RowBounds El objeto está paginado, es paraResultSet La paginación de memoria realizada por el conjunto de resultados no es paginación física. Puede escribir parámetros directamente con paginación física en SQL para completar la función de paginación física, o puede usar un 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 a dialect Dialecto, agregue las declaraciones de paginación física correspondientes y los parámetros de paginación física correspondientes.

Ejemplo:

select * from student
  • 1

Después de interceptar el SQL, reescríbalo como:

select t.* from (select * from student) t limit 0, 10
  • 1

36. Describa brevemente el principio de funcionamiento del complemento MyBatis y cómo escribir un complemento.

MyBatis sólo puede escribir para ParameterHandlerResultSetHandlerStatementHandlerExecutor este 4 4 4 MyBatis, una especie de complemento de interfaz, utiliza el proxy dinámico de JDK para generar objetos proxy para las interfaces que deben interceptarse para implementar la función de interceptación del método de interfaz. 4 4 4 método de un objeto de interfaz, ingresará el método de interceptación, específicamenteInvocationHandler deinvoke() Los métodos, por supuesto, sólo interceptarán aquellos métodos que usted especifique para interceptar.

Implementar MyBatis Interceptor Interfaz y anulaciónintercept() Método, luego escriba anotaciones para el complemento y especifique qué métodos de qué interfaz desea interceptar. Recuerde, no olvide configurar el complemento que escribió en el archivo de configuración.

37. Caché de primer y segundo nivel de MyBatis

  • Caché de nivel 1: basado en PerpetualCache Caché local de HashMap, su alcance de almacenamiento es Sesión, cuando Sesiónflush oclose Después de eso, se borrarán todos los cachés de la sesión y el caché de primer nivel se activará de forma predeterminada.
  • El caché de segundo nivel tiene el mismo mecanismo que el caché de primer nivel y también se usa de forma predeterminada. PerpetualCache, Almacenamiento HashMap, la diferencia es que su alcance de almacenamiento es MapperNamespace), y la fuente de almacenamiento se puede personalizar, como Ehcache .La caché de segundo nivel no está habilitada de forma predeterminada. Para habilitar la caché de segundo nivel, es necesario implementar la clase de atributo de la caché de segundo nivel.Serializable Interfaz de serialización (se puede utilizar para guardar el estado de un objeto), configurable en su archivo de mapeo<cache/>
  • Para el mecanismo de actualización de datos de caché, cuando un determinado alcance (sesión de caché de primer nivel / espacio de nombres de caché de segundo nivel) es C / U / D Después de la operación, de forma predeterminada todos los archivos en este ámbitoselect El caché seráclear