MyBatis 的多对一,一对多以及多对多的增删改查的xml映射语句

1. 多对一(Many-to-One)

表结构
  • users

    • id (INT, 主键)
    • username (VARCHAR)
    • password (VARCHAR)
    • email (VARCHAR)
    • department_id (INT, 外键)
    • created_at (TIMESTAMP)
  • departments

    • id (INT, 主键)
    • name (VARCHAR)
    • created_at (TIMESTAMP)
实体类
public class User {private int id;private String username;private String password;private String email;private Department department;private Timestamp createdAt;// Getters and Setters
}public class Department {private int id;private String name;private Timestamp createdAt;// Getters and Setters
}
映射文件 UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.mapper.UserMapper"><!-- 插入用户 --><insert id="insertUser" parameterType="com.example.entity.User">INSERT INTO users (username, password, email, department_id, created_at) VALUES (#{username}, #{password}, #{email}, #{department.id}, NOW())</insert><!-- 更新用户信息 --><update id="updateUser" parameterType="com.example.entity.User">UPDATE users SET username = #{username}, password = #{password}, email = #{email}, department_id = #{department.id} WHERE id = #{id}</update><!-- 删除用户 --><delete id="deleteUser" parameterType="int">DELETE FROM users WHERE id = #{id}</delete><!-- 根据ID查询用户及其部门 --><select id="selectUserByIdWithDepartment" resultMap="UserAndDepartmentResultMap">SELECT u.*, d.id AS departmentId, d.name, d.created_at AS departmentCreatedAtFROM users uLEFT JOIN departments d ON u.department_id = d.idWHERE u.id = #{id}</select><!-- 在 MyBatis 中,parameterType 是可选的。如果你只有一个参数传递给 SQL 语句,MyBatis 会自动推断参数类型。因此,即使不显式指定 parameterType,MyBatis 也能正确处理参数。 --><!-- 查询所有用户及其部门 --><select id="selectAllUsersWithDepartment" resultMap="UserAndDepartmentResultMap">SELECT u.*, d.id AS departmentId, d.name, d.created_at AS departmentCreatedAtFROM users uLEFT JOIN departments d ON u.department_id = d.id</select><!-- 嵌套结果映射 --><resultMap id="UserAndDepartmentResultMap" type="com.example.entity.User"><id property="id" column="id"/><result property="username" column="username"/><result property="password" column="password"/><result property="email" column="email"/><result property="createdAt" column="created_at"/><association property="department" javaType="com.example.entity.Department"><id property="id" column="departmentId"/><result property="name" column="name"/><result property="createdAt" column="departmentCreatedAt"/></association></resultMap></mapper>

详细解释

    多对一(Many-to-One)
  • insertUser:插入用户信息。department_id 是外键,指向 departments 表的 id
  • updateUser:更新用户信息。department_id 可以更改。
  • deleteUser:删除用户。
  • selectUserByIdWithDepartment:根据用户ID查询用户及其部门。使用 LEFT JOIN 将 users 表和 departments 表连接起来。
  • selectAllUsersWithDepartment:查询所有用户及其部门。
  • resultMap:定义了 User 对象及其 department 属性的映射关系。使用 <association> 标签来映射单个对象。

2. 一对多(One-to-Many)

表结构
  • users

    • id (INT, 主键)
    • username (VARCHAR)
    • password (VARCHAR)
    • email (VARCHAR)
    • created_at (TIMESTAMP)
  • orders

    • id (INT, 主键)
    • user_id (INT, 外键)
    • product_name (VARCHAR)
    • quantity (INT)
    • price (DECIMAL)
    • created_at (TIMESTAMP)
