Hablando de: aprendizaje del framework MyBatis (colección de entrevistas !!!)

Prefacio

En este artículo, comparto principalmente algunos puntos que creo que MyBtis es más importante, o el análisis de varias preguntas de alta frecuencia de MyBatis en la entrevista: Bien ~
No hay mucha tontería, ¡comencemos con los productos secos! ! !

1. Descripción básica

1. Información general:

Cualquiera que haya estudiado MyBatis sabe que se puede decir que MyBatis es una versión mejorada de JDBC, ya que está relacionado con JDBC, todos deben conocer el rol de MyBatis y, naturalmente, no se puede separar de la base de datos.

MyBatis es un marco ORM convencional, anteriormente llamado iBatis, y luego rebautizado como MyBatis, un marco para la persistencia de datos.

2. Ventajas:

Dado que es una versión mejorada de JDBC, cuando estamos aprendiendo JDBC, podemos saber que la cantidad de código JDBC es relativamente grande y MyBatis encapsula JDBC, lo que reduce en gran medida la cantidad de código.

  • Simplifica enormemente el desarrollo del código JDBC
  • Simple y fácil de usar, fácil de usar, con mayor flexibilidad
  • Reducir el acoplamiento de programas mediante la definición de SQL en XML
  • Admite SQL dinámico, puede realizar funciones de manera flexible de acuerdo con las necesidades comerciales específicas

3. Desventajas:

¿MyBatis es el mejor? Todo tiene sus ventajas, incluso JDBC optimizado

  • En comparación con Hibernate, los desarrolladores necesitan completar más trabajo, por ejemplo: definir SQL, establecer la relación de mapeo entre POJO y los datos, etc.
  • Los desarrolladores deben tener cierta capacidad de escritura SQL, y la carga de trabajo es relativamente grande en algunos escenarios específicos.
  • La portabilidad de la base de datos es deficiente. SQL depende de la base de datos subyacente. Si la base de datos se migra, es necesario reescribir parte de SQL

En segundo lugar, el problema de la construcción ambiental

Para algunos amigos que recién están comenzando a aprender MyBatis, configurar un entorno puede ser un dolor de cabeza. A continuación, resumiré los errores que todos pueden cometer al configurar el entorno y probarlo por primera vez.

1. El archivo de configuración es inútil para registrar

2. Error de interfaz de enlace

3. El nombre del método es incorrecto

4. El tipo de valor devuelto es incorrecto

5. Error de recursos de exportación de Maven

6.mysql es anterior a 5.7. Al registrar el controlador, debe ser com.mysql.jdbc.Driver
y después de mysql5.7 es com.mysql.cj.jdbc.Driver

Tres, consideraciones CRUD

Al realizar operaciones de base de datos: agregue, elimine, modifique y confirme transacciones. ! !

Hay dos formas:
envío manual: sqlSession.commit (); método para enviar la transacción
envío automático:
podemos establecerlo manualmente en verdadero cuando escribimos la clase de herramienta

//既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
// SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
    public static SqlSession getSqlSession(){
         return sqlSessionFactory.openSession(true);
    }

Cuatro, análisis de configuración

1. Medio ambiente y atributos

①entornos:
MyBatis se puede configurar para adaptarse a múltiples entornos, pero recuerde: aunque se pueden configurar múltiples entornos, cada instancia de SqlSessionFactory solo puede elegir un entorno.

El administrador de transacciones predeterminado de Mybatis es JDBC

Grupo de conexiones: POOLED

②Propiedades:
podemos usar la propiedad de propiedades para lograr el archivo de configuración de referencia

Estos atributos se pueden configurar externamente y se pueden reemplazar dinámicamente. Puede configurar estas propiedades en un archivo de propiedades típico de Java, o puede establecer [db.properties] en los subelementos del elemento de propiedades

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

2. Configuración común

A continuación, déjeme decirle: Alias ​​de tipo Los alias de
tipo pueden establecer un nombre abreviado para un tipo de Java.
Solo se utiliza para la configuración XML y está destinado a reducir la escritura redundante de nombres de clases totalmente calificados. P.ej:

<typeAliases>
        <typeAlias type="com.zjd.pojo.User" alias="User"/>
    </typeAliases>

O use el nombre del paquete:

Escanee el paquete de la clase de entidad, su alias predeterminado es la minúscula del nombre de la clase de esta clase

<typeAliases>
  <package name="com.zjd.pojo"/>
</typeAliases>

para resumir:

Hay menos clases de entidad, use el primer método

Si hay demasiadas clases de entidad, puede usar la segunda

Pero el primer tipo puede ser alias por diy

El segundo tipo puede tener un alias agregando anotaciones @Alias ​​()

