当前位置: 首页 > news >正文

实验四:MyBatis 的关联映射

目录:

一 、实验目的:

熟练掌握实体之间的各种映射关系。

二 、预习要求:

预习数据库原理中所讲过的一对一、一对多和多对多关系

三、实验内容:

1. 查询所有订单信息,关联查询下单用户信息(注意:因为一个订单信息只会是一个人 下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。

如果从用户信息 出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。)

2. 查询所有用户信息及用户关联的订单信息(用户信息和订单信息为一对多关系)。

四、实验方法和步骤:

实验前准备:

创建数据库,user表,order表

CREATE DATABASE experience03;
USE experience03;DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (`id` int(0) NOT NULL AUTO_INCREMENT,`username` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,`birthday` date NULL DEFAULT NULL,`sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`address` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ;INSERT INTO `user` VALUES (1, '关羽', '2024-09-29', '男', '蜀国');
INSERT INTO `user` VALUES (2, '梁王孙', '2024-09-11', '男', '北京市');
INSERT INTO `user` VALUES (3, '陈长生', '2024-05-14', '女', '京都西庙');
INSERT INTO `user` VALUES (4, '王婆', '2024-09-05', '女', '快远');
INSERT INTO `user` VALUES (5, '黄忠', '2016-07-24', '1', '三国');
INSERT INTO `user` VALUES (6, '张飞', '2024-10-16', '女', '三国');
INSERT INTO `user` VALUES (7, 'lucky', '2021-10-08', '男', '三国');
INSERT INTO `user` VALUES (14, '关羽', '2024-12-02', '男', '蜀国');

创建User:

package com.hasut.pojo;import java.util.Date;public class User {private int id;private String username;private Date birthday;private String sex;private String address;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", birthday=" + birthday +", sex='" + sex + '\'' +", address='" + address + '\'' +'}';}
}

创建Order:

package com.hasut.pojo;import java.util.Date;public class Order {private int id;private String number;private Date createtime;private String note;private User user;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public Date getCreatetime() {return createtime;}public void setCreatetime(Date createtime) {this.createtime = createtime;}public String getNote() {return note;}public void setNote(String note) {this.note = note;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}@Overridepublic String toString() {return "Order{" +"id=" + id +", number='" + number + '\'' +", createtime=" + createtime +", note='" + note + '\'' +", user=" + user +'}';}
}

1. 查询所有订单信息(从订单出发一对一

关联查询下单用户信息(注意:因为一个订单信息只会是一个人 下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。

如果从用户信息 出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。)

sql 语句:

SELECT o.id, o.user_id userId, o.number, o.createtime, o.note, u.username, u.address FROM `order` o LEFT JOIN `user` u ON o.user_id = u.id

或者:

SELECT o.id, o.number,o.createtime,o.note,o.userId,u.username,u.birthday,u.sex,u.address
FROM `user` u, `order` o
WHERE u.id = o.userId

使用 resultMap,使用 resultMap,定义专门的 resultMap 用于映射一对一查询结 果。

①改造 pojo 类 在 Order 类中加入 User 属性,user 属性中用于存储关联查询的用户信息,因为订单关 联查询用户是一对一关系,所以这里使用单个 User 对象存储关联查询的用户信息。改造

Order 如下图:

package com.hasut.pojo;import java.util.Date;public class Order {private int id;private String number;private Date createtime;private String note;private User user;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public Date getCreatetime() {return createtime;}public void setCreatetime(Date createtime) {this.createtime = createtime;}public String getNote() {return note;}public void setNote(String note) {this.note = note;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}@Overridepublic String toString() {return "Order{" +"id=" + id +", number='" + number + '\'' +", createtime=" + createtime +", note='" + note + '\'' +", user=" + user +'}';}
}

②Mapper.xml 这里 resultMap 指定 orderUserResultMap,如下:

<resultMap id="findOrderWithUserResultMap" type="com.haust.pojo.Orders"><id property="id" column="id"/><result property="number" column="number"/><result property="createtime" column="createtime"/><result property="note" column="note"/><association property="user" javaType="User"><id property="id" column="id"/><result property="username" column="username"/><result property="birthday" column="birthday"/><result property="sex" column="sex"/><result property="address" column="address"/></association></resultMap><select id="findOrderAndUserById" parameterType="int" resultMap="findOrderWithUserResultMap">SELECT o.id, o.number,o.createtime,o.note,o.userId,u.username,u.birthday,u.sex,u.addressFROM `user` u, `order` oWHERE u.id = o.userId</select>

③Mapper 接口

编写 UserMapper 如下图:

List<Orders> findOrderAndUserById(int id);

④测试方法

@Testpublic void test09() throws IOException {String resources = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resources);SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);List<Orders> list = ordersMapper.findOrderAndUserById(1);for (Orders o : list){System.out.println(list);}sqlSession.commit();sqlSession.close();}

⑤实验效果

测试效果如下图:

2. 查询所有用户信息及用户关联的订单信息(从用户出发,为一对多关系)。

用户信息和订单信息为一对多关系

sql 语句:

SELECT u.id, u.username, u.birthday, u.sex, u.address, o.id oid, o.number, o.createtime, o.note FROM `user` u LEFT JOIN `order` o ON u.id = o.user_id

SELECT u.id,u.username,u.birthday,u.sex,u.address,o.id oid,o.number,o.createtime,o.note
FROM `user` u, `order` o
WHERE u.id = o.userId

①修改 pojo 类

在 User 类中加入 List orders 属性,如下图:

package com.haust.pojo;import java.util.Date;
import java.util.List;public class User {private int id;private String username;private Date birthday;private String sex;private String address;private List<Orders> ordersList;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public List<Orders> getOrdersList() {return ordersList;}public void setOrdersList(List<Orders> ordersList) {this.ordersList = ordersList;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", birthday=" + birthday +", sex='" + sex + '\'' +", address='" + address + '\'' +", ordersList=" + ordersList +'}';}
}

②UserMapper.xml

在 UserMapper.xml 添加 sql,如下:

<?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.haust.mapper.UserMapper"><resultMap id="findOrderWithUserResultMap2" type="com.haust.pojo.User"><id property="id" column="id"/><result property="username" column="username"/><result property="birthday" column="birthday"/><result property="sex" column="sex"/><result property="address" column="address"/><collection property="ordersList" ofType="com.haust.pojo.Orders"><id property="id" column="id"/><result property="number" column="number"/><result property="createtime" column="createtime"/><result property="note" column="note"/></collection></resultMap><select id="findOrderAndUserById2" parameterType="int" resultMap="findOrderWithUserResultMap2">SELECT u.id,u.username,u.birthday,u.sex,u.address,o.id oid,o.number,o.createtime,o.noteFROM `user` u, `order` oWHERE u.id = o.userIdand u.id = #{id}</select>
</mapper>

③Mapper 接口

编写 UserMapper 接口,如下图:

public interface UserMapper {List<User> findOrderAndUserById2(int id);
}

④测试方法

在 UserMapperTest 增加测试方法,如下

@Testpublic void test10() throws IOException {String resources = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resources);SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> list = userMapper.findOrderAndUserById2(2);for (User o : list){System.out.println(o);}sqlSession.commit();sqlSession.close();}

⑤效果

测试效果如下图:

http://www.lryc.cn/news/497393.html

相关文章:

  • 【Leetcode】189.轮转数组
  • 【JavaSE】常见面试问题
  • 【超详图文】多少样本量用 t分布 OR 正态分布
  • leetcode hot100【Leetcode 416.分割等和子集】java实现
  • 《算法导论》英文版前言To the teacher第4段研习录:有答案不让用
  • Laravel关联模型查询
  • Clickhouse 数据类型
  • 物联网智能项目如何实现设备高效互联与数据处理?
  • 【云服务器】搭建博客服务
  • 如何抽象策略模式
  • BERT模型的输出格式探究以及提取出BERT 模型的CLS表示,last_hidden_state[:, 0, :]用于提取每个句子的CLS向量表示
  • node.js实现分页,jwt鉴权机制,token,cookie和session的区别
  • 34 基于单片机的指纹打卡系统
  • 【Linux】用户操作命令
  • Y20030018基于Java+Springboot+mysql+jsp+layui的家政服务系统的设计与实现 源代码 文档
  • windows部署PaddleSpeech详细教程
  • 线程条件变量 生产者消费者模型 Linux环境 C语言实现
  • C++ packaged_task
  • 【联表查询】.NET开源 ORM 框架 SqlSugar 系列
  • 嵌入式C编程:宏定义与typedef的深入对比与应用
  • 高级java每日一道面试题-2024年12月03日-JVM篇-什么是Stop The World? 什么是OopMap? 什么是安全点?
  • 【openGauss︱PostgreSQL】openGauss或PostgreSQL查表、索引、序列、权限、函数
  • Dataset用load_dataset读图片和对应的caption的一个坑
  • 【信息系统项目管理师】第7章:项目立项管理 考点梳理
  • 知识库、提示词对大语言模型的影响测试
  • vistat-监控和分析网络状态
  • EasyAnimateV5 视频生成大模型原理详解与模型使用
  • 水稻和拟南芥生命周期中单碱基分辨率的m6A定量分析-文献精读88
  • 学习threejs,使用canvas更新纹理
  • 【笔记2-3】ESP32 bug:PSRAM chip not found or not supported 没有外部PSRAM问题解决