实体类
public class User {private int id;private String username;private String password;private String email;private Timestamp createdAt;private List<Order> orders;// Getters and Setters
}public class Order {private int id;private int userId;private String productName;private int quantity;private BigDecimal price;private Timestamp createdAt;// Getters and Setters
}
映射文件 UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.mapper.UserMapper"><!-- 插入用户 --><insert id="insertUser" parameterType="com.example.entity.User">INSERT INTO users (username, password, email, created_at) VALUES (#{username}, #{password}, #{email}, NOW())</insert><!-- 插入订单 --><insert id="insertOrder" parameterType="com.example.entity.Order">INSERT INTO orders (user_id, product_name, quantity, price, created_at) VALUES (#{userId}, #{productName}, #{quantity}, #{price}, NOW())</insert><!-- 更新用户信息 --><update id="updateUser" parameterType="com.example.entity.User">UPDATE users SET username = #{username}, password = #{password}, email = #{email} WHERE id = #{id}</update><!-- 更新订单信息 --><update id="updateOrder" parameterType="com.example.entity.Order">UPDATE orders SET product_name = #{productName}, quantity = #{quantity}, price = #{price} WHERE id = #{id}</update><!-- 删除用户 --><delete id="deleteUser" parameterType="int">DELETE FROM users WHERE id = #{id}</delete><!-- 删除订单 --><delete id="deleteOrder" parameterType="int">DELETE FROM orders WHERE id = #{id}</delete><!-- 在 MyBatis 中,parameterType 是可选的。如果你只有一个参数传递给 SQL 语句,MyBatis 会自动推断参数类型。因此,即使不显式指定 parameterType,MyBatis 也能正确处理参数。 --><!-- 根据ID查询用户及其订单 --><select id="selectUserByIdWithOrders" resultMap="UserAndOrdersResultMap">SELECT u.*, o.id AS orderId, o.product_name, o.quantity, o.price, o.created_at AS orderCreatedAtFROM users uLEFT JOIN orders o ON u.id = o.user_idWHERE u.id = #{id}</select><!-- 查询所有用户及其订单 --><select id="selectAllUsersWithOrders" resultMap="UserAndOrdersResultMap">SELECT u.*, o.id AS orderId, o.product_name, o.quantity, o.price, o.created_at AS orderCreatedAtFROM users uLEFT JOIN orders o ON u.id = o.user_id</select><!-- 嵌套结果映射 --><resultMap id="UserAndOrdersResultMap" type="com.example.entity.User"><id property="id" column="id"/><result property="username" column="username"/><result property="password" column="password"/><result property="email" column="email"/><result property="createdAt" column="created_at"/><collection property="orders" ofType="com.example.entity.Order"><id property="id" column="orderId"/><result property="userId" column="id"/><result property="productName" column="product_name"/><result property="quantity" column="quantity"/><result property="price" column="price"/><result property="createdAt" column="orderCreatedAt"/></collection></resultMap></mapper>

详细解释

    一对多(One-to-Many)
  • insertUser:插入用户信息。
  • insertOrder:插入订单信息。user_id 是外键,指向 users 表的 id
  • updateUser:更新用户信息。
  • updateOrder:更新订单信息。
  • deleteUser:删除用户。
  • deleteOrder:删除订单。
  • selectUserByIdWithOrders:根据用户ID查询用户及其订单。使用 LEFT JOIN 将 users 表和 orders 表连接起来。
  • selectAllUsersWithOrders:查询所有用户及其订单。
  • resultMap:定义了 User 对象及其 orders 列表的映射关系。使用 <collection> 标签来映射集合属性。

3. 多对多(Many-to-Many)

表结构
  • users

    • id (INT, 主键)
    • username (VARCHAR)
    • password (VARCHAR)
    • email (VARCHAR)
    • created_at (TIMESTAMP)
  • roles

    • id (INT, 主键)
    • name (VARCHAR)
    • created_at (TIMESTAMP)
  • user_roles

    • user_id (INT, 外键)
    • role_id (INT, 外键)
