Mapeo de asociaciones Mybatis (lo llevará al mundo del mapeo de asociaciones Mybatis)

Tabla de contenido

Prefacio

1. Introducción al mapeo de relaciones

1. Concepto

2. Características

3. Escenarios de uso

2. Configuración de relaciones uno a uno y uno a muchos en Mybatis

1. Importar tablas de bases de datos relevantes

 2. Consulta de varias tablas

método resultType "java.yutils.Map":

3. Preparación para la implementación del caso

3.1 Generar clases de entidad correspondientes a la base de datos requerida

geneatorConfig.xml configura la información de la clase de entidad

3. Demostración de casos de relaciones relacionadas.

3.1 Demostración de caso de relación de asociación uno a muchos

OrdenMapper.xml

OrdenMapper.java

Código de clase de entidad

Clase de interfaz y código de clase de implementación de interfaz

Código de clase OrderVo

código de prueba

Resultados de la prueba

3.2 Demostración de caso de relación de asociación uno a uno

OrdenItemMapper.xml

OrdenItemMapper.java

Código de clase de entidad

 Código de clase OrderItemVo

Clase de interfaz y código de clase de implementación de interfaz

código de prueba

Resultados de la prueba

Editar

3.3 Demostración del caso de relación de asociación de muchos a muchos

HBookMapper.xml

 HBookMapper.java

Código de clase de entidad

código HBookVo

Clase de interfaz y código de clase de implementación de interfaz

 código de prueba

Resultados de la prueba


Prefacio

         En el último blog, hablé con veteranos sobre la integración de Mybatis y Spring, y me di cuenta de la conveniencia y el encanto que Spring aporta a Mybatis. Hoy los llevaré a los veteranos al mundo del mapeo de relaciones de Mybatis y les haré entender el impacto que nos trae este mundo. Espero que los veteranos puedan ganar algo.

1. Introducción al mapeo de relaciones

1. Concepto

   El mapeo de asociaciones de Mybatis es una tecnología que asigna asociaciones entre tablas de bases de datos a objetos Java . Asigna las columnas de la tabla de la base de datos a las propiedades del objeto Java a través de archivos de configuración o anotaciones , logrando así la interacción de datos entre el objeto y la base de datos . Esta relación de mapeo puede ser uno a uno, uno a muchos, muchos a uno o muchos a muchos . A través del mapeo de asociaciones de Mybatis, podemos realizar fácilmente operaciones de bases de datos sin escribir declaraciones SQL manualmente.

2. Características

Características del mapeo de relaciones de asociación de Mybatis

Descripción de la característica : Mapeo de asociaciones flexible: el mapeo de asociaciones de Mybatis es muy flexible. Se pueden definir varios tipos de asociaciones de acuerdo con las necesidades reales, incluidas uno a uno, uno a muchos, muchos a uno y muchos a muchos. Configuración conveniente para los desarrolladores: a través del archivo de configuración o anotaciones de Mybatis, el mapeo de asociaciones se puede definir fácilmente sin escribir declaraciones SQL engorrosas, lo que reduce la carga de trabajo de los desarrolladores. Propicio para la optimización del rendimiento del proyecto El mapeo de asociación de Mybatis se puede cargar de forma diferida y retrasada, es decir, los objetos asociados se consultan solo cuando es necesario, lo que mejora el rendimiento del sistema y reduce las operaciones de consulta innecesarias. Mejore la eficiencia y reduzca la presión de acceso a la base de datos. Mybatis admite caché de primer nivel y caché de segundo nivel, que pueden almacenar en caché los objetos asociados, mejorar la eficiencia de las consultas y reducir la presión de acceso a la base de datos. Haga que el proyecto sea extensible: el mapeo de asociaciones de Mybatis puede satisfacer el desarrollo personalizado de necesidades específicas a través de TypeHandler personalizado y otros puntos de extensión.

