SSM框架之MyBatis(二)--多表查询及查询结果映射

2023-11-18

使用MyBatis这一强大的框架可以解决很多赋值的问题,其中对于子配置文件中的小细节有很多需要注意的地方,使用这个框架后主要就是对于配置文件的编写和配置。
今天我写了一个多表查询,表的基本结构如下:
用户表t_user:用户编号uid,账号account,昵称nickname,性别gender
订单表t_order:订单编号oid,下单时间gen_time,总价total_price,用户编号user_id
订单详情表:详情编号id,订单编号order_id,商品编号product_id,下单数量amount
商品表:商品编号pid,商品名称pname,商品价格price,商品描述description
其中订单表user_id是外键对应用户表的uid;订单详情表的order_id,product_id分别对应订单表的oid和商品表的pid
程序中分别定义了四个实体来映射这四个表
查询语句是:

SELECT
	uid,
	account,
	nickname,
	gender,
	oid,
	gen_time,
	total_price,
	user_id,
	id,
	order_id,
	product_id,
	amount,
	pid,
	pname,
	price,
	description
FROM
	t_user
JOIN t_order ON t_user.uid = t_order.user_id
JOIN t_order_product ON t_order_product.order_id = t_order.oid
JOIN t_product ON t_product.pid = t_order_product.product_id
WHERE
	uid = 1

User类:

 

package cn.edu360.pojo;

import java.util.List;

