myBatis-07 案例实践

案例表结构:

1、用户表

2、订单表

3、订单明细表

4、商品表

表结构关系相对比较清楚。

0、项目代码结构

1、表结构创建

客户表

-- ----------------------------
-- Table structure for ex_customer
-- ----------------------------
DROP TABLE IF EXISTS `ex_customer`;
CREATE TABLE `ex_customer`  (
  `custId` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `custName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `telephone` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `sex` char(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`custId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of ex_customer
-- ----------------------------
INSERT INTO `ex_customer` VALUES ('C001', '顾问', '15345187579', '男', '顾问');
INSERT INTO `ex_customer` VALUES ('C002', '曹阳', '15345187577', '男', '曹阳');

SET FOREIGN_KEY_CHECKS = 1;

订单表

-- ----------------------------
-- Table structure for ex_order
-- ----------------------------
DROP TABLE IF EXISTS `ex_order`;
CREATE TABLE `ex_order`  (
  `orderId` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `custId` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `orderDate` datetime NULL DEFAULT NULL,
  `totalMoney` decimal(10, 2) NULL DEFAULT NULL,
  `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`orderId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of ex_order
-- ----------------------------
INSERT INTO `ex_order` VALUES ('T0001', 'C001', '2021-01-01 00:00:00', 7000.00, '测试订单');

SET FOREIGN_KEY_CHECKS = 1;

订单明细表

-- ----------------------------
-- Table structure for ex_orderdetail
-- ----------------------------
DROP TABLE IF EXISTS `ex_orderdetail`;
CREATE TABLE `ex_orderdetail`  (
  `detailId` bigint(20) NOT NULL AUTO_INCREMENT,
  `orderId` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `prodId` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `buyPrice` decimal(10, 2) NULL DEFAULT NULL,
  `buyCount` int(11) NULL DEFAULT NULL,
  `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`detailId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of ex_orderdetail
-- ----------------------------
INSERT INTO `ex_orderdetail` VALUES (1, 'T0001', 'P001', 2000.00, 2, NULL);
INSERT INTO `ex_orderdetail` VALUES (2, 'T0001', 'P002', 3000.00, 1, NULL);

SET FOREIGN_KEY_CHECKS = 1;

商品表

-- ----------------------------
-- Table structure for ex_product
-- ----------------------------
DROP TABLE IF EXISTS `ex_product`;
CREATE TABLE `ex_product`  (
  `prodId` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `prodName` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `sellPrice` decimal(10, 2) NULL DEFAULT NULL,
  `imgUrl` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`prodId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of ex_product
-- ----------------------------
INSERT INTO `ex_product` VALUES ('P001', '手机', 2000.00, NULL, NULL);
INSERT INTO `ex_product` VALUES ('P002', '平板', 3000.00, NULL, NULL);

SET FOREIGN_KEY_CHECKS = 1;

2、模型类定义

2.1、用户模型

package rui.db.Model;

import org.springframework.stereotype.Component;
import java.io.Serializable;
import java.util.List;

//客户模型
@Component
public class ex_Customer implements Serializable {
    private String custId;
    private String custName;
    private String telephone;
    private String sex;
    private String remark;

    //用户采购订单列表 1对多
    private List<ex_Order> orderList;

    //用户采购商品列表 多对多
    private List<ex_Product> prodList;

    public String getCustId() {
        return custId;
    }

    public void setCustId(String custId) {
        this.custId = custId;
    }

    public String getCustName() {
        return custName;
    }

    public void setCustName(String custName) {
        this.custName = custName;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public List<ex_Product> getProdList() {
        return prodList;
    }

    public void setProdList(List<ex_Product> prodList) {
        this.prodList = prodList;
    }

    @Override
    public String toString() {
        String result = "ex_customer{" + "custId='" + custId + '\'' + ", custName='" + custName + '\'' + ", telephone='" + telephone + '\'' + ", sex='" + sex + '\'' + ", remark='" + remark + '\'' + '}';
        if (prodList != null) {
            result += "\n采购商品列表";
            for (ex_Product item : prodList) {
                result += "\n" + item.toString();
            }
        }
        if (orderList != null) {
            result += "\n采购订单列表";
            for (ex_Order item : orderList) {
                result += "\n" + item.toString();
            }
        }
        return result;
    }
}

2.2、订单模型

package rui.db.Model;

import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

//订单模型
@Component
public class ex_Order implements Serializable {
    private String orderId;
    private String custId;
    private Date orderDate;
    private double totalMoney;
    private String remark;
    //包含客户表引用
    private ex_Customer orderCust;
    //包含订单明细
    private List<ex_OrderDetail> detailList;

    public String getOrderId() {
        return orderId;
    }

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

    public String getCustId() {
        return custId;
    }

    public void setCustId(String custId) {
        this.custId = custId;
    }

    public Date getOrderDate() {
        return orderDate;
    }

    public void setOrderDate(Date orderDate) {
        this.orderDate = orderDate;
    }

    public double getTotalMoney() {
        return totalMoney;
    }

    public void setTotalMoney(double totalMoney) {
        this.totalMoney = totalMoney;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public ex_Customer getOrderCust() {
        return orderCust;
    }

    public void setOrderCust(ex_Customer orderCust) {
        this.orderCust = orderCust;
    }

    public List<ex_OrderDetail> getDetailList() {
        return detailList;
    }

    public void setDetailList(List<ex_OrderDetail> detailList) {
        this.detailList = detailList;
    }

    @Override
    public String toString() {
        String result = "ex_order{" +
                "orderId='" + orderId + '\'' +
                ", cusId='" + custId + '\'' +
                ", orderDate=" + orderDate +
                ", totalMoney=" + totalMoney +
                ", remark='" + remark + '\'' +
                '}';
        if (orderCust != null)
            result += "\n" + orderCust.toString();
        if (detailList != null) {
            result += "\n订单包含如下的订单明细数据";
            for (ex_OrderDetail detail : detailList) {
                result += "\n" + detail.toString();
            }
        }
        return result;
    }
}

2.3、订单明细模型

package rui.db.Model;

import org.springframework.stereotype.Component;

import java.io.Serializable;

//订单明细
@Component
public class ex_OrderDetail implements Serializable {
    private long detailId;
    private String orderId;
    private String prodId;
    private double buyPrice;
    private int buyCount;
    private String remark;

    //包含订单商品引用
    private ex_Product orderProd;

    public long getDetailId() {
        return detailId;
    }

    public void setDetailId(long detailId) {
        this.detailId = detailId;
    }

    public String getOrderId() {
        return orderId;
    }

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

    public String getProdId() {
        return prodId;
    }

    public void setProdId(String prodId) {
        this.prodId = prodId;
    }

    public double getBuyPrice() {
        return buyPrice;
    }

    public void setBuyPrice(double buyPrice) {
        this.buyPrice = buyPrice;
    }

    public int getBuyCount() {
        return buyCount;
    }

    public void setBuyCount(int buyCount) {
        this.buyCount = buyCount;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public ex_Product getOrderProd() {
        return orderProd;
    }

    public void setOrderProd(ex_Product orderProd) {
        this.orderProd = orderProd;
    }

    @Override
    public String toString() {
        String result = "ex_Orderdetail{" +
                "detailId=" + detailId +
                ", orderId='" + orderId + '\'' +
                ", prodId='" + prodId + '\'' +
                ", buyPrice=" + buyPrice +
                ", buyCount=" + buyCount +
                ", remark='" + remark + '\'' +
                '}';
        if (orderProd != null) {
            result += "\n" + orderProd.toString();
        }
        return result;
    }
}

2.4、商品模型

package rui.db.Model;

import org.springframework.stereotype.Component;

import java.io.Serializable;

//产品模型
@Component
public class ex_Product implements Serializable {
    private String prodId;
    private String prodName;
    private double sellPrice;
    private String imgUrl;
    private String remark;

    public String getProdId() {
        return prodId;
    }

    public void setProdId(String prodId) {
        this.prodId = prodId;
    }

    public String getProdName() {
        return prodName;
    }

    public void setProdName(String prodName) {
        this.prodName = prodName;
    }

    public double getSellPrice() {
        return sellPrice;
    }

    public void setSellPrice(double sellPrice) {
        this.sellPrice = sellPrice;
    }

    public String getImgUrl() {
        return imgUrl;
    }

    public void setImgUrl(String imgUrl) {
        this.imgUrl = imgUrl;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    @Override
    public String toString() {
        return "ex_product{" +
                "prodId='" + prodId + '\'' +
                ", prodName='" + prodName + '\'' +
                ", sellPrice=" + sellPrice +
                ", imgUrl='" + imgUrl + '\'' +
                ", remark='" + remark + '\'' +
                '}';
    }
}

3、访问层接口

定义两个数据访问接口:

3.1、订单Dao

从订单角度查询数据,包含订单用户,订单明细列表,订单明细商品

package rui.db.Dao;

import rui.db.Model.ex_Order;
import org.springframework.stereotype.Repository;

import java.util.List;

//订单接口
@Repository(value = "ex_OrderDao")
public interface ex_OrderDao {
    public ex_Order findByKey(String orderId);

    public List<ex_Order> findAll();
}

3.2、订单Mapper

<?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">

<!--自动代理生成模式,namespace值必须和接口保证一致-->
<mapper namespace="rui.db.Dao.ex_OrderDao">
    <!--查询单条数据-->
    <select id="findByKey" resultMap="orderResult">
        Select ex_order.*,
               custName,
               telephone,
               sex,
               ex_customer.remark as ex_customer_remark,
               detailId,
               ex_orderdetail.prodId,
               buyCount,
               buyPrice,
               prodName,
               sellPrice,
               imgUrl
        from ex_order
                 left join ex_customer on ex_order.custId = ex_customer.custId
                 left join ex_orderdetail on ex_order.orderId = ex_orderdetail.orderId
                 left join ex_product on ex_orderdetail.prodId = ex_product.prodId
        where ex_order.orderId = #{orderId}
    </select>

    <!--查询多条数据-->
    <select id="findAll" resultMap="orderResult">
        Select ex_order.*,
               custName,
               telephone,
               sex,
               ex_customer.remark as ex_customer_remark,
               detailId,
               ex_orderdetail.prodId,
               buyCount,
               buyPrice,
               prodName,
               sellPrice,
               imgUrl
        from ex_order
                 left join ex_customer on ex_order.custId = ex_customer.custId
                 left join ex_orderdetail on ex_order.orderId = ex_orderdetail.orderId
                 left join ex_product on ex_orderdetail.prodId = ex_product.prodId
        where 1 = 1
    </select>

    <!-- 定义订单查询结果映射 -->
    <resultMap id="orderResult" type="rui.db.Model.ex_Order">
        <id property="orderId" column="orderId"/>
        <result property="custId" column="custId"/>
        <result property="orderDate" column="orderDate"/>
        <result property="totalMoney" column="totalMoney"/>
        <result property="remark" column="remark"/>
        <!--客户关联,通过javaType设置映射的类型-->
        <association property="orderCust" javaType="rui.db.Model.ex_Customer" resultMap="customerResult">

        </association>
        <!--订单明细集合,通过ofType设置映射的类型-->
        <collection property="detailList" ofType="rui.db.Model.ex_OrderDetail" resultMap="orderDetailResult">

        </collection>
    </resultMap>

    <!--客户映射-->
    <resultMap id="customerResult" type="rui.db.Model.ex_Customer">
        <id property="custId" column="custId"/>
        <result property="custName" column="custName"/>
        <result property="telephone" column="telephone"/>
        <result property="sex" column="sex"/>
        <!--列明重复时解决方案-->
        <result property="remark" column="ex_customer_remark"/>
    </resultMap>

    <!--订单明细映射-->
    <resultMap id="orderDetailResult" type="rui.db.Model.ex_OrderDetail">
        <id property="detailId" column="detailId"/>
        <result property="orderId" column="orderId"/>
        <result property="prodId" column="prodId"/>
        <result property="buyPrice" column="buyPrice"/>
        <result property="buyCount" column="buyCount"/>
        <result property="remark" column="remark"/>
        <!--商品关联-->
        <association property="orderProd" javaType="rui.db.Model.ex_Product" resultMap="productResult">

        </association>
    </resultMap>

    <!--商品映射-->
    <resultMap id="productResult" type="rui.db.Model.ex_Product">
        <id property="prodId" column="prodId"></id>
        <result property="prodName" column="prodName"/>
        <result property="sellPrice" column="sellPrice"/>
        <result property="imgUrl" column="imgUrl"/>
    </resultMap>
</mapper>

3.3、用户Dao

从用户角度查询数据,包含商品列表,订单列表

package rui.db.Dao;

import rui.db.Model.ex_Customer;
import org.springframework.stereotype.Repository;

//用户接口
@Repository(value = "ex_CustomerDao")
public interface ex_CustomerDao {
    //主键查询
    public ex_Customer findByKey(String custId);
}

3.4、用户Mapper

<?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">

<!--自动代理生成模式,namespace值必须和接口保证一致-->
<mapper namespace="rui.db.Dao.ex_CustomerDao">
    <cache/>
    <!--查询单条数据-->
    <select id="findByKey" resultMap="customerResult">
        SELECT ex_customer.*,
               ex_order.orderId,
               ex_order.orderDate,
               ex_order.totalMoney,
               ex_orderdetail.detailId,
               ex_orderdetail.prodId,
               ex_orderdetail.buyPrice,
               ex_orderdetail.buyCount,
               ex_product.prodName,
               ex_product.sellPrice,
               ex_product.imgUrl
        FROM ex_customer
                 LEFT JOIN ex_order ON ex_customer.custId = ex_order.custId
                 LEFT JOIN ex_orderdetail ON ex_order.orderId = ex_orderdetail.orderId
                 LEFT JOIN ex_product ON ex_orderdetail.prodId = ex_product.prodId
        where ex_customer.custId = #{custId}
    </select>

    <!-- 定义客户结果映射 -->
    <resultMap id="customerResult" type="rui.db.Model.ex_Customer">
        <id property="custId" column="custId"/>
        <result property="custName" column="custName"/>
        <result property="telephone" column="telephone"/>
        <result property="sex" column="sex"/>
        <result property="remark" column="remark"/>

        <!--商品集合,通过ofType设置映射的类型-->
        <collection property="prodList" ofType="rui.db.Model.ex_Product" resultMap="productResult">

        </collection>

        <!--订单集合,通过ofType设置映射的类型-->
        <collection property="orderList" ofType="rui.db.Model.ex_Order" resultMap="orderResult">

        </collection>
    </resultMap>

    <!--订单映射-->
    <resultMap id="orderResult" type="rui.db.Model.ex_Order">
        <id property="orderId" column="orderId"/>
        <result property="custId" column="custId"/>
        <result property="orderDate" column="orderDate"/>
        <result property="totalMoney" column="totalMoney"/>
        <result property="remark" column="remark"/>
        <!--订单明细集合-->
        <collection property="detailList" ofType="rui.db.Model.ex_OrderDetail" resultMap="orderDetailResult">

        </collection>
    </resultMap>

    <!--订单明细映射-->
    <resultMap id="orderDetailResult" type="rui.db.Model.ex_OrderDetail">
        <id property="detailId" column="detailId"/>
        <result property="orderId" column="orderId"/>
        <result property="prodId" column="prodId"/>
        <result property="buyPrice" column="buyPrice"/>
        <result property="buyCount" column="buyCount"/>
        <result property="remark" column="remark"/>
        <!--商品关联-->
        <association property="orderProd" javaType="rui.db.Model.ex_Product" resultMap="productResult">

        </association>
    </resultMap>

    <!--商品映射-->
    <resultMap id="productResult" type="rui.db.Model.ex_Product">
        <id property="prodId" column="prodId"></id>
        <result property="prodName" column="prodName"/>
        <result property="sellPrice" column="sellPrice"/>
        <result property="imgUrl" column="imgUrl"/>
    </resultMap>

</mapper>

5、测试查询

5.1、测试1

//从订单角度查询数据,获取订单明细,订单明细关联商品 - 单记录查询
    @Test
    public void TestMyBatis_01() throws IOException {
        //1 读取配置文件
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //2 构建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //3 构建SqlSession,并执行mapper内操作
        try (SqlSession session = sqlSessionFactory.openSession()) {
            //获取接口代理实现
            ex_OrderDao dao = session.getMapper(ex_OrderDao.class);
            ex_Order entry = dao.findByKey("T0001");
            System.out.println(entry.toString());
        }
        System.out.println("测试完成1");
    }

5.2、测试2

//从订单角度查询数据,获取订单明细,订单明细关联商品 - 多记录查询
    @Test
    public void TestMyBatis_02() throws IOException {
        //1 读取配置文件
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //2 构建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //3 构建SqlSession,并执行mapper内操作
        try (SqlSession session = sqlSessionFactory.openSession()) {
            //获取接口代理实现
            ex_OrderDao dao = session.getMapper(ex_OrderDao.class);
            List<ex_Order> list = dao.findAll();
            for (ex_Order item : list) {
                System.out.println("--------------");
                System.out.println(item);
            }
        }
        System.out.println("测试完成2");
    }

5.3、测试3

//从客户角度查询,能够获取客户采购的商品列表和订单列表

    @Test
    public void TestMyBatis_03() throws IOException {
        //1 读取配置文件
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //2 构建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //3 构建SqlSession,并执行mapper内操作
        try (SqlSession session = sqlSessionFactory.openSession()) {
            //获取接口代理实现
            ex_CustomerDao dao = session.getMapper(ex_CustomerDao.class);

            ex_Customer item = dao.findByKey("C001");
            System.out.println(item.toString());
        }
        System.out.println("测试完成3");
    }

7、延迟加载

延迟加载,就是关联表数据推迟加载,如果需要关联表数据时再进行数据加载。

而Mapper内的association、collection就具备延迟加载功能。

延迟需要先从单表查询数据,关联表数据通过另一个Select再取获取。

这里以用户表为例介绍延迟加载。

7.1、开启延迟加载

myBatis全局配置文件

    <!-- 全局配置参数,相关的参数参照myBatis文档 -->
    <settings>
        <!-- 是否开启缓存 -->
        <setting name="cacheEnabled" value="true"/>
        <!-- 是否开启延迟加载 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--将积极加载修改成消极加载-->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

7.2、延迟加载的Mapper配置

<?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">

<!--自动代理生成模式,namespace值必须和接口保证一致-->
<mapper namespace="rui.db.Dao.ex_CustomerDao">
    <cache/>

    <!--延迟加载的方法-->
    <select id="findByKey" resultMap="customerResult">
        SELECT ex_customer.*
        FROM ex_customer
        where ex_customer.custId = #{custId}
    </select>

    <!-- 定义客户结果映射 -->
    <resultMap id="customerResult" type="rui.db.Model.ex_Customer">
        <id property="custId" column="custId"/>
        <result property="custName" column="custName"/>
        <result property="telephone" column="telephone"/>
        <result property="sex" column="sex"/>
        <result property="remark" column="remark"/>

        <!--商品集合,通过ofType设置映射的类型-->
        <collection property="prodList" ofType="rui.db.Model.ex_Product" >

        </collection>

        <!--订单集合,通过ofType设置映射的类型-->
        <!--延迟加载订单 调用外部select,并指定要传入的字段列-->
        <collection property="orderList" ofType="rui.db.Model.ex_Order" select="lazyOrderResult" column="custId" >

        </collection>
    </resultMap>

    <!--延迟加载订单数据-->
    <select id="lazyOrderResult" resultMap="orderResult">
        Select ex_order.*,
               detailId,
               ex_orderdetail.prodId,
               buyCount,
               buyPrice,
               prodName,
               sellPrice,
               imgUrl
        from ex_order
                 left join ex_customer on ex_order.custId = ex_customer.custId
                 left join ex_orderdetail on ex_order.orderId = ex_orderdetail.orderId
                 left join ex_product on ex_orderdetail.prodId = ex_product.prodId
        where ex_order.custId = #{custId}
    </select>

    <!--订单映射-->
    <resultMap id="orderResult" type="rui.db.Model.ex_Order">
        <id property="orderId" column="orderId"/>
        <result property="custId" column="custId"/>
        <result property="orderDate" column="orderDate"/>
        <result property="totalMoney" column="totalMoney"/>
        <result property="remark" column="remark"/>
        <!--订单明细集合-->
        <collection property="detailList" ofType="rui.db.Model.ex_OrderDetail" resultMap="orderDetailResult">

        </collection>
    </resultMap>

    <!--订单明细映射-->
    <resultMap id="orderDetailResult" type="rui.db.Model.ex_OrderDetail">
        <id property="detailId" column="detailId"/>
        <result property="orderId" column="orderId"/>
        <result property="prodId" column="prodId"/>
        <result property="buyPrice" column="buyPrice"/>
        <result property="buyCount" column="buyCount"/>
        <result property="remark" column="remark"/>
        <!--商品关联-->
        <association property="orderProd" javaType="rui.db.Model.ex_Product" resultMap="productResult">

        </association>
    </resultMap>

    <!--商品映射-->
    <resultMap id="productResult" type="rui.db.Model.ex_Product">
        <id property="prodId" column="prodId"></id>
        <result property="prodName" column="prodName"/>
        <result property="sellPrice" column="sellPrice"/>
        <result property="imgUrl" column="imgUrl"/>
    </resultMap>

</mapper>

7.3、通过日志验证延迟

mybatis对接log4J

1)pom导入包

        <!--单元测试-->
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>

2)mybatis主配置文件

log4j.properties配置内容

## 设置Logger输出级别和输出目的地 ###
log4j.rootLogger=DEBUG,CONSOLE,LOGFILE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%5p [%t] - %m%n

log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.file=log4j.log
log4j.appender.LOGFILE.appand=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout  
log4j.appender.LOGFILE.layout.ConversionPattern=%5p [%t] - %m%n

执行非加载模式日志输出:

 

执行懒加载模式日志输出:

 

posted @ 2022-02-10 19:13  草莓爸  阅读(27)  评论(0编辑  收藏  举报