3. Escenarios de uso

  1. Mapeo relacional de objetos (ORM) : Mybatis puede asignar tablas de bases de datos a objetos Java para facilitar las operaciones de persistencia de objetos y simplificar la escritura y administración de las operaciones de la base de datos.

  2. Consultas complejas: a través del mapeo de relaciones de asociación, se pueden realizar fácilmente operaciones de consulta complejas, incluidas consultas asociadas de varias tablas, consultas anidadas, etc., lo que reduce la carga de trabajo de escribir declaraciones SQL manualmente.

  3. Gestión de transacciones de bases de datos: el mapeo de asociaciones de Mybatis se puede utilizar junto con la gestión de transacciones de bases de datos para lograr la coherencia e integridad de los datos.

  4. Gestión de caché: a través del mapeo de relaciones de asociación, la gestión de caché se puede realizar fácilmente, se puede mejorar la eficiencia de las consultas y se puede reducir la presión de acceso a la base de datos.

  5. Sistema distribuido: en un sistema distribuido, el mapeo de asociaciones de Mybatis puede ayudar a lograr la coherencia de los datos y la gestión de transacciones distribuidas.

2. Configuración de relaciones uno a uno y uno a muchos en Mybatis

1. Importar tablas de bases de datos relevantes

 

 Las anteriores son las tablas de la base de datos necesarias para la demostración de nuestro caso.

 2. Consulta de varias tablas

método resultType "java.yutils.Map" :

No se recomienda el uso de este método de consulta de varias tablas en proyectos de la empresa. Es beneficioso para sus propios desarrolladores, pero es desventajoso para el desarrollo corporativo y los equipos de I+D de proyectos.

Beneficios: cuando las necesidades del cliente cambian (Requisito 1-->Requisito 2 (agregar campos)-->Requisito 3 (agregar campos)), no importa cómo cambien las necesidades del cliente, mi código no cambiará. Simplemente agregue un campo.

Desventajas: este método no favorece el mantenimiento y la expansión posteriores de la empresa o del equipo de I + D.

3. Preparación para la implementación del caso

3.1 Generar clases de entidad correspondientes a la base de datos requerida

geneatorConfig.xml configura la información de la clase de entidad
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
    <!-- 引入配置文件 -->
    <properties resource="jdbc.properties"/>

    <!--指定数据库jdbc驱动jar包的位置-->
    <classPathEntry location="D:\\MYsoftware\\Maven\\mvn_repsoitory\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>

    <!-- 一个数据库一个context -->
    <context id="infoGuardian">
        <!-- 注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/><!-- 是否取消注释 -->
            <property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳 -->
        </commentGenerator>

        <!-- jdbc连接 -->
        <jdbcConnection driverClass="${jdbc.driver}"
                        connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>

        <!-- 类型转换 -->
        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 01 指定javaBean生成的位置 -->
        <!-- targetPackage:指定生成的model生成所在的包名 -->
        <!-- targetProject:指定在该项目下所在的路径  -->
        <javaModelGenerator targetPackage="com.yx.model"
                            targetProject="src/main/java">
            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
            <!-- 是否对model添加构造函数 -->
            <property name="constructorBased" value="true"/>
            <!-- 是否针对string类型的字段在set的时候进行trim调用 -->
            <property name="trimStrings" value="false"/>
            <!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 -->
            <property name="immutable" value="false"/>
        </javaModelGenerator>

        <!-- 02 指定sql映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="com.yx.mapper"
                         targetProject="src/main/java">
            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!-- 03 生成XxxMapper接口 -->
        <!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 -->
        <!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 -->
        <!-- type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 -->
        <javaClientGenerator targetPackage="com.yx.mapper"
                             targetProject="src/main/java" type="XMLMAPPER">
            <!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!-- 配置表信息 -->
        <!-- schema即为数据库名 -->
        <!-- tableName为对应的数据库表 -->
        <!-- domainObjectName是要生成的实体类 -->
        <!-- enable*ByExample是否生成 example类 -->
        <!--<table schema="" tableName="t_book" domainObjectName="Book"-->
        <!--enableCountByExample="false" enableDeleteByExample="false"-->
        <!--enableSelectByExample="false" enableUpdateByExample="false">-->
        <!--&lt;!&ndash; 忽略列,不生成bean 字段 &ndash;&gt;-->
        <!--&lt;!&ndash; <ignoreColumn column="FRED" /> &ndash;&gt;-->
        <!--&lt;!&ndash; 指定列的java数据类型 &ndash;&gt;-->
        <!--&lt;!&ndash; <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> &ndash;&gt;-->
        <!--</table>-->

        <table schema="" tableName="t_mvc_Book" domainObjectName="Book"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
            <!-- 忽略列,不生成bean 字段 -->
            <!-- <ignoreColumn column="FRED" /> -->
            <!-- 指定列的java数据类型 -->
            <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> -->
        </table>

