(8) MyBatis desde la entrada al suelo: el uso del mapeo automático

Este es el octavo artículo de la serie mybatis. Si no ha leído las sugerencias anteriores, primero vaya a la cuenta pública [Java Tsukuba Fox] para ver el texto anterior, que es conveniente para comprender y comprender. En el artículo anterior, presentamos algunas de las formas en que mybatis usa las consultas, especialmente la consulta uno a uno y la consulta uno a muchos. A los que no lo han visto se les recomienda ir a la cuenta oficial para comprobarlo.

Hoy presentamos el mapeo automático que hemos estado usando pero no tuvimos tiempo de introducir demasiado.

¿Qué es el mapeo automático?

Antes de introducir el mapeo automático, echemos un vistazo al mapeo manual, de la siguiente manera:

<resultMap id="orderModelMap1" type="com.zhonghu.chat08.demo7.model.OrderModel">
    <id column="id" property="id"/>
    <result column="userId" property="userId" />
    <result column="createTime" property="createTime" />
    <result column="upTime" property="upTime" />
</resultMap>
<select id="getById1" resultMap="orderModelMap1">
    <![CDATA[
    SELECT
        a.id,
        a.user_id userId,
        a.create_time createTime,
        a.up_time upTime
    FROM
        orders a
    WHERE
        a.id = #{value}
    ]]>
</select>

Tenga en cuenta que hay 4 líneas de configuración en el elemento resultMap anterior, de la siguiente manera:

<id column="id" property="id"/>
<result column="userId" property="userId" />
<result column="createTime" property="createTime" />
<result column="upTime" property="upTime" />

Estas 4 líneas de código se utilizan para configurar la relación de mapeo entre las columnas del resultado sql y los campos en el objeto OrderModel.

¿Ha notado que los valores de la columna y los elementos de propiedad en las reglas de mapeo son los mismos? Mybatis admite la configuración de mapeo automático. Cuando el mapeo automático está activado, cuando el nombre de columna de sql es el mismo que el nombre del campo en el modelo (no la escritura sensible a mayúsculas y minúsculas), mybatis se asignará automáticamente de forma interna y no es necesario que escriba manualmente las reglas de asignación de 4 líneas anteriores.

Cambiemos el ejemplo anterior al método de mapeo automático, de la siguiente manera:

<resultMap id="orderModelMap2" type="com.zhonghu.chat08.demo7.model.OrderModel" autoMapping="true">
</resultMap>
<select id="getById2" resultMap="orderModelMap2">
    <![CDATA[
    SELECT
        a.id,
        a.user_id userId,
        a.create_time createTime,
        a.up_time upTime
    FROM
        orders a
    WHERE
        a.id = #{value}
    ]]>
</select>

Preste atención al atributo autoMapping en el resultMap anterior, ya sea para habilitar el mapeo automático, lo establecemos en verdadero, por lo que mybatis mapeará y asignará automáticamente valores de acuerdo con el nombre de la columna y el campo con el mismo nombre en el modelo.

Los resultados finales de la consulta de las dos configuraciones anteriores son los mismos, y los valores de los cuatro campos correspondientes a los resultados de la consulta se asignan automáticamente a los atributos del mismo nombre en OrderModel.

Interruptor de mapeo automático

Hay dos tipos principales de mapeo automático en mybatis, uno es la configuración global, que es efectiva para todos los resultMaps de la aplicación, se establece en el archivo de configuración mybatis y el otro se configura a través de la propiedad autoMapping del resultMap.

Cuando mybatis juzga si un resultMap está habilitado para la configuración de mapeo automático, primero buscará su propio atributo autoMapping. Si este atributo está configurado, usará directamente el valor de este atributo. Si el atributo autoMapping del elemento resultMap no está configurado , se configurará globalmente Reglas de mapeo automático.

Expliquemos en detalle el contenido de este.

mybatis mapea automáticamente la configuración global

Agregue la siguiente configuración en el archivo de configuración global mybatis:

<settings>
    <setting name="autoMappingBehavior" value="自动映射规则"/>
</settings>

Son principalmente los siguientes:

  • NINGUNO: apaga el interruptor de mapeo global
  • PARCIAL: Atributos del mapa distintos del mapeo de resultados anidados (es decir, atributos conectados) definidos internamente, este también es el valor predeterminado.
  • COMPLETO: mapea automáticamente todos los atributos.

