【MyBatis】自定义resultMap三种映射关系

目录

一、一对一映射(One-to-One)

1.1 表关系

1.2 resultMap设置自定义映射 

二、一对多映射(One-to-Many)

2.1 创建实体

2.2 级联方式处理映射关系

2.3 定义SQL

2.4 OrderMapper接口

2.5 编写业务逻辑层

2.6 Junit测试

三、多对多映射(Many-to-Many)

3.1 表关系

3.2 创建实体

3.3 处理映射关系、定义sql

3.4 HBookMapper 接口

3.5 编写业务逻辑层

3.6 Junit测试


一、一对一映射(One-to-One)

1.1 表关系

         一对一映射是指一个对象与另一个对象具有一对一的关系。例如,一个用户(User)与一个地址(Address)之间的关系。假设我们有以下表结构:

user 表:

id (int)
name (varchar)
address_id (int)

address 表:

id (int)
street (varchar)
city (varchar)

首先,创建 User 和 Address 实体类:

User.java

public class User {private int id;private String name;private Address address;// getters and setters
}

Address.java

public class Address {private int id;private String street;private String city;// getters and setters
}

接下来,创建一个 resultMap 进行一对一映射:

1.2 resultMap设置自定义映射 

UserMapper.xml

<resultMap id="UserAddressResultMap" type="User"><id property="id" column="id"/><result property="name" column="name"/>//一对一关系使用association<association property="address" javaType="Address"><id property="id" column="address_id"/><result property="street" column="street"/><result property="city" column="city"/></association>
</resultMap>

属性:

  • id:表示自定义映射的唯一标识
  • type:查询的数据要映射的实体类的类型

子标签:

  • id:设置主键的映射关系
  • result:设置普通字段的映射关系
  • association :设置多对一的映射关系
  • collection:设置一对多的映射关系

子标签属性:

  • property:设置映射关系中实体类中的属性名
  • column:设置映射关系中表中的字段名

最后,编写一个查询方法来使用这个 resultMap: 

UserMapper.xml

<select id="findUserWithAddress" resultMap="UserAddressResultMap">SELECT u.id, u.name, a.id as address_id, a.street, a.cityFROM user uINNER JOIN address a ON u.address_id = a.idWHERE u.id = #{id}
</select>

        最后实现接口findUserWithAddress方法测试即可,通过以上简单的案例,我相信你已经明白自定义关系映射了。往往实际开发中数据和表是要复杂的多,进阶用法请看以下示例:

二、一对多映射(One-to-Many)

        一对多映射是指一个对象与多个对象具有一对多的关系。例如,一个订单(Oeder)与一个订单详情(OrderItem)之间的关系。假设我们有以下表结构:

2.1 创建实体

 利用mybatis逆向工程(generatorConfig.xml)生成模型层代码 :

   创建 OrderVo 它是一个值对象(Value Object),继承 Order 类并添加了一个额外的属性 orderItems。该类用于在应用程序的各个层之间传递数据,尤其是在表示层和业务逻辑层之间。在这个例子中,OrderVo 类用于表示一个订单及其关联的订单项。

package com.ycxw.vo;import com.ycxw.model.Order;
import com.ycxw.model.OrderItem;
import lombok.Data;import java.util.ArrayList;
import java.util.List;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-26 16:30*/
@Data
public class OrderVo extends Order {private List<OrderItem> orderItems = new ArrayList<>();
}

2.2 级联方式处理映射关系

    <resultMap id="OrderVoMap" type="com.ycxw.vo.OrderVo"><result column="order_id" property="orderId"></result><result column="order_no" property="orderNo"></result>//多关系使用collection<collection property="orderItems" ofType="com.ycxw.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>

2.3 定义SQL

    <select id="SelectByOid" resultMap="OrderVoMap" parameterType="java.lang.Integer">SELECT *FROM t_hibernate_order o,t_hibernate_order_item oiWHERE o.order_id = oi.oidAND o.order_id = #{oid}</select>

