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;运用软件工程原理和开发方法…

4.1字符类型统计器(C语言实现)

【题目描述】请编写一个C程序&#xff0c;在终端用键盘输入字符串&#xff0c;以CtrlZ组合键表示输入完毕&#xff0c;统计输入的字符串中空格符、制表符、换行符的个数&#xff0c;并显示统计的结果。 【代码实现】 # include <stdio.h> int main() {int space 0, tab…

1022. 宠物小精灵之收服,二维花费的背包

1022. 宠物小精灵之收服 - AcWing题库 宠物小精灵是一部讲述小智和他的搭档皮卡丘一起冒险的故事。 一天&#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…

查看linux处理器架构(uname命令 使用指南)

一、查看linux处理器架构 在linux系统终端下输入uname -m(在windows下可通过git Bash输入uname -m命令) 可得输出结果与架构对应表 架构 输出结果 i386 i386, i686 amd64 x86_64 arm arm, armv7l arm64 aarch64, armv8l mips mips mips64 mips64 等等等 alpha, …

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…

C++ 类和对象-封装的意义

前沿 C面向对象的三大特性为&#xff1a;封装、继承、多态。 封装的意义&#xff1a; 将属性和行为作为一个整体&#xff0c;表现生活中的事物将属性和行为加以权限控制 封装意义一&#xff1a; 在设计类的时候&#xff0c;属性和行为写在一起&#xff0c;表现事物。 语法&…

python 生成器的作用

1. 生成器 参考&#xff1a; https://www.cainiaojc.com/python/python-generator.html 1.1. 什么是生成器&#xff1f; 在 python 中&#xff0c;一边循环一边计算的机制&#xff0c;称为生成器&#xff1a;generator. 1.2. 生成器有什么优点&#xff1f; 1、节约内存。p…

PC端企业微信hook协议开发,获取要群发的客户群id

产品说明 一、 hook版本&#xff1a;企业微信hook接口是指将企业微信的功能封装成dll&#xff0c;并提供简易的接口给程序调用。通过hook技术&#xff0c;可以在不修改企业微信客户端源代码的情况下&#xff0c;实现对企业微信客户端的功能进行扩展和定制化。企业微信hook接口…

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

基本共射放大电路的组成及各元件的作用 下图所示为基本共射放大电路&#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参数: 字段名称字段…