NINGUNO

Cuando el valor de autoMappingBehavior se establece en NONE en la configuración global de mybatis, significa que la asignación automática global está desactivada, lo que hará que SQL devuelva un resultado, pero el resultado no se asignará automáticamente cuando se asigne el resultado. , entonces la devolución está vacía

PARCIAL

Se realizará un mapeo automático, pero algunos mapeos de consultas complejas anidarán algunos mapeos (como asociación, colección) en el resultMap. Cuando se usa PARTIAL, si hay un mapeo anidado, el mapeo anidado no se mapeará automáticamente.

LLENO

Todos los atributos se asignan automáticamente.

uso de autoMapping

Como mencionamos anteriormente, cuando el atributo autoMapping se especifica en el resultMap, el mapeo automático del resultMap está controlado por el atributo autoMapping y no tiene nada que ver con el comportamiento de la configuración de mapeo global (autoMappingBehavior) en mybatis.

Caso 1

Esta configuración principal está principalmente en sqlmap, de la siguiente manera:
<resultMap id="orderModelMap7" type="com.zhonghu.chat08.demo7.model.OrderModel" autoMapping="true">
    <association property="userModel" autoMapping="true">
        <id column="user_id" property="id"/>
    </association>
</resultMap>
<select id="getById7" resultMap="orderModelMap7">
    <![CDATA[
    SELECT
        a.id,
        a.user_id userId,
        a.create_time createTime,
        a.up_time upTime,
        b.id as user_id,
        b.name
    FROM
        orders a,user b
    WHERE
        a.user_id = b.id
        AND a.id = #{value}
    ]]>
</select>
Caso de prueba correspondiente
com.zhonghu.chat08.demo7.Demo7Test#getById7
@Test
public void getById7() throws IOException {
    this.before("demo7/mybatis-config1.xml");
    try (SqlSession sqlSession = this.sqlSessionFactory.openSession(true);) {
        OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
        OrderModel orderModel = mapper.getById7(2);
        log.info("{}", orderModel);
    }
}
Ejecutar salida
24:37.544 [main] DEBUG c.j.c.d.mapper.OrderMapper.getById7 - ==>  Preparing: SELECT a.id, a.user_id userId, a.create_time createTime, a.up_time upTime, b.id as user_id, b.name FROM orders a,user b WHERE a.user_id = b.id AND a.id = ? 
24:37.589 [main] DEBUG c.j.c.d.mapper.OrderMapper.getById7 - ==> Parameters: 2(Integer)
24:37.610 [main] DEBUG c.j.c.d.mapper.OrderMapper.getById7 - <==      Total: 1
24:37.610 [main] INFO  c.j.chat05.demo7.Demo7Test - OrderModel(id=2, userId=1, createTime=1610803573, upTime=1610803573, userModel=UserModel(id=1, name=冢狐))

Todos los atributos de OrderModel se asignan automáticamente con éxito.

El autoensamblaje no es tan divertido y no jugar puede traer algunos peligros ocultos. Veamos un caso, vea el ejemplo 2 a continuación.

Ejemplo 2

De acuerdo con el número de pedido, consulte la información del pedido y, por cierto, consulte la lista de detalles del pedido. Para esto usamos la consulta uno a muchos en mybatis.

OrderDetaiMapper.xml agregado
<select id="getListByOrderId1" resultType="com.zhonghu.chat08.demo7.model.OrderDetailModel">
    <![CDATA[
    SELECT
        a.id,
        a.order_id AS orderId,
        a.goods_id AS goodsId,
        a.num,
        a.total_price AS totalPrice
    FROM
        order_detail a
    WHERE
        a.order_id = #{value}
    ]]>
</select>

Esto puede basarse en la identificación del pedido para consultar la lista detallada asociada con el pedido.

OrderMapper.xml unirse
<resultMap id="orderModelMap8" type="com.zhonghu.chat08.demo7.model.OrderModel" autoMapping="true">
    <collection property="orderDetailModelList" select="com.zhonghu.chat08.demo7.mapper.OrderDetailMapper.getListByOrderId1" column="id"/>
</resultMap>
<select id="getById8" resultMap="orderModelMap8">
    <![CDATA[
    SELECT
        a.id,
        a.user_id userId,
        a.create_time createTime,
        a.up_time upTime
    FROM
        orders a
    WHERE a.id = #{value}
    ]]>
