Interpretación detallada del framework de capas de persistencia de MyBatis: Desarrollo de agentes mapeadores

1. Introducción

En el artículo anterior de MyBatis Quick Start, usamos el método de desarrollo nativo de MyBatis para operar la base de datos, lo que resolvió los problemas de codificación dura y operación engorrosa cuando JDBC opera la base de datos. De hecho, en los proyectos Java, usamos más a menudo el método de desarrollo del agente Mapper.

imagen-20230126233131746

¿Cuál es la diferencia entre los dos métodos?

Cuando usamos el método básico para operar la base de datos, usamos el método nativo selectList de sqlSession para ejecutar la instrucción sql y procesar el objeto del conjunto de resultados. Ejemplo:

List<Student> students = sqlSession.selectList("test.selectAll"); //参数是一个字符串,该字符串必须是映射配置文件的 namespace.id

El parámetro de este método debe ser el archivo de configuración de mapeo sql name.id, y se pasa a este método en forma de cadena, por lo que aquí hay un problema de codificación rígida, y la forma de usar id aquí no es un diseño conveniente, porque cuando codificamos, también es necesario encontrar la identificación en el archivo de configuración de mapeo correspondiente, por lo que el método de desarrollo del proxy Mapper parece resolver este problema.

Cuando utilice el método de desarrollo del proxy Mapper para operar la base de datos, obtenga un objeto proxy Mapper especificando la interfaz Mapper a través del objeto de clase SqlSession, use el objeto proxy para llamar al método en la interfaz Mapper correspondiente, y este método corresponde a la identificación en el archivo de configuración de mapeo, para encontrar el sql y ejecutarlo, y finalmente procesar el objeto del conjunto de resultados. Ejemplo:

//3. 执行sql
//3.1 获取StudentMapper接口的代理对象
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students = studentMapper.selectAll();

En general, el método de proxy Mapper tiene las siguientes dos ventajas:

  • Resuelto el problema de la codificación en modo nativo.
  • Sql simplificado posterior a la ejecución

2. Desarrollo de agentes mapeadores

No es difícil ver en los ejemplos anteriores que el método de usar el proxy Mapper tiene más ventajas En primer lugar, no depende del valor literal de la cadena, que es más conveniente y seguro. En segundo lugar, si su IDE tiene la función de autocompletado de código, puede ayudarlo a seleccionar rápidamente la instrucción sql del archivo de asignación sin depender de la identificación correspondiente.

Para utilizar el método de desarrollo de proxy Mapper, se deben realizar los siguientes pasos:

  1. Defina la interfaz de Mapper con el mismo nombre que el archivo de configuración de asignación de sql y evite que la interfaz de Mapper y el archivo de configuración de asignación de sql estén en el mismo directorio
  2. Establezca el atributo de espacio de nombres del archivo de mapeo sql en el nombre completo de la interfaz Mapper
  3. Defina el método en la interfaz de Mapper, el nombre del método es el id de la instrucción sql en el archivo de mapeo sql, y mantenga el tipo de parámetro y el tipo de valor devuelto igual

A continuación, se usa un caso para comprender el proceso de desarrollo del agente Mapper. El caso sigue usando la información del estudiante de consulta en el capítulo Primeros pasos, y encapsulándola como un objeto y almacenándola en una colección.

primer paso :

Cree StudentMapper bajo el org.chengzi.mapperpaquete , ejemplo:

public interface StudentMapper {
    
    
    List<Student> selectAll();
    Student selectById(int id);
}

Cree un org / chengzi / mapperdirectorio y cree un archivo de configuración StudentMapper.xml en este directorio de archivos. Al hacerlo, se asegura de que la interfaz de Mapper y el archivo de configuración de asignación de sql estén en el mismo directorio de archivos.

Paso 2 : configure el atributo de espacio de nombres del archivo de asignación sql para que sea coherente con el nombre completo de la interfaz del asignador. Ejemplo:

<!--
    namespace:名称空间。必须是对应接口的全限定名