public class User {
	private Long id;
	private String account;
	private String nickname;
	private String gender;
	private List<Order> orders;

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "[用户编号:" + id + ", 账号:" + account + ", 昵称:" + nickname + ", 性别:" + gender + ", 所下订单:"
				+ orders + "]";
	}

	/**
	 * @return the orders
	 */
	public List<Order> getOrders() {
		return orders;
	}

	/**
	 * @param orders
	 *            the orders to set
	 */
	public void setOrders(List<Order> orders) {
		this.orders = orders;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getAccount() {
		return account;
	}

	public void setAccount(String account) {
		this.account = account;
	}

	public String getNickname() {
		return nickname;
	}

	public void setNickname(String nickname) {
		this.nickname = nickname;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

}

Order类:

 

 

package cn.edu360.pojo;

import java.util.Date;
import java.util.List;

public class Order {
	private Long id;
	private Date genTime;
	private Double totalPrice;
	private Long userId;
	private List<Orderitems> orderitems;

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "订单详情 [订单号:" + id + ", 下单时间:" + genTime + ", 订单总价:" + totalPrice + ", 所含商品:" + orderitems + "]";
	}

	/**
	 * @return the orderitems
	 */
	public List<Orderitems> getOrderitems() {
		return orderitems;
	}

	/**
	 * @param orderitems
	 *            the orderitems to set
	 */
	public void setOrderitems(List<Orderitems> orderitems) {
		this.orderitems = orderitems;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Date getGenTime() {
		return genTime;
	}

	public void setGenTime(Date genTime) {
		this.genTime = genTime;
	}

	public Double getTotalPrice() {
		return totalPrice;
	}

	public void setTotalPrice(Double totalPrice) {
		this.totalPrice = totalPrice;
	}

	public Long getUserId() {
		return userId;
	}

	public void setUserId(Long userId) {
		this.userId = userId;
	}

}

Orderitems类:

 

 

package cn.edu360.pojo;

import java.util.List;

public class Orderitems {
	private Long id;
	private Long oid;
	private Long pid;
	private Long amount;
	private List<Product> product;

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "[数量:" + amount + product +"]" ;
	}

	/**
	 * @return the product
	 */
	public List<Product> getProduct() {
		return product;
	}

	/**
	 * @param product
	 *            the product to set
	 */
	public void setProduct(List<Product> product) {
		this.product = product;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Long getOid() {
		return oid;
	}

	public void setOid(Long oid) {
		this.oid = oid;
	}

	public Long getPid() {
		return pid;
	}

	public void setPid(Long pid) {
		this.pid = pid;
	}

	public Long getAmount() {
		return amount;
	}

	public void setAmount(Long amount) {
		this.amount = amount;
	}
}

Product类:

 

 

package cn.edu360.pojo;

public class Product {
	private Long id;
	private String name;
	private Double price;
	private String description;

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "[商品编号:" + id + ", 商品名称:" + name + ", 价格:" + price + ", 描述:" + description + "]";
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Double getPrice() {
		return price;
	}

	public void setPrice(Double price) {
		this.price = price;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

}

用户的实现接口,根据输入ID号查询当前用户的信息以及他的历史订单和订单里所包含的商品明细

 

 

package cn.edu360.mapper;

import cn.edu360.pojo.User;

public interface UserMapper {

	public User getByIdWithOrdersWithProducts(Long id);
}

用户接口的配置文件

 

 

<?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">
<mapper namespace="cn.edu360.mapper.UserMapper">
	<resultMap type="user" id="userOrderitemsResultMap">
		<id property="id" column="uid" />
		<result property="account" column="account" />
		<result property="nickname" column="nickname" />
		<result property="gender" column="gender" />
		<collection property="orders" ofType="Order">
			<id property="id" column="oid" />
			<result property="genTime" column="gen_time" />
			<result property="totalPrice" column="total_price" />
			<result property="userId" column="user_id" />
			<collection property="orderitems" ofType="Orderitems">
				<id property="id" column="id" />
				<result property="oid" column="order_id" />
				<result property="pid" column="product_id" />
				<result property="amount" column="amount" />
				<collection property="product" ofType="Product">
					<id property="id" column="pid" />
					<result property="name" column="pname" />
					<result property="price" column="price" />
					<result property="description" column="description" />
				</collection>
			</collection>
		</collection>
	</resultMap>
	<select id="getByIdWithOrdersWithProducts" resultMap="userOrderitemsResultMap"
		parameterType="long">
		SELECT
		uid,
		account,
		nickname,
		gender,
		oid,
		gen_time,
		total_price,
		user_id,
		id,
		order_id,
		product_id,
		amount,
		pid,
		pname,
		price,
		description
		FROM
		t_user
		JOIN t_order ON t_user.uid = t_order.user_id
		JOIN t_order_product ON t_order_product.order_id = t_order.oid
		JOIN t_product ON t_product.pid = t_order_product.product_id
		WHERE
		uid = 1
	</select>
</mapper>

核心配置文件

 

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<typeAliases>
		<typeAlias type="cn.edu360.pojo.User" alias="User"/>
		<typeAlias type="cn.edu360.pojo.Product" alias="Product"/>
		<typeAlias type="cn.edu360.pojo.Order" alias="Order"/>
		<typeAlias type="cn.edu360.pojo.Orderitems" alias="Orderitems"/>
	</typeAliases>

	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/storemybatis?characterEncoding=utf-8" />
				<property name="username" value="root" />
				<property name="password" value="12580" />
			</dataSource>
		</environment>
	</environments>
	<!--  <mappers>
		<mapper resource="ProductMapper.xml"/>
	</mappers>  -->
	<mappers>
		<package name="cn.edu360.mapper"/>
	</mappers>
</configuration>

JUnit测试方法:

 

 

package cn.edu360.mapper;

import java.io.IOException;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import cn.edu360.pojo.User;

public class UserMapperTest {

	private SqlSessionFactory sqlSessionFactory = null;
	
	@Before
	public void init() throws IOException {
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("SqlMapConfig.xml"));
	}

	@Test
	public void testGetByIdWithOrdersWithProducts() {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper userImpl = sqlSession.getMapper(UserMapper.class);
		User user = userImpl.getByIdWithOrdersWithProducts(1L);
		System.out.println(user);
		sqlSession.close();
	}

}

基本上面的就可以输出当前用户的信息和所有历史订单以及订单的商品详情。

ps:

个人小站点:四川耍耍网 重庆耍耍网 成都耍耍网 川渝耍耍网 四川论坛 重庆论坛 www.cysua.com

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

SSM框架之MyBatis(二)--多表查询及查询结果映射 的相关文章

随机推荐

  • 单片机时间戳转换

    看了网上的例程 大多繁琐 直接利用time h里的库函数进行转换即可 include
  • windows上传文件到ubuntu

    进入putty目录下 运行pscp 然后pscp 目标文件 Linux用户名 IP地址 目标文件夹 输入linux的登陆密码即可 more than one remote source not supported 出现这种情况是由空格导致的
  • Linux内核的编译、安装、调试

    这里写目录标题 编译安装内核 下载内核 安装依赖 更改 config 编译内核 安装 首先安装模块 安装内核 更改引导 更改 grub 重启 其他操作 清理内核源目录 卸载安装的内核 修改内核配置菜单实现对新加入内核源码的控制 常见问题 1
  • 8-13外部排序-败者树

    败者树是树形选择排序的一种变体 可视为一棵完全二叉树 通过败者树 可以在k个归并段中选出最小关键字所需要的关键字对比次数更少 绿色为叶子结点 存放初始数据 黑色为失败结点 蓝色为胜出结点 一 基本过程 以下按从小到大的方式构建 1 从8个归
  • Nor Flash,Nand Flash

    文章目录 1 Nor Flash 使用场景 2 Nand Flash 使用场景 3 读写速度对比 4 成本与容量 1 Nor Flash 使用场景 对于大多数应用较为简单的场景 比如 MCU 其内置的 Flash 就是使用的是 Nor Fl
  • python基础开发篇3——线上环境部署Django项目

    文章目录 一 基本了解 二 打包本地项目 三 服务器环境准备 四 安装web服务 4 1 使用uwsgi代理 4 2 使用nginx代理 推荐 五 部署daphne 一 基本了解 部署思路 Nginx服务接收浏览器的动态请求 再通过uwsg
  • 前端上传图片,Python后端接收

    前端代码 h1 Image Upload h1
  • 题目:洛谷1088 火星人(排列组合问题)

    题目描述 人类终于登上了火星的土地并且见到了神秘的火星人 人类和火星人都无法理解对方的语言 但是我们的科学家发明了一种用数字交流的方法 这种交流方法是这样的 首先 火星人把一个非常大的数字告诉人类科学家 科学家破解这个数字的含义后 再把一个
  • homework03

    1 编写一个程序来读入不指定个数的整数 然后决定已经读取的整数中有多少个正数和多少个负数 并计算这些输入值 不统计0 的总和 最终得出它们的平均值 这个程序以输入值0来结束 使用浮点数显示这个平均值 a 0 b 0 sum 0 count
  • Python之ML--机器学习分类算法

    Python之ML 机器学习分类算法 介绍最早以算法方式描述的分类机器学习算法 感知器 perceptron 和自适应线性神经元 adaptive linear neuron 我们将使用python循序渐进地实现一个感知器 并且通过训练使其
  • VSCode与PyCharm提示unresolved import解决方案

    问题描述 在VScode或者pyharm中采用python import自定义模块是 有时会显示unresolved import警告并且 无法跳转到自定义模块函数定义 出现问题的原因 没有安装import对应的模块 import的文件夹没
  • 使用STM32的TIMER进行外部计数

    使用ETR引脚的输入信号作为计数时钟 本例程使用Timer 2 其ETR输入引脚为PA1 该引脚工作模式为输 入模式 Timer的工作模式为从模式 另外使用PC6输出一模拟方波时钟信号 测试时将PC6与PA1短接 用户也可另外连接一个时钟信
  • 简述反射机制

    一 什么是反射 1 1 反射 所谓框架的灵魂 框架 半成品软件 可以在框架的基础上进行软件开发 简化代码 反射 将类的各个组成部分封装为其他对象 反射机制 简单来说反射就是在程序运行期间 动态的获取类或者对象中的属性 什么是动态获取 反射的
  • Swift语法学习--类(class)

    文章目录 类 初始化及实例 类的引用 reference 特征 类和结构体比较 类属性的set和get方法解析 类属性的willSet和didSet方法解析 类的下标 类方法和静态方法 将一个类的实例作为另一个类的属性 类的继承 父类在实例
  • MATLABdiag()用法

    1 提取矩阵的对角线元素 设A为m n矩阵 diag A 函数用于提取矩阵A主对角线元素 产生一个具有min m n 个元素的列向量 diag A k 提取矩阵A第k条对角线的元素 产生一个列向量 注意 矩阵的对角线 与主对角线平行 往上为
  • Unity核心5——Tilemap

    Tilemap 一般称之为瓦片地图或者平铺地图 是 Unity2017 中新增的功能 主要用于快速编辑 2D 游戏中的场景 通过复用资源的形式提升地图多样性 工作原理就是用一张张的小图排列组合为一张大地图 它和 SpriteShape 的异
  • android Scrollview里的内容不停留在顶部的问题

    先说明一下 任何一个页面都应该按照布局的先后顺序来显示 我这出现的问题就是 Scrollview里面嵌套Listview的头布局一进来看不见了 直接被Listview把焦点给抢了 最先显示的是Listview的item部分 直接上图 解决代
  • React中的“计算属性”

    React中的 计算属性 相信许多学习过vue的小伙伴对计算属性都不陌生吧 计算属性能帮我们数据进行一些计算操作 计算属性是依赖于data里面的数据的 在vue中只要计算属性依赖的data值发生改变 则计算属性就会调用 那React中也有计
  • gsaop 有头文件生成wsdl文件

    gsoap ns service name name area gsoap ns service style rpc gsoap ns service encoding encoded gsoap ns service namespace
  • SSM框架之MyBatis(二)--多表查询及查询结果映射

    使用MyBatis这一强大的框架可以解决很多赋值的问题 其中对于子配置文件中的小细节有很多需要注意的地方 使用这个框架后主要就是对于配置文件的编写和配置 今天我写了一个多表查询 表的基本结构如下 用户表t user 用户编号uid 账号ac