2.4 OrderMapper接口

package com.ycxw.mapper;import com.ycxw.model.Order;
import com.ycxw.vo.OrderVo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;@Repository
public interface OrderMapper {OrderVo SelectByOid(@Param("oid") Integer oid);
}

2.5 编写业务逻辑层

OrderItmeBiz 接口
package com.ycxw.biz;import com.ycxw.vo.OrderItemVo;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-26 21:48*/
public interface OrderItmeBiz {OrderItemVo SelectByOitemId(Integer oiid);
}
OrderBizImpl 接口实现类
package com.ycxw.biz.impl;import com.ycxw.biz.OrderBiz;
import com.ycxw.mapper.OrderMapper;
import com.ycxw.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-26 16:46*/
@Service
public class OrderBizImpl implements OrderBiz {@Autowiredprivate OrderMapper orderMapper;@Overridepublic OrderVo SelectByOid(Integer oid) {return orderMapper.SelectByOid(oid);}
}

2.6 Junit测试

package com.ycxw.biz.impl;import com.ycxw.biz.OrderBiz;
import com.ycxw.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 blog.csdn.net/Justw320* @create 2023-08-26 16:48*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-mybatis.xml"})
public class OrderBizImplTest {@Autowiredprivate OrderBiz orderBiz;@Testpublic void selectByOid() {OrderVo orderVo = orderBiz.SelectByOid(8);//获取订单System.out.println(orderVo);//获取订单项信息orderVo.getOrderItems().forEach(System.out::println);}}

运行结果:

三、多对多映射(Many-to-Many)

3.1 表关系

        多对多映射是指多个对象与多个对象具有多对多的关系。表之间的多对多关系稍微复杂,需要一个中间表来表示:

        中间表有三个字段,其中两个字段分别作为外键指向各自一方的主键,由此通过中间表来表示多对多关系,通过一个表联合另一个中间表可以表示为一对多关系。

 

 如:根据书籍id查找关联属性类别:

3.2 创建实体

利用mybatis逆向工程(generatorConfig.xml)生成模型层代码 :

 

创建 HBookVo 值对象(Value Object)

package com.ycxw.vo;import com.ycxw.model.BookCategory;
import com.ycxw.model.HBook;
import lombok.Data;import java.util.List;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-27 21:03*/
@Data
public class HBookVo extends HBook {private List<BookCategory> bookc = new ArrayList<>();
}

3.3 处理映射关系、定义sql

  <resultMap id="HBookVoMap" type="com.ycxw.vo.HBookVo" ><result column="book_id" property="bookId"></result><result column="book_name" property="bookName"></result><result column="price" property="price"></result><collection property="bookc" ofType="com.ycxw.model.Category"><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*FROMt_hibernate_book b,t_hibernate_category c,t_hibernate_book_category bcWHEREb.book_id = bc.bidAND c.category_id = bc.bcidAND b.book_id = #{bid}</select>

3.4 HBookMapper 接口

HBookVo selectByBookId(@Param("bid") Integer bid);

3.5 编写业务逻辑层

HBookBiz 接口
package com.ycxw.biz;import com.ycxw.vo.HBookVo;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-29 12:47*/
public interface HBookBiz {HBookVo selectByBookId(Integer bid);
}
HBookBizImpl 接口实现类
package com.ycxw.biz.impl;import com.ycxw.biz.HBookBiz;
import com.ycxw.mapper.HBookMapper;
import com.ycxw.vo.HBookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-29 12:48*/
@Service
public class HBookBizImpl implements HBookBiz {@Autowiredprivate HBookMapper hBookMapper;@Overridepublic HBookVo selectByBookId(Integer bid) {return hBookMapper.selectByBookId(bid);}
}

3.6 Junit测试

package com.ycxw.biz.impl;import com.ycxw.biz.HBookBiz;
import com.ycxw.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 blog.csdn.net/Justw320* @create 2023-08-26 16:48*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-mybatis.xml"})
public class OrderBizImplTest {@Autowiredprivate HBookBiz hBookBiz;@Testpublic void selectByBookId(){HBookVo hBookVo = hBookBiz.selectByBookId(22);//数据所有信息System.out.println(hBookVo);//书籍有关的类别System.out.println(hBookVo.getBookc());}
}

