mabatis基于xml方式和注解方式实现多表查询

前面步骤

http://t.csdnimg.cn/IPXMY

1、解释

在数据库中,单表的操作是最简单的,但是在实际业务中最少也有十几张表,并且表与表之间常常相互间联系;

一对一、一对多、多对多是表与表之间的常见的关系。

  • 一对一:一张表A中的一条记录只能对应另一张表B中的一条记录另一张表B中的一条记录也只能对应一张表A中的一条记录。如:一个学生只能对应一张学生卡,一张学生卡只能对应一个学生,那么学生和学生卡就是一对一的关系;

  • 一对多:一张表A中的一条记录可以对应另一张表B中的多条记录另一张表B中的一条记录只能对应一张表A中的一条记录。如:一个班级对应多个学生,一个学生只能对应一个班级,所以班级表中的一条记录可以对应学生表的多条数据,学生表中的一条记录只能对应班级表的一条数据;

  • 多对多的意思是:一张表A中的一条记录可以对应另一张表B中的多条记录,另一张表B中的一条记录也可以对应一张表A中的多条记录。如:一个学生对应多个课程,一个课程对应多个学生。多对多需要设计三张表。比如这里出来学生表和课程表,还需要一张学生课程关联表。学生和课程的关系就存在课程表中。

2、操作

1、数据库中创建表格brand,并插入数据

DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(11) COLLATE utf8mb4_general_ci NOT NULL,`money` decimal(10,2) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;-- ----------------------------
-- Records of account
-- ----------------------------
INSERT INTO `account` VALUES ('1', 'messi', '1000.00');
INSERT INTO `account` VALUES ('2', 'pep', '1000.00');
select `position`,count(`position`) amount from users group by `position`select p.product_name productName,sum(p_r.quantity) prquantity,sum(s_r.quantity) srquantity from products p left join purchase_records p_r on p.product_id=p_r.product_id left join sales_records s_r on p.product_id=s_r.product_id where p.state=1 group by p.product_id 
order by srquantity desc limit 0,5;
DROP TABLE IF EXISTS `brand`;
CREATE TABLE `brand` (`brand_id` int NOT NULL AUTO_INCREMENT COMMENT '品牌编号',`brand_name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '品牌名称',`company_name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '所属公司名称',`brand_idea` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '品牌理念',PRIMARY KEY (`brand_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;-- ----------------------------
-- Records of brand
-- ----------------------------
INSERT INTO `brand` VALUES ('1', '华为手机', '华为技术有限公司', 'Make It Possible');
INSERT INTO `brand` VALUES ('2', '荣耀', '深圳市智信新信息技术有限公司', 'GO BEYOND');
INSERT INTO `brand` VALUES ('3', '红米', '小米科技有限责任公司', '不顾一切的热爱');

2、com.entity中创建实体类Brand  


@Data
public class Brand {//品牌编号private Integer brandId;//品牌名称private String brandName;//品牌所属公司private String companyName;//品牌理念private String brandIdea;//旗下手机列表private List<String> phoneList;
}

3、com.entity中修改实体类Phone

@Data
public class Phone {
//    手机编号private Integer phoneId;
//    品牌编号
//    private Integer brandId;//手机品牌private Brand brand;
//    手机型号private String modelNumber;
//    手机容量private Integer capacity;
}

4、实现查询手机信息及其所属品牌信息

xml方式:修改方法selectAll对应的xml

写法一:

<resultMap id="phoneMap" type="phone"><id column="phone_id" property="phoneId"></id><id column="model_number" property="modelNumber"></id><id column="capacity" property="capacity"></id><id column="brand_id" property="brand.brandId"></id><id column="brand_name" property="brand.brandName"></id><id column="company_name" property="brand.companyName"></id><id column="brand_idea" property="brand.brandIdea"></id></resultMap><select id="selectAll" resultMap="phoneMap">SELECT * FROM phone p,brand bwhere p.brand_id = b.brand_id</select>

 

写法二:

<resultMap id="phoneMap" type="phone"><id column="phone_id" property="phoneId"></id><id column="model_number" property="modelNumber"></id><id column="capacity" property="capacity"></id><!--        property:当前实体(Hero)中的属性名称(private Hero hero)--><!--        javaType:当前实体(Hero)中的属性类型(com.cqgcxy.entity.Hero)--><association property="brand" javaType="com.cqgcxy.entity.Brand"><id column="brand_id" property="brandId"></id><id column="brand_name" property="brandName"></id><id column="company_name" property="companyName"></id><id column="brand_idea" property="brandIdea"></id></association></resultMap><select id="selectAll" resultMap="phoneMap">SELECT * FROM phone p,brand bwhere p.brand_id = b.brand_id</select>

注解方式:  

注意:注解方式的mapper配置可以不用在配置mapper文件地址,而是只配置包的路径。

写法一:修改PhoneMapper接口中selectAll方法

@Select("SELECT * FROM phone p,brand b where p.brand_id = b.brand_id")@Results({@Result(column = "phone_id",property = "phoneId"),@Result(column = "model_number",property = "modelNumber"),@Result(column = "capacity",property = "capacity"),@Result(column = "brand_id",property = "brand.brandId"),@Result(column = "brand_name",property = "brand.brandName"),@Result(column = "company_name",property = "brand.companyName"),@Result(column = "brand_idea",property = "brand.brandIdea")})List<Phone> selectAll();

写法二:

创建并编写BrandMapper接口

public interface BrandMapper {@Select("SELECT * FROM brand WHERE brand_id = #{brandId}")Brand selectById(Long brandId);
}

修改PhoneMapper接口中selectAll方法

@Select("SELECT * FROM phone")
@Results({@Result(column = "phone_id",property = "phoneId"),@Result(column = "model_number",property = "modelNumber"),@Result(column = "capacity",property = "capacity"),@Result(column = "brand_id",property = "brand",javaType = Brand.class,one = @One(select="com.dao.BrandMapper.selectById"))
})
List<Phone> selectAll();

 

调用测试类中MybatisMapperTest中selectAllTest方法测试  

5、实现查询品牌信息及其旗下的手机信息

BrandMapper接口中添加抽象方法selectAll

List<Brand> selectAll();

xml方式:mapper文件夹中创建BrandMapper.xml并编写selectAll方法对应的sql

<?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="com.dao.BrandMapper"><resultMap id="brandMap" type="com.entity.Brand"><id column="brand_id" property="brandId"></id><result column="brand_name" property="brandName"></result><result column="company_name" property="companyName"></result><result column="brand_idea" property="brandIdea"></result><collection property="phoneList" ofType="com.entity.Phone"><result column="phone_id" property="phoneId"></result><result column="model_number" property="modelNumber"></result><result column="capacity" property="capacity"></result></collection></resultMap><select id="selectAll" resultMap="brandMap">SELECT * FROM brand b LEFT JOIN phone pON p.brand_id=b.brand_id</select>
</mapper>

测试

public class BrandMapperTest {@Testpublic void selectAll() throws IOException {InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqLSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession sqlsession = sqLSessionFactory.openSession();BrandMapper brandMapper = sqlsession.getMapper(BrandMapper.class);List<Brand> brands = brandMapper.selectAll();brands.forEach(s->{System.out.println(s);});sqlsession.close();}
}

 为了方便可以

注解方式:

修改PhoneMapper接口中添加selectByBrandId方法

@Select("SELECT * FROM phone WHERE brand_id = #{brandId}")Phone selectByBrandId(Integer brandId);

修改BrandMapper接口中selectAll方法  

    @Select("SELECT * FROM brand")@Results({@Result(column = "brand_id",property = "brandId"),@Result(column = "brand_name",property = "brandName"),@Result(column = "company_name",property = "companyName"),@Result(column = "brand_idea",property = "brandIdea"),@Result(column = "brand_id",property = "phoneList",javaType = List.class,many = @Many(select = "com.dao.PhoneMapper.selectByBrandId"))})List<Brand> selectAll();

运行出现

 

Mybatis注解方式:

@lnsert:实现新增

@Update:实现更新

@Delete:实现删除

@Select:实现查询

@Result:实现结果集封装

@Results:可以与@Result一起使用,封装多个结果集

@One:实现一对一结果集封装

@Many:实现一对多结果集封装

 

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

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

相关文章

cesium不同版本对3dtiles的渲染效果不同,固定光照的优化方案

cesium不同版本对3dtiles的渲染效果不同&#xff0c;固定光照的优化方案&#xff0c;避免map.fixedLight true,导致的光照效果太强&#xff0c;模型太亮的问题。 问题来源&#xff1a; 1.Cesium1.47版本加载tileset.json文件跟Mars3d最新版加载文件存在差异效果 Cesium1.47…

基于springboot的课程作业管理系统

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;课程作业管理系统当然也不能排除在外。课程作业管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法…

WPF绘制进度条(弧形,圆形,异形)

前言 WPF里面圆形进度条实现还比较麻烦,主要涉及到的就是动态绘制进度条的进度需要用到简单的数学算法。其实原理比较简单,我们需要的是话两条重叠的弧线,里面的弧线要比里面的弧线要宽,这样简单的雏形就出来了。 基础写法 我们可以用Path来绘制弧线,代码如下: <Gr…

Android Studio Giraffe版本遇到的问题

背景 上周固态硬盘挂了&#xff0c;恢复数据之后&#xff0c;重新换了新的固态安装了Win11系统&#xff0c;之前安装的是Android Studio 4.x的版本&#xff0c;这次也是趁着新的系统安装新的Android开发工具。 版本如下&#xff1a; 但是打开以前的Android旧项目时&#xff…

Vue3-Eslint配置代码风格

prettier风格配置 官网&#xff1a;https://prettier.io Eslint&#xff1a;代码纠错&#xff0c;关注于规范 prettier&#xff1a;专注于代码格式化的插件&#xff0c;让代码更加美观 两者各有所长&#xff0c;配合使用优化代码 生效前提&#xff1a; 1&#xff09;禁用…

jenkins-cicd基础操作

1.先决条件 1.首先我个人势在k8s集群中创建的jenkins,部署方法搭建 k8s部署jenkins-CSDN博客 2.安装指定插件. 1.Gitlab plugin 用于调用gitlab-api的插件 2.Kubernetes plugin jenkins与k8s进行交互的插件,可以用来自动化的构建和部署 3.Build Authorizatio…

java操作windows系统功能案例(一)

下面是一个Java操作Windows系统功能的简单案例&#xff1a; 获取系统信息&#xff1a; import java.util.Properties;public class SystemInfo {public static void main(String[] args) {Properties properties System.getProperties();properties.list(System.out);} }该程…

Python with提前退出:坑与解决方案

Python with提前退出&#xff1a;坑与解决方案 问题的起源 早些时候使用with实现了一版全局进程锁&#xff0c;希望实现以下效果&#xff1a; Python with提前退出&#xff1a;坑与解决方案 全局进程锁本身不用多说&#xff0c;大部分都依靠外部的缓存来实现的&#xff0c;r…

【模电】基本共射放大电路的组成及各元件的作用

基本共射放大电路的组成及各元件的作用 下图所示为基本共射放大电路&#xff0c;晶体管是起放大作用的核心元件。输入信号 U ˙ i \.{U}\tiny i U˙i为正弦波电压。 当 u i 0 {u\tiny i}0 ui0时&#xff0c;称放大电路处于静态。在输入回路中&#xff0c;基极电源 V B B V\tin…

Re8 Generative Modeling by Estimating Gradients of the Data Distribution

宋扬博士的作品&#xff0c;和DDPM同属扩散模型开创工作&#xff0c;但二者的技术路线不同 Introduction 当前生成模型主要分成两类 基于似然模型 通过近似最大似然直接学习分布的概率密度&#xff0c;如VAE 隐式生成模型 概率分布由其抽样过程的模型隐式表示&#xff0c…

vue3+ts 实现时间间隔选择器

需求背景解决效果视频效果balancedTimeElement.vue 需求背景 实现一个分片的时间间隔选择器&#xff0c;需要把显示时间段显示成图表&#xff0c;涉及一下集中数据转换 [“02:30-05:30”,“07:30-10:30”,“14:30-17:30”]‘[(2,5),(7,10),(14,17)]’[4, 5, 6, 7, 8, 9, 10, …

掌握Python BentoML:构建、部署和管理机器学习模型

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com BentoML是一个开源的Python框架&#xff0c;旨在简化机器学习模型的打包、部署和管理。本文将深入介绍BentoML的功能和用法&#xff0c;提供详细的示例代码和解释&#xff0c;帮助你更好地理解和应用这个强大的工…

volatile-之小总结

凭什么我们Java写了一个volatile关键字&#xff0c;系统底层加入内存屏障&#xff1f;两者的关系如何勾搭&#xff1f; 内存屏障是什么&#xff1f; 是一种屏障指令&#xff0c;它使得CPU或编译器对屏障指令的前和后所发出的内存操作执行一个排序的约 束。也称为内存栅栏或栅…

低价商品采购API接口

采购商品地址http://sly.yizhaosulianyun.com/More/Push/888889?type3 低价商品采购API接口 1) 请求地址 http://sly.yizhaosulianyun.com/jd/keyWords 2) 调用方式&#xff1a;HTTP post 3) 接口描述&#xff1a; 低价商品采购接口 4) 请求参数: POST参数: 字段名称字段…

《Python机器学习原理与算法实现》学习笔记--一文掌握机器学习与Python的基础概念

机器学习常见的基础概念 根据输入数据是否具有“响应变量”信息&#xff0c;机器学习被分为“监督式学习”和“非监督式学习”。“监督式学习”即输入数据中即有X变量&#xff0c;也有y变量&#xff0c;特色在于使用“特征&#xff08;X变量&#xff09;”来预测“响应变量&am…

会泽一村民上山放羊吸烟引发森林火灾,AI科技急需关注

2023年4月&#xff0c;会泽县古城街道厂沟村委会望香台山林中发生了一场由疏忽引发的森林火灾。张某某在放羊时未完全熄灭烟头&#xff0c;导致7.33公顷的林地和草地被焚毁&#xff0c;直接经济损失高达29.097万元。这一事件再次凸显了日常生活中的安全隐患。 在这一背景下&…

GeoServer改造Springboot源码四(图层管理设计)

一、界面设计 图 1图层管理列表 图 2选择图层数据源 图 3添加图层 图 4编辑图层

如何决定产品功能的优先顺序:从 Scrum 过渡到 Shape Up

领导者应该决定要解决的问题的“内容”和“时间”&#xff08;而不是要实施的解决方案&#xff09;。产品团队成员应该可以自由地通过他们只能根据自己的专业知识和知识构思和执行的解决方案来定义“如何”。本文将指导我们从 Scrum 转向Shape Up&#xff0c;立即开始按时交货&…

芯片技术探索:了解构芯片的设计与制造之旅

芯片技术探索:了解构芯片的设计与制造之旅 一、引言 随着现代科技的飞速发展,芯片作为信息技术的核心,已经渗透到我们生活的方方面面。从智能手机、电视、汽车到医疗设备和工业控制系统,芯片在各个领域都发挥着至关重要的作用。然而,对于大多数人来说,芯片仍然是一个神秘…

11.30

1.设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 #include <iostream>using namespace std;cl…