3. Mapeador

Cuando ejecutó el programa mybatis por primera vez, debe haber visto este error: MapperRegistry
traducido que significa: no estamos registrados y vinculamos nuestro archivo mapeador
en tiempo de ejecución, si no vinculamos nuestra interfaz correspondiente en el archivo de configuración del núcleo ¿Cómo puedo el programa reconoce el Mapper.xml?

método uno:

<mappers>
    <mapper resource="com/wdit/dao/userMapper.xml"/>
</mappers>

Camino dos:

Usar registro de enlace de archivo de clase

<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mappers> 

punto importante:

  • La interfaz y su archivo de configuración del asignador deben tener el mismo nombre
  • La interfaz y su archivo de configuración del asignador deben estar en el mismo paquete

Camino tres:

<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

punto importante:

  • La interfaz y su archivo de configuración del asignador deben tener el mismo nombre
  • La interfaz y su archivo de configuración del asignador deben estar en el mismo paquete

4. Ciclo de vida y alcance

SqlSessionFactoryBuilder:

  • Una vez que se crea SqlSessionFactory, ya no es necesario
  • Variable local

SqlSessionFactory:

  • Para decirlo claramente, se puede entender como: grupo de conexiones de base de datos
  • Una vez que se crea SqlSessionFactory, siempre debe existir durante la ejecución de la aplicación, no hay razón para descartarla o recrear otra instancia
  • Por lo tanto, el mejor alcance de SqlSessionFactory es el alcance de la aplicación
  • Lo más fácil es utilizar el modo singleton o el modo singleton estático.

SqlSession:

  • ¡Una solicitud para conectarse al grupo de conexiones!
  • Debe cerrarse inmediatamente después de su uso, de lo contrario los recursos estarán ocupados
  • La instancia de SqlSession no es segura para subprocesos, por lo que no se puede compartir, por lo que su mejor alcance es el alcance de la solicitud o el método
    Inserte la descripción de la imagen aquí

5. Resuelva el problema de la inconsistencia entre los nombres de los atributos y los nombres de los campos.

A veces, encontraremos que pwd está escrito en la tabla de la base de datos, pero cuando creamos la clase de entidad, se escribe como contraseña. Como resultado, informaremos un error al realizar la prueba. ¿Qué debemos hacer?

1. Método 1:

Alias

  select id,name,pwd as password from user where id= #{id}

2. Método dos:

Usar el mapeo del conjunto de resultados de ResultMap

<!--    结果集映射-->
    <resultMap id="UserMap" type="User">
<!-- column数据库中的字段,property实体类中的属性-->
        <result column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="pwd" property="password"/>
    </resultMap>
    
    <select id="getUserByID" resultMap="UserMap">
        select * from mybatis.user where id= #{id}
    </select>
    

Problemas de seis, muchos a uno y uno a muchos

Las preguntas de varios a uno y de uno a varios son preguntas habituales en MyBatis, y también suelen ser formuladas por los entrevistadores. A
Inserte la descripción de la imagen aquí
continuación, hablaré brevemente sobre los dos métodos de implementación:
query Consulta anidada según el resultado --- ----- --------------> La instrucción sql está completa
②Siga la consulta anidada de la consulta ------------------ ----> Similar a la sub consulta, instrucción sql instrucción sql anidada
Ambos métodos son métodos para resolver el problema, y ​​no hay superioridad, pero preste atención

  • Garantizar la legibilidad de sql [fácil de entender]
  • Preste atención al problema de los nombres y campos de atributos de uno a muchos y de muchos a uno.
  • El problema no es fácil de eliminar, puede usar el registro

Siete, SQL dinámico

El llamado sql dinámico, podemos entender que generar dinámicamente sql
dinámico sql según diferentes condiciones es relativamente fácil de entender , aquí, hablaré principalmente de fragmentos de sql

<sql id="if-title-author">
    <if test="title != null">
        and title=#{title}
    </if>
    <if test="author != null">
        and author = #{author}
    </if>
</sql>

Cuando escribimos SQL dinámico, encontramos que el mismo código aparece con frecuencia. En este momento, podemos tomar el método de los fragmentos de SQL para extraer el código repetido.

<include refid="if-title-author"></include>

En la siguiente instrucción SQL, inserte la etiqueta de inclusión para usar, reduciendo la complejidad del código.

Ocho, caché

Aquí hablo principalmente del principio de almacenamiento en caché de MyBatis:
el orden de las consultas de los usuarios: en
realidad, de derecha a izquierda, es decir, desde la caché de segundo nivel, la caché de primer nivel, a la base de datos.
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/zjdzka/article/details/113104528
Recomendado
Clasificación