 反之亦然,如:根据类别id查找书籍信息

 <resultMap id="CategotyVoMap" type="com.ycxw.vo.CategoryVo"><result column="category_id" property="categoryId"></result><result column="category_name" property="categoryName"></result><collection property="books" ofType="com.ycxw.model.HBook"><result column="book_id" property="bookId"></result><result column="book_name" property="bookName"></result><result column="price" property="price"></result></collection></resultMap><select id="selectCategoryId" resultMap="CategotyVoMap" parameterType="java.lang.Integer">SELECT*FROMt_hibernate_book b,t_hibernate_category c,t_hibernate_book_category bcWHEREb.book_id = bc.bidAND c.category_id = bc.bcidAND c.category_id = #{cid}</select>

测试运行:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/57940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot异步方法支持注解@Async应用

SpringBoot异步方法支持注解Async应用 1.为什么需要异步方法&#xff1f; 合理使用异步方法可以有效的提高执行效率 同步执行(同在一个线程中): 异步执行(开启额外线程来执行): 2.SpringBoot中的异步方法支持 在SpringBoot中并不需要我们自己去创建维护线程或者线程池来…

权限提升-数据库提权-MSF-UDF提权

权限提升基础信息 1、具体有哪些权限需要我们了解掌握的&#xff1f; 后台权限&#xff0c;网站权限&#xff0c;数据库权限&#xff0c;接口权限&#xff0c;系统权限&#xff0c;域控权限等 2、以上常见权限获取方法简要归类说明&#xff1f; 后台权限&#xff1a;SQL注入,数…

Linux 查看当前文件夹下的文件大小

1.直接查看: ll 或者 ls -la #查看文件大小&#xff0c;以kb为单位 ll#查看文件大小&#xff0c;包含隐藏的文件&#xff0c;以kb为单位 ls -la2.以 M 或者 G 为单位查看&#xff0c;根据文件实际大小进行合适的单位展示 du -sh *

5V升压充电8.4V管理IC

在我们小家电设计当中USB口的5V输入升压到8.4V输出&#xff0c;使用一颗SOP8的升压充电芯片&#xff0c;直接升压到8.4V.电流在1A左右。2&#xff0c;USB输入&#xff0c;5V升压8.4V&#xff0c;充电1A&#xff0c;内含专门的双节锂电池充电管理逻辑和LED指示灯&#xff0c;我们…

微信小程序路由以及跳转页面传递参数

路由 在app.json的pages里面写 "pages/页面/页面" 直接保存pages直接生成非常方便 跳转页面 wx.navigateTo() 保留当前页面&#xff0c;跳转到应用内的某个非tabBar页面。 <text bindtap"daka">点击</text> daka:function () {wx.navigateTo…

QT概括-Rainy

Qt 虽然经常被当做一个 GUI 库&#xff0c;用来开发图形界面应用程序&#xff0c;但这并不是 Qt 的全部&#xff1b;Qt 除了可以绘制漂亮的界面&#xff08;包括控件、布局、交互&#xff09;&#xff0c;还包含很多其它功能&#xff0c;比如多线程、访问数据库、图像处理、音频…

C++笔记之静态成员函数可以在类外部访问私有构造函数吗?

C笔记之静态成员函数可以在类外部访问私有构造函数吗&#xff1f; 参考笔记&#xff1a; 1.C笔记之静态成员函数可以在类外部访问私有构造函数吗&#xff1f; 2.C笔记之设计模式&#xff1a;setter函数、依赖注入 3.C笔记之两个类的实例之间传递参数——通过构造函数传递类对象…

Java 电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展

营造全面规范安全的电子招投标环境&#xff0c;促进招投标市场健康可持续发展 传统采购模式面临的挑战 一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标…

成功通过技术面试的策略:程序员必备指南

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

企业电子招标采购系统源码java 版本 Spring Cloud + Spring Boot

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…

Unity创建一个可移动的2D角色

文章目录 创建角色与场景创建地面 角色控制脚本检测地面 运行结果 创建角色与场景 我们首先创建一个角色&#xff0c;这里我新建了一个胶囊体用来当Player&#xff0c;一个Square用来当地面。 接下来&#xff0c;为角色增加碰撞体和刚体&#xff0c;为地面增加碰撞体。然后我…

WebDAV之π-Disk派盘 + 小象记账

小象记账是一款非常干净便捷的手机记账软件,这款软件的界面非常的简洁,整体以大面积的背景色、文字与符号的黑灰色为主,非常的简约,而且它的字体采用的是幼圆类字体并提高了字重,与整体的设计风格交相呼应,不仅提升了文字可读性还减少了用户的视觉疲劳。除了出色的外表之…

爬虫逆向实战(二十四)--某鸟记录中心

一、数据接口分析 主页地址&#xff1a;某鸟记录中心 1、抓包 通过抓包可以发现数据接口是front/record/search/page 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现&#xff0c;请求参数是加密的 请求头是否加密&#xff1f; 通过查…

安装虚拟机

软硬件准备 软件&#xff1a;推荐使用VMwear&#xff0c;我用的是VMwear 12 镜像&#xff1a;CentOS7 ,如果没有镜像可以在官网下载 &#xff1a;http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1804.iso 硬件&#xff1a;因为是在宿主机上运行虚拟…

RabbitMQ集群搭建和测试总结_亲测

RabbiMQ简介 RabbitMQ是用Erlang开发的&#xff0c;集群非常方便&#xff0c;因为Erlang天生就是一门分布式语言&#xff0c;但其本身并不支持负载均衡。 RabbitMQ模式 RabbitMQ模式大概分为以下三种: (1)单一模式。 (2)普通模式(默认的集群模式)。 (3)镜像模式(把需要的队列…

工厂生产作业流程合规检测

工厂生产作业流程合规检测系统通过yolov7网络模型算法&#xff0c;工厂生产作业流程合规检测对作业人员的操作行为进行全面监测&#xff0c;通过图像识别算法和数据分析&#xff0c;对人员的操作动作、工具使用、安全防护等方面进行检测和评估&#xff0c;能够实时监测工人的操…

Verilog 实现超声波测距

Verilog 实现超声波测距 教学视频&#xff1a; https://www.bilibili.com/video/BV1Ve411x75W?p33&spm_id_frompageDriver&vd_source19ae31dff4056e52d2729a4ca212602b 超声波测距原理 参考资料&#xff1a;STM32的超声波测距程序_超声波测距stm32程序_VaderZhang的…

Python工具箱系列(四十一)

使用zip批量压缩文件 前文的代码示例了使用gzip对单个文件进行压缩。本文示例使用更通用的zipfile来批量压缩文件。zipfile也是python内置的库&#xff0c;使用起来非常方便。废话不说&#xff0c;直接上代码示例。 import dbm import glob import zipfile# 保存压缩计划的库名…

AtCoder Beginner Contest 317(D-G)

D - President (atcoder.jp) &#xff08;1&#xff09;题目大意 &#xff08;2&#xff09;解题思路 考虑到z最大不超过1e5&#xff0c;N最多不超过100&#xff0c;因此可以考虑用背包来写&#xff0c;dp[j]表示拿高桥拿j分最少需要花费多少个选民转换&#xff0c;最后把答案取…

防御网络攻击风险的4个步骤

如今&#xff0c;人们正在做大量工作来保护 IT 系统免受网络犯罪的侵害。令人担忧的是&#xff0c;对于运营技术系统来说&#xff0c;情况却并非如此&#xff0c;运营技术系统用于运行从工厂到石油管道再到发电厂的所有业务。 组织应该强化其网络安全策略&#xff0c;因为针对…