<!--        配置要生成的实体类对应的数据库表-->
        <table schema="" tableName="t_hibernate_book" domainObjectName="HBook"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>

        <table schema="" tableName="t_hibernate_book_category" domainObjectName="HBookCategory"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>

        <table schema="" tableName="t_hibernate_category" domainObjectName="HCategory"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>

        <table schema="" tableName="t_hibernate_order" domainObjectName="Order"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>

        <table schema="" tableName="t_hibernate_order_item" domainObjectName="OrderItem"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>

    </context>
</generatorConfiguration>

funcionar

3. Demostración de casos de relaciones relacionadas.

3.1 Demostración de caso de relación de asociación uno a muchos

OrdenMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.yx.mapper.OrderMapper" >
  <resultMap id="BaseResultMap" type="com.yx.model.Order" >
    <constructor >
      <idArg column="order_id" jdbcType="INTEGER" javaType="java.lang.Integer" />
      <arg column="order_no" jdbcType="VARCHAR" javaType="java.lang.String" />
    </constructor>
  </resultMap>
  <sql id="Base_Column_List" >
    order_id, order_no
  </sql>


  <resultMap id="OrderVoMap" type="com.yx.vo.OrderVo" >
    <result column="order_id" property="orderId"></result>
    <result column="order_no" property="orderNo"></result>
    <collection property="orderItems" ofType="com.yx.model.OrderItem">
      <result column="order_item_id" property="orderItemId"></result>
      <result column="product_id" property="productId"></result>
      <result column="quantity" property="quantity"></result>
      <result column="oid" property="oid"></result>
    </collection>
  </resultMap>
  <select id="selectByOid" resultMap="OrderVoMap" parameterType="java.lang.Integer">
    SELECT
	*
FROM
	t_hibernate_order o,
	t_hibernate_order_item oi
WHERE
	o.order_id = oi.oid
	AND o.order_id =#{oid }

  </select>

</mapper>

OrdenMapper.java

package com.yx.mapper;

import com.yx.model.Order;
import com.yx.vo.OrderVo;
import org.apache.ibatis.annotations.Param;

public interface OrderMapper {
   

    OrderVo selectByOid(@Param("oid") Integer oid);
}

Código de clase de entidad

package com.yx.model;

import lombok.ToString;

@ToString
public class Order {
    private Integer orderId;

    private String orderNo;

    public Order(Integer orderId, String orderNo) {
        this.orderId = orderId;
        this.orderNo = orderNo;
    }

    public Order() {
        super();
    }

    public Integer getOrderId() {
        return orderId;
    }

    public void setOrderId(Integer orderId) {
        this.orderId = orderId;
    }

    public String getOrderNo() {
        return orderNo;
    }

    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }


}
//=========================以上是Order实体类代码========================================
//=========================以下是OrderItem实体类代码========================================
package com.yx.model;

import lombok.ToString;

@ToString
public class OrderItem {
    private Integer orderItemId;

    private Integer productId;

    private Integer quantity;

    private Integer oid;

    public OrderItem(Integer orderItemId, Integer productId, Integer quantity, Integer oid) {
        this.orderItemId = orderItemId;
        this.productId = productId;
        this.quantity = quantity;
        this.oid = oid;
    }

    public OrderItem() {
        super();
    }

    public Integer getOrderItemId() {
        return orderItemId;
    }

    public void setOrderItemId(Integer orderItemId) {
        this.orderItemId = orderItemId;
    }