-->
<mapper namespace="org.chengzi.mapper.StudentMapper">
    <select id="selectAll" resultType="org.chengzi.pojo.User">
        select *
        from student;
    </select>
</mapper>

Paso 3 : Cargue el archivo de configuración de mapeo sql en el archivo de configuración central de MyBatis, ejemplo:

<mappers>
      <!--加载sql映射文件-->
      <mapper resource="org/chengzi/mapper/StudentMapper.xml"/>
</mappers>

Nota: los siguientes dos pasos se usan /como separador de ruta de archivo

Después de completar los tres pasos anteriores, podemos escribir un código de prueba para operar la base de datos y completar las operaciones relacionadas. Ejemplo:

public class MyBatisDemo2 {
    
    

    public static void main(String[] args) throws IOException {
    
    

        //1. 加载mybatis的核心配置文件,获取 SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2. 获取SqlSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3. 执行sql
        //3.1 获取StudentMapper接口的代理对象
        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> students = studentMapper.selectAll();

        System.out.println(students);
        //4. 释放资源
        sqlSession.close();
    }
}

resultado de la operación:

imagen-20230128201911101

A diferencia del método básico de MyBatis, aquí obtenemos el objeto proxy de la interfaz StudentMapper a través del método correspondiente al objeto sqlSession, usamos el objeto proxy para ejecutar la instrucción sql y encapsulamos el objeto del conjunto de resultados. El proceso de devolución del objeto proxy lo realiza internamente MyBatis.

Consejos: Al cargar el archivo de configuración de mapeo sql en el archivo de configuración central de MyBatis, si la cantidad de archivos de configuración de mapeo sql es grande, este paso también es problemático.MyBatis también proporciona una solución a este problema.

Si el nombre de la interfaz Mapper es el mismo que el del archivo de mapeo sql y están en el mismo directorio, puede usar el escaneo de paquetes para simplificar la carga del archivo de mapeo sql. Solo necesita modificar la parte de cargar el archivo de configuración de mapeo sql en el archivo de configuración central para:

<mappers>
    <!--加载sql映射文件-->
    <!-- <mapper resource="org/chengzi/mapper/UserMapper.xml"/>-->
    <!--Mapper代理方式-->
    <package name="org.chengzi.mapper"/>
</mappers>

3. Análisis de procesos

Cuando usamos el desarrollo del proxy Mapper, obtenemos el objeto de clase SqlSession a través del método openSession() de la clase SqlSessionFactory, y luego obtenemos el objeto proxy Mapper de la interfaz Mapper especificada a través del objeto de clase SqlSession.

Al obtener el objeto proxy Mapper, podemos encontrar la interfaz Mapper correspondiente, y en el mismo directorio, podemos encontrar el archivo de mapeo sql correspondiente con el mismo nombre que la interfaz. Utilice el objeto proxy para llamar al método en la interfaz del asignador correspondiente. Este método corresponde al atributo id en el archivo de configuración de mapeo sql. A través del atributo id, puede encontrar la declaración sql correspondiente y luego ejecutar la declaración sql y encapsular el objeto de conjunto de resultados.

Por ejemplo, en el caso anterior, el studentMapperobjeto proxy ejecuta el método selectAll() y devuelve un objeto List. De hecho, la capa inferior aún ejecuta la siguiente instrucción:

 List<User> users = sqlSession.selectList("test.selectAll"); 

4. Resumen

Desarrollado en la forma nativa de MyBatis, algunos procesos dependen de valores constantes de cadena y hay problemas de codificación rígida. Al mismo tiempo, usar el espacio de comando y el identificador único de sql como parámetros para ejecutar sql es problemático al escribir código. La forma de usar el proxy Mapper tiene más ventajas. En primer lugar, no depende del valor literal de la cadena, lo que será más conveniente y seguro. En segundo lugar, si su IDE tiene la función de autocompletado de código, puede ayudarlo a seleccionar rápidamente la instrucción sql del archivo de asignación sin depender de la identificación correspondiente.

Supongo que te gusta

Origin blog.csdn.net/zhangxia_/article/details/128781725
Recomendado
Clasificación