实体类
public class User {private int id;private String username;private String password;private String email;private Timestamp createdAt;private List<Role> roles;// Getters and Setters
}public class Role {private int id;private String name;private Timestamp createdAt;// Getters and Setters
}
映射文件 UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.mapper.UserMapper"><!-- 插入用户 --><insert id="insertUser" parameterType="com.example.entity.User">INSERT INTO users (username, password, email, created_at) VALUES (#{username}, #{password}, #{email}, NOW())</insert><!-- 插入角色 --><insert id="insertRole" parameterType="com.example.entity.Role">INSERT INTO roles (name, created_at) VALUES (#{name}, NOW())</insert><!-- 插入用户角色关系 --><insert id="insertUserRole" parameterType="map">INSERT INTO user_roles (user_id, role_id) VALUES (#{userId}, #{roleId})</insert><!-- 更新用户信息 --><update id="updateUser" parameterType="com.example.entity.User">UPDATE users SET username = #{username}, password = #{password}, email = #{email} WHERE id = #{id}</update><!-- 更新角色信息 --><update id="updateRole" parameterType="com.example.entity.Role">UPDATE roles SET name = #{name} WHERE id = #{id}</update><!-- 删除用户 --><delete id="deleteUser" parameterType="int">DELETE FROM users WHERE id = #{id}</delete><!-- 删除角色 --><delete id="deleteRole" parameterType="int">DELETE FROM roles WHERE id = #{id}</delete><!-- 删除用户角色关系 --><delete id="deleteUserRole" parameterType="map">DELETE FROM user_roles WHERE user_id = #{userId} AND role_id = #{roleId}</delete><!-- 在 MyBatis 中,parameterType 是可选的。如果你只有一个参数传递给 SQL 语句,MyBatis 会自动推断参数类型。因此,即使不显式指定 parameterType,MyBatis 也能正确处理参数。 --><!-- 根据ID查询用户及其角色 --><select id="selectUserByIdWithRoles" resultMap="UserAndRolesResultMap">SELECT u.*, r.id AS roleId, r.name, r.created_at AS roleCreatedAtFROM users uLEFT JOIN user_roles ur ON u.id = ur.user_idLEFT JOIN roles r ON ur.role_id = r.idWHERE u.id = #{id}</select><!-- 查询所有用户及其角色 --><select id="selectAllUsersWithRoles" resultMap="UserAndRolesResultMap">SELECT u.*, r.id AS roleId, r.name, r.created_at AS roleCreatedAtFROM users uLEFT JOIN user_roles ur ON u.id = ur.user_idLEFT JOIN roles r ON ur.role_id = r.id</select><!-- 嵌套结果映射 --><resultMap id="UserAndRolesResultMap" type="com.example.entity.User"><id property="id" column="id"/><result property="username" column="username"/><result property="password" column="password"/><result property="email" column="email"/><result property="createdAt" column="created_at"/><collection property="roles" ofType="com.example.entity.Role"><id property="id" column="roleId"/><result property="name" column="name"/><result property="createdAt" column="roleCreatedAt"/></collection></resultMap></mapper>

详细解释

    多对多(Many-to-Many)
  • insertUser:插入用户信息。
  • insertRole:插入角色信息。
  • insertUserRole:插入用户角色关系。user_id 和 role_id 分别是外键,指向 users 表和 roles 表的 id
  • updateUser:更新用户信息。
  • updateRole:更新角色信息。
  • deleteUser:删除用户。
  • deleteRole:删除角色。
  • deleteUserRole:删除用户角色关系。
  • selectUserByIdWithRoles:根据用户ID查询用户及其角色。使用 LEFT JOIN 将 users 表、user_roles 表和 roles 表连接起来。
  • selectAllUsersWithRoles:查询所有用户及其角色。
  • resultMap:定义了 User 对象及其 roles 列表的映射关系。使用 <collection> 标签来映射集合属性。

配置文件

要使上述映射文件生效,你需要在 MyBatis 的配置文件(如 mybatis-config.xml)中引用它:

<configuration><mappers><mapper resource="mappers/UserMapper.xml"/></mappers>
</configuration>

接口定义

UserMapper.java 接口中定义相应的方法:

package com.example.mapper;import com.example.entity.User;
import com.example.entity.Role;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.util.List;
import java.util.Map;@Mapper
public interface UserMapper {void insertUser(User user);void insertRole(Role role);void insertUserRole(@Param("userId") int userId, @Param("roleId") int roleId);void updateUser(User user);void updateRole(Role role);void deleteUser(int id);void deleteRole(int id);void deleteUserRole(@Param("userId") int userId, @Param("roleId") int roleId);User selectUserByIdWithDepartment(int id);List<User> selectAllUsersWithDepartment();User selectUserByIdWithOrders(int id);List<User> selectAllUsersWithOrders();User selectUserByIdWithRoles(int id);List<User> selectAllUsersWithRoles();
}

示例调用

在你的服务层或控制器中,可以通过 UserMapper 接口调用这些方法:

@Autowired
private UserMapper userMapper;public void createUserAndRole() {User user = new User();user.setUsername("john_doe");user.setPassword("secret");user.setEmail("john@example.com");userMapper.insertUser(user);Role role = new Role();role.setName("Admin");userMapper.insertRole(role);userMapper.insertUserRole(user.getId(), role.getId());
}public List<User> getUsersWithRoles() {return userMapper.selectAllUsersWithRoles();
}