    public Integer getProductId() {
        return productId;
    }

    public void setProductId(Integer productId) {
        this.productId = productId;
    }

    public Integer getQuantity() {
        return quantity;
    }

    public void setQuantity(Integer quantity) {
        this.quantity = quantity;
    }

    public Integer getOid() {
        return oid;
    }

    public void setOid(Integer oid) {
        this.oid = oid;
    }
}

Clase de interfaz y código de clase de implementación de interfaz

package com.yx.biz;

import com.yx.vo.OrderVo;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-04 10:14
 */
public interface OrderBiz {

    OrderVo selectByOid(Integer oid);
}
//============================以上是接口类代码==========================
//============================以下是接口实现类代码======================
package com.yx.biz.impl;

import com.yx.biz.OrderBiz;
import com.yx.mapper.OrderMapper;
import com.yx.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-04 10:15
 */
@Service
public class OrderBizImpl implements OrderBiz {
    @Autowired
    private OrderMapper orderMapper;

    @Override
    public OrderVo selectByOid(Integer oid) {
        return orderMapper.selectByOid(oid);
    }
}

Código de clase OrderVo

package com.yx.vo;

import com.yx.model.Order;
import com.yx.model.OrderItem;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-04 9:05
 */
public class OrderVo extends Order {
    private List<OrderItem> orderItems =new ArrayList<OrderItem>();

    public List<OrderItem> getOrderItems() {
        return orderItems;
    }
    public void setOrderItems(List<OrderItem> orderItems) {
        this.orderItems = orderItems;
    }
}

código de prueba

package com.yx.biz.impl;

import com.yx.biz.OrderBiz;
import com.yx.vo.OrderVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-04 10:19
 * 订单测试类
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class OrderBizImplTest {

    @Autowired
    private OrderBiz orderBiz;
    @Test
    public void selectByOid() {
        OrderVo orderVo = orderBiz.selectByOid(7);
        System.out.println(orderVo);
        orderVo.getOrderItems().forEach(System.out::println);
    }
}
Resultados de la prueba

3.2 Demostración de caso de relación de asociación uno a uno

OrdenItemMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.yx.mapper.OrderItemMapper" >
  <resultMap id="BaseResultMap" type="com.yx.model.OrderItem" >
    <constructor >
      <idArg column="order_item_id" jdbcType="INTEGER" javaType="java.lang.Integer" />
      <arg column="product_id" jdbcType="INTEGER" javaType="java.lang.Integer" />
      <arg column="quantity" jdbcType="INTEGER" javaType="java.lang.Integer" />
      <arg column="oid" jdbcType="INTEGER" javaType="java.lang.Integer" />
    </constructor>
  </resultMap>
  <sql id="Base_Column_List" >
    order_item_id, product_id, quantity, oid
  </sql>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select 
    <include refid="Base_Column_List" />
    from t_hibernate_order_item
    where order_item_id = #{orderItemId,jdbcType=INTEGER}
  </select>

  
  <resultMap id="OrderItemVoMap" type="com.yx.vo.OrderItemVo">
    <result column="order_item_id" property="orderItemId"></result>
    <result column="product_id" property="productId"></result>
    <result column="quantity" property="quantity"></result>
    <result column="oid" property="oid"></result>
    <association property="order" javaType="com.yx.model.Order">
      <result column="order_id" property="orderId"></result>
      <result column="order_no" property="orderNo"></result>
    </association>
  </resultMap>

  <select id="selectByOrderItemId" resultMap="OrderItemVoMap" parameterType="java.lang.Integer">
    SELECT
	*
FROM
	t_hibernate_order o,
	t_hibernate_order_item oi
WHERE
	o.order_id = oi.oid
	AND oi.order_item_id=#{oiid}
  </select>

 
</mapper>

OrdenItemMapper.java

package com.yx.mapper;

import com.yx.model.OrderItem;
import com.yx.vo.OrderItemVo;
import org.apache.ibatis.annotations.Param;

public interface OrderItemMapper {
   
    OrderItemVo selectByOrderItemId(@Param("oiid") Integer oiid);
}