</select>
Caso de prueba
com.zhonghu.chat08.demo7.Demo7Test#getById8
@Test
public void getById8() throws IOException {
    this.before("demo7/mybatis-config.xml");
    try (SqlSession sqlSession = this.sqlSessionFactory.openSession(true);) {
        OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
        OrderModel orderModel = mapper.getById8(1);
        log.info("{}", orderModel);
    }
}
Ejecutar salida
11:06.193 [main] DEBUG c.j.c.d.mapper.OrderMapper.getById8 - ==>  Preparing: SELECT a.id, a.user_id userId, a.create_time createTime, a.up_time upTime FROM orders a WHERE a.id = ? 
11:06.229 [main] DEBUG c.j.c.d.mapper.OrderMapper.getById8 - ==> Parameters: 1(Integer)
11:06.250 [main] DEBUG c.j.c.d.m.O.getListByOrderId1 - ====>  Preparing: SELECT a.id, a.order_id AS orderId, a.goods_id AS goodsId, a.num, a.total_price AS totalPrice FROM t_order_detail a WHERE a.order_id = ? 
11:06.251 [main] DEBUG c.j.c.d.m.O.getListByOrderId1 - ====> Parameters: 1(Integer)
11:06.255 [main] DEBUG c.j.c.d.m.O.getListByOrderId1 - <====      Total: 2
11:06.256 [main] DEBUG c.j.c.d.mapper.OrderMapper.getById8 - <==      Total: 1
11:06.256 [main] INFO  c.j.chat05.demo7.Demo7Test - OrderModel(id=null, userId=2, createTime=1610803573, upTime=1610803573, userModel=null, orderDetailModelList=[OrderDetailModel(id=1, orderId=1, goodsId=1, num=2, totalPrice=16.00), OrderDetailModel(id=2, orderId=1, goodsId=1, num=1, totalPrice=16.00)])

Preste atención al atributo id de OrderModel en la salida, ¿cómo es un valor nulo? Principalmente causado por la siguiente línea de configuración

<collection property="orderDetailModelList" select="com.zhonghu.chat08.demo7.mapper.OrderDetailMapper.getListByOrderId1" column="id"/>

Hay un atributo de columna en la configuración anterior, que especifica id. En este momento, mybatis cree que ha especificado manualmente la relación de mapeo para el campo id, por lo que omite el mapeo automático del campo id al atributo OrderModel.id, que conduce a la identificación del objeto OrderModel. El atributo no está asignado. En este momento, debemos especificar manualmente la regla de asignación de identificación en orderModelMap8, de la siguiente manera:

<resultMap id="orderModelMap8" type="com.zhonghu.chat08.demo7.model.OrderModel" autoMapping="true">
    <id column="id" property="id" />
    <collection property="orderDetailModelList" select="com.zhonghu.chat08.demo7.mapper.OrderDetailMapper.getListByOrderId1" column="id"/>
</resultMap>

Ejecute el caso de prueba nuevamente y será normal.

En conclusión

Para nuestro desarrollo, el mapeo automático realmente puede ayudarnos a guardar algo de código, pero también existen algunos peligros ocultos. Esperamos que el sistema desarrollado por nosotros sea robusto. Se recomienda que al escribir mapeador xml, se tome un tiempo para dar el Configuración del mapeo. Escríbalo, esto puede eliminar algunos peligros ocultos y hacer que nuestro sistema sea más estable.

Por fin

  • Si sientes que eres recompensado después de leerlo, espero que le prestes atención. Por cierto, dame un pulgar hacia arriba. Esta será la mayor motivación para mi actualización. Gracias por tu apoyo.
  • Bienvenidos a todos para que presten atención a mi cuenta pública [Java Fox], enfocándome en los conocimientos básicos de Java y la computadora, prometo dejarles obtener algo después de leerlo, si no me creen, péguenme
  • Busque la conexión triple con un clic: me gusta, reenviar y mirar.
  • Si tiene diferentes opiniones o sugerencias después de leer, por favor comente y comparta con nosotros. Gracias por su apoyo y cariño.

——Soy Chuhu, y amo la programación tanto como a ti.

Bienvenido a seguir la cuenta pública "Java Fox" para conocer las últimas noticias.

Supongo que te gusta

Origin blog.csdn.net/issunmingzhi/article/details/113872133
Recomendado
Clasificación