注意事项:

         在 MyBatis 中,resultMapresultType 是两种不同的方式,用于将数据库查询结果映射到 Java 对象。

          resultType 是一个简单的属性,用于指定查询结果应该映射到的 Java 对象类型。MyBatis 会自动将查询结果的每一列映射到 Java 对象的属性上,前提是列名和属性名一致(或者通过别名匹配)。

           resultMap 是一个更强大的映射工具,用于定义如何将数据库查询结果映射到 Java 对象。它允许你定义复杂的映射逻辑,包括嵌套对象、集合、自定义映射规则等。

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

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

相关文章

麒麟部署一套mysql集群,使用ansible批量部署可以提高工作效率

一、 服务端和客户端同时配置kylin镜像 配置麒麟的yum源 rm -rf /etc/yum.repos.d/CentOS-Base.repo vim /etc/yum.repos.d/Kylin_aarch64.repo Copy 写入如下yum源 [ks10-adv-os] name = Kylin Linux Advanced Server 10 - Os baseurl = http://update.cs2c.com.cn:8080/…

解锁业务成功:大数据和 AI 如何协作以释放战略洞察

在当今这个数据主导的时代&#xff0c;大数据与AI的协同作用对于寻求竞争优势的组织而言愈发关键。大数据以其庞大的数据量、多样化的数据类型以及高速的数据生成能力&#xff0c;为AI算法提供了丰富的原材料&#xff0c;助力其挖掘出有价值的洞见&#xff0c;推动明智决策的制…

SSL/TLS,SSL,TLS分别是什么

SSL/TLS&#xff0c;SSL&#xff0c;TLS分别是什么 SSL&#xff08;Secure Sockets Layer&#xff0c;安全套接层&#xff09; 定义与发展历程&#xff1a; SSL 是一种早期的网络安全协议&#xff0c;旨在为网络通信提供保密性、数据完整性和身份验证等安全保障。它最初由网景…

LaTeX 利用注销 ccmap 宏包实现降重功能

在中文LaTeX中&#xff0c;ccmap 宏包的主要作用是支持复制和粘贴时正确处理中文字符的编码。它的功能对于生成的PDF文档尤其有用&#xff0c;使得PDF中的中文字符在被复制到其他地方时能够以正确的编码显示&#xff0c;而不是乱码或其他不正确的字符。 以下是ccmap的详细功能…

【人工智能】用Python和NLP工具构建文本摘要模型:使用NLTK和spaCy进行自然语言处理

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 文本摘要是自然语言处理(NLP)中的关键任务之一,广泛应用于新闻、博客、社交媒体和搜索引擎等场景。通过生成简洁而准确的文本摘要,我们可以大大提升信息处理效率。本文将探讨如何使用Python结合NLP工具…

24.UE5枚举,怪物分类,龙卷风技能

2-26 枚举、怪物分类、龙旋风技能、掉落概率_哔哩哔哩_bilibili 目录 1.枚举 1.1枚举类型的创建 1.2 将枚举类型绑定到怪物蓝图上 1.3枚举类型的使用 1.3.1创建新的掉落物 1.3.2更改怪物掉落逻辑 2.龙卷风技能 2.1输入映射 2.2龙卷风发射物的创建 2.3龙卷风伤害逻辑…

故障字故障码 简单介绍

一、故障字 1.1故障字的概念 故障字&#xff08;Fault Word&#xff09;是一种常用的技术术语&#xff0c;主要应用在工业控制、嵌入式系统和通信领域&#xff0c;用于表示系统状态或故障信息。它是一个以位为单位的编码方式&#xff0c;每个位&#xff08;bit&#xff09;对应…

CSS3_BFC(十二)

BFC MDN对BFC的解释&#xff1a;块格式化上下文&#xff08;Block Formating Context, BFC&#xff09;是web页面的可视CSS渲染的一部分&#xff0c;是块盒子的布局过程发生的区域&#xff0c;也是浮动元素与其他元素交互的区域。 1、开启BFC flow-root对内容的影响是最低的&am…

鸿蒙系统ubuntu开发环境搭建

在RISC-V等平台移植鸿蒙系统OpenHarmony&#xff0c;需要使用linux环境进行代码的编译&#xff0c;为兼顾日常办公需要&#xff0c;可采用WindowsUbuntu虚拟机的混合开发的环境&#xff0c;通过网络及文件夹共享&#xff0c;在主机和虚拟机之间共享文件数据。 工具准备&#x…