Código de clase de entidad

package com.yx.model;

import lombok.ToString;

@ToString
public class Order {
    private Integer orderId;

    private String orderNo;

    public Order(Integer orderId, String orderNo) {
        this.orderId = orderId;
        this.orderNo = orderNo;
    }

    public Order() {
        super();
    }

    public Integer getOrderId() {
        return orderId;
    }

    public void setOrderId(Integer orderId) {
        this.orderId = orderId;
    }

    public String getOrderNo() {
        return orderNo;
    }

    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }


}
//=========================以上是Order实体类代码========================================
//=========================以下是OrderItem实体类代码========================================
package com.yx.model;

import lombok.ToString;

@ToString
public class OrderItem {
    private Integer orderItemId;

    private Integer productId;

    private Integer quantity;

    private Integer oid;

    public OrderItem(Integer orderItemId, Integer productId, Integer quantity, Integer oid) {
        this.orderItemId = orderItemId;
        this.productId = productId;
        this.quantity = quantity;
        this.oid = oid;
    }

    public OrderItem() {
        super();
    }

    public Integer getOrderItemId() {
        return orderItemId;
    }

    public void setOrderItemId(Integer orderItemId) {
        this.orderItemId = orderItemId;
    }

    public Integer getProductId() {
        return productId;
    }

    public void setProductId(Integer productId) {
        this.productId = productId;
    }

    public Integer getQuantity() {
        return quantity;
    }

    public void setQuantity(Integer quantity) {
        this.quantity = quantity;
    }

    public Integer getOid() {
        return oid;
    }

    public void setOid(Integer oid) {
        this.oid = oid;
    }
}

 Código de clase OrderItemVo

package com.yx.vo;

import com.yx.model.Order;
import com.yx.model.OrderItem;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-04 11:07
 */
public class OrderItemVo extends OrderItem {
    private Order order;

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }
}

Clase de interfaz y código de clase de implementación de interfaz

package com.yx.biz;

import com.yx.vo.OrderItemVo;
import org.apache.ibatis.annotations.Param;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-04 11:10
 */
public interface OrderItemBiz {
    OrderItemVo selectByOrderItemId(@Param("oiid") Integer oiid);
}

//============================以上是接口类代码==========================
//============================以下是接口实现类代码======================
package com.yx.biz.impl;

import com.yx.biz.OrderItemBiz;
import com.yx.mapper.OrderItemMapper;
import com.yx.vo.OrderItemVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-04 11:11
 */
@Service
public class OrderItemBizImpl implements OrderItemBiz {
    @Autowired
    private OrderItemMapper orderItemMapper;

    @Override
    public OrderItemVo selectByOrderItemId(Integer oiid) {
        return orderItemMapper.selectByOrderItemId(oiid);
    }
}

código de prueba

package com.yx.biz.impl;

import com.yx.biz.OrderItemBiz;
import com.yx.vo.OrderItemVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-04 11:13
 * 测试类
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class OrderItemBizImplTest {
@Autowired
private OrderItemBiz orderItemBiz;
    @Test
    public void selectByOrderItemId() {
        OrderItemVo orderItemVo = orderItemBiz.selectByOrderItemId(27);
        System.out.println(orderItemVo);
        System.out.println(orderItemVo.getOrder());
    }
}
Resultados de la prueba

3.3 Demostración del caso de relación de asociación de muchos a muchos

HBookMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.yx.mapper.HBookMapper" >
  <resultMap id="BaseResultMap" type="com.yx.model.HBook" >
    <constructor >
      <idArg column="book_id" jdbcType="INTEGER" javaType="java.lang.Integer" />
      <arg column="book_name" jdbcType="VARCHAR" javaType="java.lang.String" />
      <arg column="price" jdbcType="REAL" javaType="java.lang.Float" />
    </constructor>
  </resultMap>
  <sql id="Base_Column_List" >
    book_id, book_name, price
  </sql>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select 
    <include refid="Base_Column_List" />
    from t_hibernate_book
    where book_id = #{bookId,jdbcType=INTEGER}
  </select>

  <resultMap id="HBookVoMap" type="com.yx.vo.HBookVo">
    <result column="book_id" property="bookId"></result>
    <result column="book_name" property="bookName"></result>
    <result column="price" property="price"></result>
    <collection property="categories" ofType="com.yx.model.HCategory">
      <result column="category_id" property="categoryId"></result>
      <result column="category_name" property="categoryName"></result>
    </collection>
  </resultMap>
