English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Lo que se llama consulta uno a uno es que al consultar los datos de una tabla, también se deben consultar los datos de otras tablas.
Necesidad
Primero mencionaré una pequeña necesidad de consulta uno a uno: supongamos que al consultar la información de un pedido, necesitamos consultar la información del usuario que creó ese pedido. El modelo de tabla es el siguiente (
ResultType
Escribir sentencias sql
Primero, debemos analizar nuestra necesidad.1. Debemos determinar qué tablas involucran esta necesidad, y cuál es la tabla principal y cuál es la tabla de enlace. Cómo determinar esto, depende de la necesidad específica - nuestra necesidad es que al consultar pedidos, también se consulte el usuario que creó ese pedido. Entonces, es obvio. Nuestra tabla principal es la tabla de pedidos (orders). Y nuestra tabla de enlace es la tabla de usuarios (user).
En este momento, podemos escribir la siguiente sentencia sql:
select * from orders
En este momento, deberíamos considerar este problema: ¿debemos usar un enlace interno o externo en la consulta de enlace? Para aquellos que no están claros sobre la diferencia entre enlace interno y externo, aquí les explico brevemente, y más tarde escribiré un blog detallado sobre el tema: el enlace interno solo muestra lo que cumple con las condiciones. Los enlaces externos se dividen en enlaces externos izquierdos y derechos: el enlace izquierdo muestra todo el lado izquierdo más lo que coincide con el lado derecho; el enlace derecho muestra todo el lado derecho y lo que coincide con el lado izquierdo y derecho.
Nuestra necesidad es relacionar usuarios a través de pedidos, y dado que en la tabla orders hay una clave foránea (userId). Al consultar los datos de la tabla user relacionada a través de la clave foránea, userId es la clave principal de la tabla user. En este momento, solo se puede obtener una información de user, y este registro no causará que nuestro resultado de consulta principal cambie. Por lo tanto, elegimos la consulta de enlace interno. En este momento, nuestra sentencia sql es esta:
select * from orders, user where orders.user_id = user.id
Después de la consulta, el resultado es el siguiente:
En este momento, surge un problema, descubrimos que en este momento aparecen dos id, lo que causará que nuestros datos se encapsulen en objetos al momento de la salida. Además, la columna User_id es duplicada con nuestros datos de id de usuario. Necesitamos modificar nuestra sql. ¿Cómo modificarla?
Pues nuestros datos de la tabla principal deben ser consultados en su totalidad, mientras que para la tabla de usuarios solo necesitamos la información de username, sex y adress (esta es una suposición, no es necesario preocuparse por qué información se necesita). Entonces, necesitamos especificar manualmente los campos de consulta de nuestra sentencia SQL:
SELECT orders.*, USER.username, USER.sex, USER.address FROM orders, USER WHERE orders.user_id = user.id
Todo lo anterior se realiza en la herramienta de conexión sql, cuando podemos mostrar la base de datos necesaria, nuestra sentencia sql está confirmada. En este momento, debemos comenzar con el siguiente paso:
Crear pojo
Necesitamos encapsular los resultados de la consulta a través del framework Mybatis en los objetos correspondientes. Entonces, ¿quién recibe estos datos? Si vamos a mapear los resultados de la consulta sql superior al pojo, el pojo debe incluir todos los nombres de las columnas de la consulta. Pero ya sea la clase Orders original o la clase User, no pueden mapear todos los campos. En este caso, tenemos una solución很简单: escribir una clase especial según los campos devueltos, que contenga todos los resultados de la consulta, y luego hacer que esta clase reciba el conjunto de resultados devuelto.
En este momento, hay un truco: en nuestro nuevo pojo, no es necesario escribir todos los campos, podemos hacer que el nuevo pojo herede de una clase que contiene más campos de la consulta de resultados, y luego escribir los otros datos necesarios en este subclase.
Después de crear el pojo, necesitamos crear el archivo de mapeo según las especificaciones y escribir los métodos correspondientes en la interfaz:
mapper.xml
Interfaz en mapper.java:
ResultMap
En la sentencia sql, la forma de implementación de resultType y resuleMap es la misma, aquí lo saltamos directamente.
Enfoque de mapeo de resultMap
Sabemos que, cuando usamos pojo, podemos encapsular algunos datos en las propiedades del objeto pojo, que pueden ser de tipo simple o de otro pojo. En este caso, podemos hacer lo siguiente:
Usamos resultMap para mapear la información de la orden en los resultados de la consulta a la clase Orders, agregamos la propiedad User en la clase orders, y mapeamos la información del usuario obtenida por la consulta de asociación a la propiedad user del objeto orders.
Agregar la propiedad user en la clase Orders
mapper.xml
Cuando utilizamos el método resultMap para mapear el conjunto de resultados, necesitamos realizar dos operaciones: una es definir resultMap, configurar las propiedades del objeto correspondiente a cada columna del conjunto de resultados encontrado. Esto es un poco complicado pero no difícil. La otra es definir nuestro statement.
resultMap
resultMap实现的基本思路我们刚才已经说了。而且也在orders的pojo类中增加了相应的属性了。接下啦,就是写一个resultMap,将整个查询的结果映射到Orders中在这里面,首先是order订单的映射。就是直接用id 和result标签将两者相互对应即可。然后就是,关联的用户信息的映射,这时候需要用到一个association的标签,将在orders类中的user字段与User类进行映射,然后在其内部还是用id和result标签,将查询的数据和User的属性相映射。
具体代码如下:
<!-- 订单查询关联用户的resultMap 将整个查询的结果映射到cn.mybatis.po.Orders中 --> <resultMap type="cn.mybatis.po.Orders" id="OrdersUserResultMap"> <!-- 配置映射的订单信息 --> <!-- id:指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个id column:订单信息的唯 一标识 列 property:订单信息的唯 一标识 列所映射到Orders中哪个属性 --> <id column="id" property="id"/> <result column="user_id" property="userId"/> <result column="number" property="number"/> <result column="createtime" property="createtime"/> <result column="note" property=note/> <!-- 配置映射的关联的用户信息 --> <!-- association:用于映射关联查询单个对象的信息 property:要将关联查询的用户信息映射到Orders中哪个属性 --> <association property="user" javaType="cn.mybatis.po.User"> <!-- id:关联查询用户的唯 一标识 column:指定唯 一标识用户信息的列 javaType:映射到user的哪个属性 --> <id column="user_id" property="id"/> <resultado columna="username" propiedad="username"/> <resultado columna="sex" propiedad="sex"/> <resultado columna="address" propiedad="address"/> </asociación> </resultMap>
Declaración
La declaración es bastante simple, es decir, cambiar la forma de mapeo del conjunto de resultados de devolución a resultMap. Luego, configure el tipo de devolución en resultMap recién completado.
mapper.java
Las diferencias entre ambos
Después de explicar los métodos de consulta uno a uno, ahora analicemos sus diferencias y ventajas y desventajas.
Primero, ambos necesitan modificar el pojo, uno es agregar una clase pojo y el otro es modificar los campos del pojo. Personalmente, según el principio de apertura y cierre del diseño del patrón, resultType es mejor que resultMap.
En segundo lugar, en términos de simplicidad, es más simple usar resultType. En este sentido, resultType también es mejor que resultMap.
Sin embargo, resultMap puede implementar la carga diferida, mientras que resultType no puede implementar la carga diferida. En este aspecto, resultType no es tan bueno como resultMap.
Por lo tanto, se recomienda que utilicen resultType si no tienen requisitos especiales de resultados de consulta.
Lo que se ha mencionado anteriormente es la función de consulta uno a uno de mybatis que el editor les ha presentado, espero que les sea útil. Si tienen alguna pregunta, por favor déjenme un mensaje, el editor les responderá a tiempo. También agradezco mucho el apoyo de todos a la página web de tutorial de clamor!
Declaración: Este artículo se ha obtenido de la red, pertenece al propietario original, el contenido se ha contribuido y cargado por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha procesado editorialmente y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de violación de derechos de autor, por favor envíe un correo electrónico a: notice#w proporcionando evidencia relevante.3Declaración: El contenido de este artículo se obtiene de la red, pertenece al propietario original, el contenido se contribuye y se carga por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha procesado editorialmente y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de violación de derechos de autor, por favor envíe un correo electrónico a: notice#w proporcionando evidencia relevante, una vez que se verifique, este sitio eliminará inmediatamente el contenido sospechoso de violación de derechos de autor.