Mybatis高级映射

2023-11-07

Mybatis高级映射本质上来说是多个表的联合查询过程

订单数据模型分析思路

数据表:

用户表user:记录了购买商品的用户信息

订单表orders:记录了用户创建的订单(购买商品的订单)

订单明细表orderdatail:记录了订单的详细信息即购买商品的信息

商品表items:记录了商品信息

 drop table if exists `items`;
CREATE TABLE `items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL COMMENT '商品名称',
  `price` float(10,1) NOT NULL COMMENT '商品定价',
  `detail` text COMMENT '商品描述',
  `pic` varchar(64) DEFAULT NULL COMMENT '商品图片',
  `createtime` datetime NOT NULL COMMENT '生产日期',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

/*Table structure for table `user` */
drop table if exists `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `sex` char(1) DEFAULT NULL COMMENT '性别',
  `address` varchar(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

/*Table structure for table `orders` */
drop table if exists `orders`;
CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT '下单用户id',
  `number` varchar(32) NOT NULL COMMENT '订单号',
  `createtime` datetime NOT NULL COMMENT '创建订单时间',
  `note` varchar(100) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `FK_orders_1` (`user_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;



/*Table structure for table `orderdetail` */

drop table if exists `orderdetail`;
CREATE TABLE `orderdetail` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `orders_id` int(11) NOT NULL COMMENT '订单id',
  `items_id` int(11) NOT NULL COMMENT '商品id',
  `items_num` int(11) DEFAULT NULL COMMENT '商品购买数量',
  PRIMARY KEY (`id`),
  KEY `FK_orderdetail_1` (`orders_id`),
  KEY `FK_orderdetail_2` (`items_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

关注点:

每张表记录的内容

每张表的重要字段

表与表之间的关联:外键

数据模型分析:

表与表之间的业务关系:

用户表user和订单表order的关系:(一对多关系)

user->orders:一个用户可以创建多个订单,一对多

orders->user:一个订单只能由一个用户创建,一对一

订单表orders和订单明细表orderdatail关系:(一对多关系)

orders->orderdatail:一个订单可以包括多个订单明细,一对多

orderdatail->orders:一个订单明细只能包括在一个订单中,一对一

订单明细表orderdatail和商品表items关系:(一对多关系)

items->orderdatail:一个商品可以存在于多个订单明细中,一对多

orderdatail->items:一个订单明细只能包括一个商品,一对一

用户表user和商品表items关系:(多对多关系)

user->items:一个用户可以购买多个商品,多对多

items->user:一个商品可以被多个用户购买,多对多

一对一映射:

需求:通过订单号查询订单和用户信息

select * from orders o,user u where o.number =? and o.user_id=u.id;

分析:

通过orders表作为主表来查询,user表是辅助表

在orders的pojo类上添加上user属性

public class Orders {
    private Integer id;
    private Integer userId;
    private String number;
    private Date createTime;
    private String note;

    //新增属性
    private User user;
}

接口方法:

 Orders selectOrdersByNumber(String number);

返回结果通过resultType返回:

 <select id="selectOrdersByNumber" parameterType="String" resultType="com.wrj.maventest.Mybatis.pojo.Orders">
        select o.*,u.id "user.id",u.username "user.username",u.sex "user.sex",u.address "user.address" from orders o,user u where o.number =#{number} and o.user_id=u.id
    </select>

  返回结果通过resultMap返回:

 <resultMap id="orderUserType" type="com.wrj.maventest.Mybatis.pojo.Orders">
        <id property="id" column="id"/>
        <result property="userId" column="User_id"/>
        <result property="number" column="number"/>
        <result property="createTime" column="createtime"/>
        <result property="note" column="note"/>

        <!--user属性配置-->
        <result property="user.id" column="u_id"/>
        <result property="user.username" column="u_username"/>
        <result property="user.sex" column="u_sex"/>
        <result property="user.address" column="u_address"/>
    </resultMap>
    <select id="selectOrdersByNumber" parameterType="String" resultMap="orderUserType">
        select 0.*,u.id u_id,u.username u_username,u.sex u_sex,u.address u_address from orders o,user u where o.number =#{numner} and o.user_id=u.id
    </select>

优化1:

使用resultMap中提供的association配置一对一关系

association:用于配置关联查询的单个对象

property属性:要映射到pojo类中的对象的属性

javaType属性:要映射的pojo属性的全限定名

columnPrefix属性:针对数据库别名的相同前缀

   <resultMap id="orderUserType1" type="com.wrj.maventest.Mybatis.pojo.Orders">
        <id property="id" column="id"/>
        <result property="userId" column="User_id"/>
        <result property="number" column="number"/>
        <result property="createTime" column="createtime"/>
        <result property="note" column="note"/>
        <association property="user" columnPrefix="u_" javaType="com.wrj.maventest.Mybatis.pojo.User">
            <result property="id" column="id"/>
            <result property="username" column="username"/>
            <result property="sex" column="sex"/>
            <result property="address" column="address"/>
        </association>
    </resultMap>
    <select id="selectOrdersByNumber" parameterType="String" resultMap="orderUserType1">
        select 0.*,u.id u_id,u.username u_username,u.sex u_sex,u.address u_address from orders o,user u where o.number =#{numner} and o.user_id=u.id
    </select>

优化2:

<resultMap id="orderType" type="com.wrj.maventest.Mybatis.pojo.Orders">
        <id property="id" column="id"/>
        <result property="userId" column="User_id"/>
        <result property="number" column="number"/>
        <result property="createTime" column="createtime"/>
        <result property="note" column="note"/>
    </resultMap>
<!--
    extends属性:继承自主类
    association的resultMap使用一个已经存在的mapper类
    -->
    <resultMap id="orderUserType2" extends="orderType" type="com.wrj.maventest.Mybatis.pojo.Orders">
        <association property="user" columnPrefix="u_" resultMap="com.wrj.maventest.Mybatis.mapper.UserMapper.userMap"/>
    </resultMap>

注:一对一映射使用resultMap下的association来配置映射关系

一对多映射:

将关联的列映射为List

需求:查询用户的订单信息

select * from user u,orders o where u.id=o.user_id and u.id=?;

分析:主表是用户user表,订单orders表是辅助表

使用resultMap下提供的Collection来配置 一对多的关系

1.映射pojo类配置

public class User {
    private Integer id;
    private String username;
    private String sex;
    private String address;

    //添加orders属性
    private List<Orders> orders;
}

2.配置文件

<resultMap id="userMap" type="com.wrj.maventest.Mybatis.pojo.User">
        <id property="user.id" column="id"/>
        <result property="user.username" column="username"/>
        <result property="user.sex" column="sex"/>
        <result property="user.address" column="address"/>
        <collection property="orders" ofType="com.wrj.maventest.Mybatis.pojo.Orders" columnPrefix="0_">
            <id property="id" column="id"/>
            <result property="userId" column="user_id"/>
            <result property="number" column="number"/>
            <result property="createTime" column="createtime"/>
            <result property="note" column="note"/>
        </collection>

    </resultMap>
    <select id="selectUserById" parameterType="int" resultMap="userMap">
        select u.*,o.id o_id,o.user_id o_user_id,o.number o_number,
        o.craatetime o_createtime,o.note o_note from user u,orders o where u.id=o.user_id and u.id=#{id};
    </select>

使用resultMap标签下提供的collection配置一对多的关系

collection:对关联查询的多条记录映射到集合对象中

property属性:将关联查询到的多条记录信息映射到orders属性中

oftype:指定映射的集合属性中的类型全限定名

columnPrefix属性:针对数据库别名的相同前缀

多对多映射

需求:查询用户及购买的商品信息

分析:查询用户是主表:user表

         关联表:订单orders表  订单orderdatiles明细表  商品items表

将结果要映射到user属性中,在user类上添加订单列表属性 List<Orders> orderList,用户创建的订单映射到orderList中

Orders类中添加订单明细列表属性 List<OrderDetails>,将订单明细映射到orderDetails中

OrderDetails类中添加商品属性item,将商品映射到item上

resultType和resultMap

resultType

将数据库中的数据映射到pojo类上,自动将字段完成映射,减少映射的编码,不能映射对于数据库字段和pojo类属性不一致的情况,如果所有字段都不匹配,则无法映射一个pojo对象

1.映射自动化,如果字段较少且保持一致优先选择resultType

2.对于多表的映射只能进行一对一映射

resultMap

手动显性实现映射,可以映射数据库字段和pojo类属性不一致的情况,还可以使用association和collection来完成一对一和一对多的高级映射

association:

将关联的查询信息映射到一个pojo类中

collection:

将关联的查询信息映射到一个list集合中

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis高级映射 的相关文章

  • 将链接对象转换为流或集合

    我想迭代堆栈跟踪 堆栈跟踪由可抛出对象组成 其 getCause 返回下一个可抛出对象 最后一次调用 getCause 返回 null 示例 a gt b gt null 我尝试使用 Stream iterable 这会导致 NullPoi
  • jdbc-initialize-database 找不到脚本文件 - DataAccessResourceFailureException

    我无法让我的 Spring Web 应用程序找到我的脚本 我已经配置了 jdbc 命名空间 我已经写好了脚本 但是 我不明白为什么无论我把脚本放在哪里 都找不到它们 我特别将文件夹标记为 类文件夹 我把它们和我所有的罐子放在同一个文件夹里
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • Java 重写 hashCode() 得到 StackOverflowError

    所以我不太熟悉重写 hashCode 并且我似乎在 hashCode 方法中以某种方式进行了一些无限递归 这是我的场景 我有一个 DuplicateCache 类 它是一个缓存对象 用于检查系统中的重复对象 我有一个静态内部类 Duplic
  • Java:从元素创建 DOM 元素,而不是文档

    如您所知 在 Java 中创建 Dom 元素的正确方法是执行以下操作 import org w3c dom Document import org w3c dom Element Document d Element e e d creat
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • Java 变量的作用域

    我不明白为什么这段代码的输出是10 package uno public class A int x 10 A int x 12 new B public static void main String args int x 11 new
  • Spring Stomp over Websocket:流式传输大文件

    我的SockJs客户端在网页中 发送帧大小为16K的消息 消息大小限制决定了我可以传输的文件的最大大小 以下是我在文档中找到的内容 Configure the maximum size for an incoming sub protoco
  • 如何将 XMP XML 块序列化为现有的 JPEG 图像?

    我有许多 JPEG 图像 其中包含损坏的 XMP XML 块 我可以轻松修复这些块 但我不确定如何将 固定 数据写回图像文件 我目前正在使用 JAVA 但我愿意接受任何能让这项任务变得容易的事情 这是目标关于 XMP XML 的另一个问题
  • @EnableTransactionManagement 的范围是什么?

    我试图了解正确的放置位置 EnableTransactionManagement多个 JavaConfig 上下文的情况下的注释 考虑以下场景 我在 JPAConfig java 和 AppConfig java 中有 JPA 配置以及一组
  • 如何在 Spring MongoDB 聚合上投影 DBRef?

    我在 MongoDB shell 中完成了以下聚合 以获取每个用户每种类型的警报数量 db getCollection alerts aggregate unwind son group id son son level level cou
  • 不兼容的类型:在 java netbeans 中对象无法转换为 String

    我试图在我的项目中使用对象数组 但出现错误 incompatible types Object cannot be converted to String 在这一行 ST1 new String emt1 emt2 emt3 emt4 现在
  • 从 Stax XMLStreamReader 读取以解组部分

    我正在使用 Stax 游标 API 从大型 xml 文件中提取数据 当前 我转到特殊标签的开头并使用 JAXB 解组该标签 这对于格式良好的 xml 文件效果很好 但不久前我有一个文档 其中数十万个标签中有一个未关闭 JAXB 使用 XML
  • 来自客户端的超时 Web 服务调用

    我正在使用 RestEasy 客户端调用网络服务 一项要求是 如果调用运行时间超过 5 秒 则中止 超时调用 我如何使用 RestEasy 客户端实现这一目标 我只看到服务器端超时 即如果在一定时间内未完成请求 Rest Easy 网络服务
  • 重写Object类的finalize()方法有什么用?

    据我所知 在java中如果我们想手动调用垃圾收集器 我们可以执行System gc 1 我们在重写的finalize 方法中做了哪些操作 2 如果我们想手动调用JVM垃圾收集器 是否需要重写finalize 方法 我们在重写的 Finali
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr
  • Java 推断泛型类型

    我正在寻找类似的推断捕获泛型类型的概念 类似于以下方法片段 但不是捕获泛型类型的类 public
  • 使用 eclipse IDE 配置 angularjs

    我想开始使用 AngularJs 和 Java Spring 进行开发 我使用 Eclipse 作为 IDE 我想配置我的 Eclipse 以使这些框架无缝工作 我知道我可能要求太多 但相信我 我已经做了很多研究 你们是我最后的选择 任何帮
  • 尝试使用带有有效购买令牌的 Java Google Play Developer API v3 检索应用内购买信息时出现错误请求(无效值)

    当使用 Java Google Play Developer API 版本 3 并请求有效购买令牌的购买信息时 我收到以下异常 API 调用返回 400 Bad Request 响应以及以下消息 code 400 errors domain

随机推荐

  • make: *** No rule to make target `build‘, needed by `default‘. Stop.

    解决Centos7 解决安装Nginx编辑make make install的不成功 make No rule to make target build needed by default Stop 解决方案 1 安装下面配置 yum y
  • Qt信号与槽七种连接方式

    Qt信号与槽七种连接方式 1 F3 F4编辑 拖入按键 按F4选择按键部位 拖动按键部位至mainwindow界面空白位置 并按如下操作 图1 2 signal slots的Edit方式 如图2 图2 3 QT4下的方式 1 connect
  • 才华战胜资本,原创受到尊重(抄袭事件后续)

    你敢相信吗 别人剽窃了我的课程 居然还要告我侵犯对方名誉 吾本小镇做题家 侥幸考入理工大 水杉林赏二月兰 梧桐树下闻桂花 感恩福报996 披星戴月写代码 专利 软著 写博客 半个嵌入式专家 穿上长衫笑寒酸 脱下长衫忙油盐 ad PCB 嘉立
  • 【OpenCV4】使用 normalize() 进行归一化(c++)

    函数原型 void cv normalize InputArray src InputOutputArray dst double alpha 1 double beta 0 int norm type NORM L2 int dtype
  • iptables详解及应用(史上最全)

    1 1 iptables概念 从逻辑上讲 防火墙可以大体分为主机防火墙和网络防火墙 主机防火墙 针对于单个主机进行防护 网络防火墙 往往处于网络入口或边缘 针对于网络入口进行防护 服务于防火墙背后的本地局域网 网络防火墙和主机防火墙并不冲突
  • matplotlib绘制柱状图(普通、堆叠、左右分布)

    文章目录 1 堆叠图 2 左右图 示例代码 3 堆叠 左右 示例代码 不论是堆叠 还是左右分布 其实他们都是柱状图bar 只是根据参数的不同 有不同的显示位置 多个bar呈现在一起就看上去像是堆叠起来 或是左右分布了 因此只需要控制bar的
  • Python3学习(七):模块

    Python3 模块 把一些可以反复使用的代码存放在文件中 为一些脚本或者交互式的解释器实例使用 这个文件被称为模块 模块是一个包含所有你定义的函数和变量的文件 其后缀名是 py 模块可以被别的程序引入 以使用该模块中的函数等功能 类似于C
  • JVM 如何自动完成垃圾回收

    一 简介 思考一个问题 在 java 里面我们 new 一个对象 等到程序结束后 这个对象就被自动回收了 完成这项工作只需要确定 哪些内存需要回收 什么时候回收 如何回收 接下来我们详细的解释下这三个问题 二 哪些内存需要回收 由于程序计数
  • 判断大小端存储两种办法

    1 强制转换 给定 int类型的变量a 赋值为1 1的16进制为 00 00 00 01 若小端存储则a中存储为 01 00 00 00 大端存储为 00 00 00 01 则可以取出a的地址强转为char 类型 char a来判断值为0
  • 2023最新最全git安装教程,保姆级手把手式安装!!!

    目录 一 git简介 二 安装过程 1 首先进入git的官网 https git scm com 然后选择Downloads 2 接着选择与自己电脑系统对应的下载选项 我的电脑是windows7的系统 因此选择windows 3 进去之后
  • [导入]TOMPDA WAP新闻订阅教程

    要浏览本条信息请点击文章标题 文章来源 http www wapkf com article other wap 2006 20060511241 html 转载于 https www cnblogs com 200831856 artic
  • 有哪些值得推荐的好用视频剪辑软件?

    首先 我们不管是工作需要 还是做自媒体 一款用着顺手的视频剪辑软件必不可少 经常看到很多人说我是小白 但又想学习视频剪辑 该如何选择适合自己的视频剪辑软件呢 看到抖音 小红书里面很多有意思的视频 自己也想剪辑试试 但又不知从何下手 话不多说
  • HuggingFace——Accelerate的使用

    Overview Accelerate is a library that enables the same PyTorch code to be run across any distributed configuration by ad
  • 20171207编写一个程序,只接受正整数的输入,然后显示所有小于或等于该数的素数。

    素数 在大于1的整数中 只能被1和这个数本身整除的数 思路 用一个标志sign 来标记出素数 include
  • flink学习40:tableAPI的扫描、投影、过滤、列操作

    from用法 select用法 as用法 where用法 filter用法 列操作 增 删 改
  • 【单例模式】

    单例模式 单例模式常见的几种方法 饿汉式 懒汉式DCL 懒汉式内部类 单例模式常见的几种方法 饿汉式 饿汉式 private final static SingletonPattern singletonPattern new Single
  • centos7 升级openssl1.1.1g、openssh8.6p1小记

    系统版本 CentOS Linux release 7 6 1810 Core 默认版本 OpenSSH 7 4p1 OpenSSL 1 0 2k fips 升级版本 OpenSSH 8 6p1 OpenSSL 1 1 1g 1 安装步骤
  • windows10中安装ubuntu双系统时出现unable to find a medium containing a live file system解决办法

    在ubuntu官网上下载最新的18 04 1LTS版本 通过rufus软件将其写入U盘中 但在电脑安装时出现如下错误 经搜索得到如下信息 原贴链接 只需在安装进行到如下界面时 拔掉U盘再插上即可解决问题
  • 我使用OpenCvSharp的一些坑,我的使用心得

    首先是关于 copyto 的操作郁闷 资源图片 需要 是正方形 或者 宽 大于高经我测试 长宽 大小的情况 还是需要跟背景有相应的一致性 比如如果背景 是长大于宽 则资源文件 也需要长大于宽 反之亦然 正方形的图片 则无此要求 要比背景图片
  • Mybatis高级映射

    Mybatis高级映射本质上来说是多个表的联合查询过程 订单数据模型分析思路 数据表 用户表user 记录了购买商品的用户信息 订单表orders 记录了用户创建的订单 购买商品的订单 订单明细表orderdatail 记录了订单的详细信息