<!--  根据书籍的id查询出书籍的信息即所属类别-->
  <select id="selectByBookId" resultMap="HBookVoMap" parameterType="java.lang.Integer">
    SELECT * FROM
	t_hibernate_book b,
	t_hibernate_book_category bc,
	t_hibernate_category c
	where b.book_id=bc.bid
	and bc.cid=c.category_id
	and b.book_id=#{bid}
  </select>


</mapper>

 HBookMapper.java

package com.yx.mapper;

import com.yx.model.HBook;
import com.yx.vo.HBookVo;
import org.apache.ibatis.annotations.Param;

public interface HBookMapper {
    
    HBookVo selectByBookId(@Param("bid") Integer bid);
}

Código de clase de entidad

package com.yx.model;

import lombok.ToString;

@ToString
public class HBook {
    private Integer bookId;

    private String bookName;

    private Float price;

    public HBook(Integer bookId, String bookName, Float price) {
        this.bookId = bookId;
        this.bookName = bookName;
        this.price = price;
    }

    public HBook() {
        super();
    }

    public Integer getBookId() {
        return bookId;
    }

    public void setBookId(Integer bookId) {
        this.bookId = bookId;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public Float getPrice() {
        return price;
    }

    public void setPrice(Float price) {
        this.price = price;
    }
}
//==========================以上是HBook实体类代码==========================================
==========================以下是HCategory实体类代码==========================================
package com.yx.model;

import lombok.ToString;

@ToString
public class HCategory {
    private Integer categoryId;

    private String categoryName;

    public HCategory(Integer categoryId, String categoryName) {
        this.categoryId = categoryId;
        this.categoryName = categoryName;
    }

    public HCategory() {
        super();
    }

    public Integer getCategoryId() {
        return categoryId;
    }

    public void setCategoryId(Integer categoryId) {
        this.categoryId = categoryId;
    }

    public String getCategoryName() {
        return categoryName;
    }

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }
}

código HBookVo

package com.yx.vo;

import com.yx.model.HBook;
import com.yx.model.HCategory;

import java.util.List;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-04 11:34
 */
public class HBookVo extends HBook {
    private List<HCategory> categories;

    public List<HCategory> getCategories() {
        return categories;
    }

    public void setCategories(List<HCategory> categories) {
        this.categories = categories;
    }
}

Clase de interfaz y código de clase de implementación de interfaz

package com.yx.biz;

import com.yx.vo.HBookVo;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-04 11:41
 */
public interface HBookBiz {
    HBookVo selectByBookId(Integer bid);
}
//======================以上是接口类代码===================================
//======================以下是接口实现类代码===============================
package com.yx.biz.impl;

import com.yx.biz.HBookBiz;
import com.yx.mapper.HBookMapper;
import com.yx.vo.HBookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-04 11:42
 */
@Service
public class HBookBizImpl implements HBookBiz {
    @Autowired
    private HBookMapper hBookMapper;

    @Override
    public HBookVo selectByBookId(Integer bid) {
        return hBookMapper.selectByBookId(bid);
    }
}

 código de prueba

package com.yx.biz.impl;

import com.yx.biz.HBookBiz;
import com.yx.vo.HBookVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-04 11:43
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class HBookBizImplTest {
@Autowired
private HBookBiz hBookBiz;

    @Test
    public void selectByBookId() {
        HBookVo hBookVo =this.hBookBiz.selectByBookId(8);
        System.out.println(hBookVo);
        hBookVo.getCategories().forEach(System.out::println);
    }
}
Resultados de la prueba

Supongo que te gusta

Origin blog.csdn.net/weixin_74352229/article/details/132566671
Recomendado
Clasificación