Para aquellos que no son muy claros sobre los conceptos básicos de MyBatis, consulte este artículo: MyBatis Introducción Tutorial de aprendizaje (I) - Introducción rápida de MyBatis.
Conoce mybatis
MyBatis es un proyecto de código abierto de Apache. En 2010, este proyecto se trasladó de Apache Software Foundation a Google Code y pasó a llamarse MyBatis. Migró a Github en noviembre de 2013.
El término ibatis proviene de la combinación de "Internet" y "Abatis", y es un marco de capa de persistencia basado en Java. Ibatis proporciona marcos de capa de persistencia, incluidos mapas SQL y objetos de acceso a datos (DAO)
álbum de imágenes mybatis
Introducción
Mencioné la consulta simple de la base de datos y la consulta de gestión antes. Hay algunos desarrollo de la demanda uno a uno, uno a muchos y muchos a muchos en los requisitos de desarrollo. Por ejemplo, al desarrollar carritos de compras, los pedidos y los usuarios son uno a uno, los usuarios y los pedidos son de uno a muchos, y los usuarios y los productos son muchos a muchos. Estos también son comunes en el desarrollo hibernado. Se implementan a través de la asignación de datos en Hibernate, y en MyBatis, se implementan a través de la asignación de datos en los archivos de configuración.
Consulta uno a uno
Si queremos consultar la información del pedido y la información del usuario de la consulta asociada para crear pedidos, entonces esta es una consulta típica uno a uno. Hay dos formas de implementar una consulta individual: use ResultType y ResultMap. Resulttype requiere una definición de pojo adicional, y luego los campos de consulta corresponden al recién definido POJO uno por uno. ResultMap necesita implementar una correlación individual entre dos POJO a través de archivos de configuración. Implementemos estos dos métodos por separado a continuación.
Resulttype:
1. Cree un pojo y agregue los nuevos atributos que deben asignarse al nuevo POJO.
Public Class OrderCustom extiende los pedidos {// Agregar información de usuario Private String String UserName; sexo de cuerda privada; dirección de cadena privada; public String getUsername () {return UserName; } public void setUsername (String UserName) {this.Username = username; } public String getsex () {return sex; } public void setsex (sexo de cadena) {this.sex = sex; } public String getAddress () {Dirección de retorno; } public void setAddress (dirección de cadena) {this.address = dirección; }}2. Mapeo de archivos:
<Select id = "findOrderUser" resultType = "com.luchao.mybatis.first.po.OrderCustom"> Seleccionar pedidos.*, User.username, user.sex, user.address desde pedidos, usuario donde orders.user_id = user.id </select>>
3. Implementación de la interfaz mapper:
// La orden de consulta e información del usuario Lista pública <SderCustom> findOrderUser () lanza la excepción;
4. Código de prueba:
public void findORDERSUSER () lanza la excepción {// Obtener el objeto SQLSession SQLSession SQLSession = SQLSessionFactory.opensession (); // Crear el objeto OrderMapper, MyBatis genera automáticamente el proxy mapper ordenmapper ordenmapper = sqlsession.getMapper (ordenmapper.class); // Llame al método OrderMapper para consultar el pedido y la lista de información del usuario <DideCustom> OrderCustoms = OrderMapper.FindOrderUser (); System.out.println (ordencustoms.size ()); }Implementación de resultados de resultados:
ResultMap asigna la información de pedido en el resultado de la consulta al objeto de pedidos, agrega el atributo de usuario en la clase de pedidos y asigna la información del usuario de consulta asociada al atributo de usuario en el objeto Orders.
1. Cree un POJO y agregue el atributo de usuario a la clase de pedido.
órdenes de clase pública {ID de entero privado; INTEGER DE UMERIDO PRIVADO; número de cadena privada; Fecha privada CreateTime; nota de cadena privada; // Información del usuario Usuario privado; // Pedir ingreso de la lista privada <OrderDetail> OrderDetails; public Integer getId () {return id; } public void setid (ID de entero) {this.id = id; } public integer getUserID () {return userId; } public void setUserID (Integer UserId) {this.userID = userId; } public String getNumber () {número de retorno; } public void setNumber (número de cadena) {this.number = number == null? nulo: number.trim (); } fecha pública getCreateTime () {return CreateTime; } public void setCreateTime (date CreateTime) {this.CreateTime = CreateTime; } public String getNote () {nota de retorno; } public void setNote (nota de cadena) {this.note = nota == null? NULL: nota.trim (); } Public User getUser () {return user; } public void setUser (usuario de usuario) {this.user = user; } Lista pública <OrderDetail> getOrderDetails () {return OrderDetails; } public void setOrderDetails (List <OrderDetail> OrderDetails) {this.OrdineDetails = OrderDetails; }}2. Mapeo de archivos:
< columna = "CreateTime" Property = "CreateTime" /> <resultado columna = "nota" propiedad = "nota" /> <!-Configure la información del usuario asociada de la asignación-> <!-Asociación: se usa para asignar información para una consulta asociada propiedad de un solo objeto: qué propiedad en órdenes para asignar la información del usuario de la consulta asociada a-> <Propiedad de asociación = "Usuario" javaType="com.luchao.mybatis.first.po.User"> <!-- id: Unique ID of the associated query user column: Specify the column that uniquely identifies user information javaType: Which property of the user map to --> <id column="user_id" property="id" /> <result column="username" property="username" /> <result column="sex" property="sex" /> <resultado columna = "Dirección" Propiedad = "Dirección"/> </socation> </resultmap> <select id = "findOrderUsermap" resultMap = "OrderSUrSerResultMap"> Seleccionar órdenes.*, User.username, user.sex, user.address de órdenes, usuarios donde órdenes.User_id = user.id </select>
Asociación: se utiliza para mapear la información de un objeto único de consulta asociada, propiedad: a qué propiedad en pedidos para mapear la información del usuario de la consulta asociada.
3. Interfaz Mapper
// La orden de consulta y la información del usuario a través de la lista pública de resultados <sders> findOrderUsermap () lanza la excepción;
4. Código de prueba:
public void findORDERSUsermap () lanza la excepción {// Obtener el objeto SQLSession SQLSession SqlSession = SqlSessionFactory.opensession (); // Crear el objeto OrderMapper, MyBatis genera automáticamente el proxy de mapper OrderMapper OrderMapper = sqlsession.getMapper (OrderMapper.Class); // Llame al método OrderMapper para consultar la lista de pedidos y de información del usuario <Sders> Orders = OrderMapper.FindOrderUsermap (); System.out.println (Orders.Size ()); }ResultType y ResultMap implementan un resumen de consulta individual:
Resulttype: es relativamente simple de implementar usando resultType. Si el nombre de la columna de consulta no está incluido en el POJO, debe agregar los atributos correspondientes del nombre de la columna para completar el mapeo. Si no hay requisitos especiales para los resultados de la consulta, se recomienda utilizar el resultado de los resultados.
ResultMap: el resultado de resultados debe definirse por separado, lo cual es un poco problemático. Si hay requisitos especiales para los resultados de la consulta, el uso de ResultMap puede completar los atributos del mapeo de consultas asociado POJO. ResultMap puede implementar la carga perezosa, el thittype no puede implementar la carga perezosa.
Uno a muchos consulta
Si necesita consultar el pedido y los detalles del pedido, entonces este es el requisito de consulta de uno a muchos.
1. POJO es el mismo que el pojo de la orden en el resultado de resultados de arriba. Establezca los detalles del pedido en la lista como el atributo del pedido.
2. Mapeo de archivos:
< oftype = "com.luchao.mybatis.first.po.OrderDetail"> <resultado column = "ordenDetail_id" propiedad = "id" /> <resultado columna = "items_id" Property = "itemsID" /> <resultado columna = "items_num" Property = "itemsnum" /> <resulting column = "Propiedad" de órdenes = "OrdersId" /> <Collection " id = "findOrderAnderDetailMap" resultMap = "OrderSOrderDetailResultMap"> Seleccionar órdenes.*, user.username, user.sex, user.address, ordendetail.id orderdetail_id, ordendetail.items_id, ordendetail.items_num, ordendetail.orders_id de orders, user, user, user, user, user. user.id y orderdetail.orders_id = orders.id </select>
El resultado de resultados de los órdenes y los detalles del pedido se hereda utilizando extensiones, y no es necesario configurar la asignación de información de pedidos e información del usuario.
Colección: asigne múltiples registros al objeto de colección para la consulta de asociación, propiedad: asigne múltiples registros a la propiedad de pedidos.
de ttype: especifica el tipo que se mapea al POJO en el atributo de colección de listas. Tenga en cuenta que todavía hay una diferencia entre el de los tipos y uno a uno.
3. Interfaz Mapper:
// Consulta de pedidos, detalles del pedido e información del usuario a través de ResultMap
Lista pública <Sders> FindOrderAnderDetailMap () lanza excepción;
4. Código de prueba:
public void findOrderAnderDderDetailMap () lanza la excepción {// Obtener el objeto SQLSession SQLSession SqlSession = SQLSessionFactory.Opensession (); // Crear el objeto OrderMapper, MyBatis genera automáticamente el proxy de mapper OrderMapper OrderMapper = sqlsession.getMapper (OrderMapper.Class); // Llame al método OrderMapper para consultar el pedido y la lista de información del usuario <Orders> Orders = OrderMapper.FindOrderAnderDetailMap (); System.out.println (orders.get (). GetOrderDetails (). Size ()); System.out.println (Orders.Size ()); }Resumen de uno a muchos:
MyBatis utiliza la colección de ResultMap para mapear múltiples registros de la consulta asociada en una propiedad de colección de listas.
Implementación utilizando resultType:
Detalles de mapeo de pedidos en las colas de pedido En pedidos, debe manejarlo usted mismo, usar un doble bucle para atravesar, eliminar registros duplicados y colocar los detalles de pedido en las colas de orden. Esto será más problemático.
Muchos a muchos
Si consultamos la información del producto de compra de usuarios y usuarios, esto es muchos a muchos, y puede usar el mapeo de muchos a muchos de MyBatis.
Mapee la información del usuario en el usuario. Agregue la lista de atributos de la lista de pedidos <Orders> OrdersList en la clase de usuario, asigne el pedido creado por el usuario a la lista de orderes, agregue la lista de atributos de la lista de detalles del pedido <OrdenDetail> Detimientos de pedidos en los órdenes, asigne los detalles de pedidos a los Detiales de Orders, agregue el atributo de elementos en el Cailín de pedido y asigne los elementos correspondientes a los detalles del pedido a los elementos.
1. POJO
Public Class OrderDetail {ID de entero privado; Order Ordersid privado; Elemento de Integer privado; Integer Entteemsnum privado; // Información del producto elementos privados elementos; public Integer getId () {return id; } public void setid (ID de entero) {this.id = id; } public integer getORDERSID () {return OrderSID; } public void setORDERSID (Integer OrderSid) {this.ordersID = OrderSID; } public Integer getItemSid () {return itemsId; } public void setItemSid (Integer itemsId) {this.itemsid = itemsId; } public Integer getItemSnum () {return itemsnum; } public void setItemSnum (Integer itemsnum) {this.itemsnum = itemsnum; } elementos públicos getItems () {return items; } public void setItems (elementos elementos) {this.items = elementos; } @Override public String toString () {return "OrderDetail [id =" + id + ", orderSID =" + OrderSID + ", itemsID =" + itemsID + ", elementos =" + itemsnum + "]"; }}2. Mapeo de archivos:
< columna = "Dirección" Propiedad = "Dirección" /> <!-Información de pedido Un usuario corresponde a múltiples órdenes, use la asignación de colección-> <Propiedad de colección = "OrdersList" ofType = "com.luchao.mybatis.first.po.Oders"> <id columna = "Id" Propiedad = "Id" /> <Resultando columna = "User_id" propiedad = "Userid" /< /<Result COLUNTURA <resultado columna = "createTime" Property = "CreateTime" /> <resultado columna = "nota" Propiedad = "nota" /> <!-Detalles de pedido Un pedido incluye múltiples detalles-> <Propiedad de colección = "OrderDetails" oftype = "com.luchao.mybatis.first.po.OrderDetail"> <Id columna = "ID" Propiedad = "Id" /> <Result COLLOM COLUNTULA "COLUNTULA" TIEÑO "TIETROS" TIETROS "TIETROS" TIETROS "TIETROS" PROPIETA "PROPIETA" /"Propiedad". <resultado columna = "elementos_num" propiedad = "elementosnum" /> <resultado column = "orders_id" Property = "OrderSID" /> <!-Información del producto Los detalles de un pedido corresponden a un producto-> <Propiedad de asociación = "items" Javatype = "com.luchao.mybatis.first.po.items"> <id columna = "items_id" Property = "Id" /> "columna" /> "columna" /"columna" /"columna". propiedad = "name"/> <resultado columna = "elementos_detail" propiedad = "detalle"/> <resultado column = "items_price" Property = "Price"/> </asociación> </colección> </colección> </resultmap> <select ID = "findOrderAntemMap" ResultMap = "OrderSIsItemSsResultMap"> Seleccionar orders.*, User.Username, user.SEX, user.ingsInderMsResultMap "> Seleccione Orders.*, User.Username, User.SEX, Usar.AdSInsInsInsRessRessRMAP"> SELECCIONAR PIDERS.*, Usuario. ordendetail.id orderdetail_id, ordendetail.items_id, ordendetail.items_num, ordendetail.orders_id, items.id items_id, items.name items_name, items.detail items_detail, items.ipe items_price de pedidos, usuario, usuario, órdenes, elementos donde orders.user_id = user.id y orderils orders.id y ordendetail.items_id = items.id </select>
Se puede ver que muchos a muchos es básicamente una combinación de uno a muchos y uno a uno. Todos los problemas complejos son básicamente combinaciones de problemas simples. Mientras los analice con cuidado, puede comprender los principios.
3. Interfaz Mapper:
// La orden de consulta, los detalles del pedido y la información del usuario a través de la lista pública de resultados de resultados <serve> findOrderAndItemMap () lanza una excepción;
4. Código de prueba:
public void findOrderAndItemMap () lanza la excepción {// Obtener el objeto SQLSession SQLSession SQLSession = SQLSessionFactory.Opensession (); // Crear el objeto OrderMapper, MyBatis genera automáticamente el proxy de mapper OrderMapper OrderMapper = sqlsession.getMapper (OrderMapper.Class); // Llame al método OrderMapper para consultar el pedido y la lista de información del usuario <Ser User> Users = OrderMapper.FindOrderAntemMap (); System.out.println (users.get (). GetOrdersList (). Get () .getOrderDetails (). Get (). GetId ()); // System.out.println (Orders.Size ()); }RESUMEN DE MUCHA A MUCHO ALUMENTO:
Los requisitos anteriores utilizan el Turno de result para mapear los registros consultados en un POJO extendido, que es muy simple de implementar la función de una lista detallada, pero esto no puede lograr una carga retrasada. Use ResultMap para asignar una lista detallada de elementos comprados por los usuarios a un objeto, lo que permite la carga perezosa. El uso de ResultMap es para aquellas funciones que tienen requisitos especiales para la asignación de resultados de consulta, como la asignación de requisitos especiales en listas que incluyen múltiples listas.
Resumen de mapas
1. Resulttype:
efecto:
Mapee los resultados de la consulta en POJO de acuerdo con el nombre de la columna SQL Nombre del atributo POJO Consistencia.
ocasión:
Visualización común de registros detallados, como cuando los usuarios compran los detalles del producto y muestran toda la información de consulta asociada en la página, puede usar directamente el resultado de resultados para asignar cada registro en un POjo y atravesar la lista (POJO en la lista) en la página de front-end.
2. ResultMap:
Use la asociación y la colección para completar el mapeo avanzado uno a uno y uno a muchos (existen requisitos de mapeo especiales para los resultados).
asociación:
efecto:
Mapee la información de consulta asociada en un objeto POJO.
ocasión:
Para facilitar la consulta de información asociada, puede utilizar la asociación para asignar información de pedido asociada en los atributos de POJO de objetos de usuario, como: consulta de pedidos e información de usuario asociada.
El uso de resultType no puede mapear los resultados de la consulta al atributo POJO del objeto POJO. Elija si se utiliza TEVETTYPE o ResultMap de acuerdo con las necesidades de atravesar la consulta de conjunto de resultados.
Recopilación:
efecto:
Mapee la información de consulta asociada en una recopilación de listas.
ocasión:
Para facilitar la consulta de información de la asociación transversal, puede usar la recopilación para asignar la información de la asociación a la recopilación de la lista. Por ejemplo: consulta el módulo de alcance de permiso del usuario y el menú en el módulo, puede usar la colección para asignar la lista del módulo para asignar los atributos de la lista del menú del objeto del módulo. El propósito de esto es facilitar la consulta transversal del conjunto de resultados de consulta.
Si usa resultType, no puede asignar los resultados de la consulta a la colección de la lista.
El contenido anterior es el tutorial de aprendizaje de mapeo avanzado MyBatis presentada por el editor. Espero que te sea útil. Si desea saber más, ¡preste atención al sitio web de Wulin.com!