二叉树oj题解析

二叉树 二叉树的最近公共祖先什么是最近公共祖先&#xff1f;leetcode中求二叉树中最近公共祖先解题1.解题2. 根据二叉树创建字符串 二叉树的最近公共祖先 什么是最近公共祖先&#xff1f; 最近的公共祖先指的是这一棵树中两个节点中深度最大的且公共的祖先节点就是最近祖先节…

优先算法 —— 双指针系列 - 移动零

1. 移动零 题目链接&#xff1a; 283. 移动零 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/move-zeroes/description/ 2. 算法原理 其实像移动零这种类型的题目都有一个名字叫做数组划分&#xff08;数组分块&#xff09;&#xff0c;就是说先给一个…

C语言——数组逐元素操作练习

定义一个能容纳10个元素的整形数组a&#xff0c;从键盘读取9个整数存放到前9个数组元素中。 一. 从键盘读取一个整数n和位置p(0<p<8)&#xff0c;插入n到数组a中&#xff0c;插入位置&#xff1a;下标p。要求插入点及后续的数组元素都要后移动。 代码如下&#xff1a; …

对抗样本存在的原因

对抗样本存在的原因与深度学习模型的结构和训练机制密切相关&#xff0c;主要包括以下几个方面&#xff1a; 1. 模型的高维性和线性化行为 高维性&#xff1a;深度学习模型通常在高维空间中运行&#xff0c;而高维空间中的数据分布非常稀疏。微小的扰动在高维空间可能被放大&a…

【ArcGISPro】根据yaml构建原始Pro的conda环境

使用场景 我们不小心把原始arcgispro-py3的conda环境破坏了,我们就可以使用以下方法进行修复 查找文件 在arcgis目录下找到yaml文件 如果没找到请复制以下内容到新的yaml文件 channels: - esri - defaults dependencies: - anyio=4.2.0=py311haa95532_0 - appdirs=1.4.4=p…

Java将PDF保存为图片

将 PDF 文件转换为图片是常见的需求之一&#xff0c;特别是在需要将 PDF 内容以图像形式展示或处理时。其中最常用的是 Apache PDFBox。 使用 Apache PDFBox Apache PDFBox 是一个开源的 Java 库&#xff0c;可以用来处理 PDF 文档。它提供了将 PDF 页面转换为图像的功能。 …

解决IDEA报包不存在,但实际存在的问题

前言 最近在把一个亿老项目交割给同事&#xff0c;同事在导入项目运行时遇到IDEA报包不存在&#xff0c;但实际存在的问题&#xff0c;最终通过以下方式解决 现象 在IDEA里启动运行项目&#xff0c;报某个类有问题&#xff0c;引入的包不存在。 点击这个引入的包&#xff0c;可…

Benchmark是什么?有什么作用?实例——助理解

benchmark 1、概念2、实例&#xff1a;2.1 背景&#xff1a;2.2 示例&#xff1a;GLUE Benchmark2.3 模型与 Benchmark 的关系 3、总结 1、概念 在论文中&#xff0c;benchmark 通常是指用于评估模型性能的标准化测试集合或基准工具。它通过提供一组统一的数据集和任务&#x…

debian 如何进入root

debian root默认密码, 在Debian系统中&#xff0c;安装完成后&#xff0c;默认情况下root账户是没有密码的。 你可以通过以下步骤来设置或更改root密码&#xff1a; 1.打开终端。 2.输入 sudo passwd root 命令。 3.当提示输入新的root密码时&#xff0c;输入你想要的密码…

使用uniapp编写APP的文件上传

使用uniapp插件文件选择、文件上传组件&#xff08;图片&#xff0c;视频&#xff0c;文件等&#xff09; - DCloud 插件市场 实用效果&#xff1a; 缺陷是只能一个一个单独上传

图算法 | 3、图分析与数据科学

图分析(Graph Analytics)在本质上是对图数据的处理与分析&#xff0c;其过程可以概括为图计算。 而图计算的范畴不仅包含数据的计算或分析&#xff0c;还包含元数据管理、模式管理、数据建模、数据清洗、转换、加载、治理、图分析与计算等一系列操作。 或许我们用大数据生命周…