MyBatis案例 | 使用映射配置文件实现CRUD操作——多条件查询

news2025/1/16 16:55:55

本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等,如果刚开始学习Java的小伙伴可以点击下方连接查看专栏
本专栏地址:🔥JavaWeb
Java入门篇: 🔥Java基础学习篇
Java进阶学习篇(持续更新中):🔑Java进阶学习篇

在这里插入图片描述
从本文开始将讲述有关于如何使用MyBatis完成增删查改的操作,预计本系列文章会有以下这些文章,在写完本系列的文章后会有一篇文章罗列这些文章以及其地址(传送门)小伙伴们直接点击查看即可

文章名称文章地址
查询所有数据使用映射配置文件实现CRUD操作——查询所有数据
查询详情使用映射配置文件实现CRUD操作——通过主键查询对应数据
添加数据
修改全部字段
修改动态字段
删除一条数据
批量删除数据

文章目录

  • 一、前言
  • 二、使用@Param注解
    • 1.BrandMapper接口
    • 2.SQL语句
    • 3.BrandMapper.xml文件
    • 4.测试类
      • 1️⃣接收参数
      • 2️⃣处理参数
      • 3️⃣传递参数,执行方法
  • 三、将参数封装成实体对象
    • 1.BrandMapper接口
    • 2.BrandMapper.xml文件
    • 3.测试类
      • 1️⃣传递参数
      • 2️⃣处理参数
      • 3️⃣封装对象
  • 四、使用Map集合(常用)
    • 1.BrandMapper接口
    • 2.BrandMapper.xml文件
    • 3.测试类
  • 五、存在问题&结语

一、前言

在实际开发中,经常会遇到多条件查询的状况。比如某宝上买东西要筛选,价格区间、颜色、品牌等,本文将介绍三种不同的方法来实现多条件查询:1️⃣使用注解 2️⃣将参数封装成实体对象 3️⃣将参数封装到map集合中

二、使用@Param注解

1.BrandMapper接口

这里我们同样用List集合来放置方法查询出来的结果(因为多条件查询出来可能不止一个复合的数据),方法定义为一个含参构造的方法,将可供选择的条件以参数传递进去。这里我们要 用@Param注解来标记参数,并在映射文件中使用参数占位符进行占位

List<Brand> selectByCondition(@Param("status")int status,
                              @Param("brandName")String brand_name,
                              @Param("companyName")String company_name);

这里要注意,@Param注解后的名字要与一会映射文件中使用的参数占位符一致,后面带有返回值类型的参数是一会我们要设置的(也就是日后从页面接收用户传递的数据)

在这里插入图片描述

2.SQL语句

这里需要用到参数占位符,前文已经介绍过了参数占位符,很显然这里要用到#{}占位符。由于公司名称和品牌名称用户在输入的时候可能不会输入与表格中的数据一模一样的,例如华为技术有限公司,用户只会输入华为,那么这里就需要用到模糊查询,在SQL中使用LIKE来实现模糊查询,这在后面写测试用例时会提到

<select id="selectByCondition" resultMap="brandResultMap">
        select
        *
        from tb_brand
        where
        status = #{status}
        and company_name like #{companyName}
        and brand_name like #{brandName}
</select>

3.BrandMapper.xml文件

除了要写上面的SQL语句,还要加上前面文章中一直有的ResultMap,这样才能完成字段映射,这里也不多做赘述

    <resultMap id="brandResultMap" type="Brand">
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    </resultMap>

4.测试类

这里就讲几个与之前不一样的地方,与之前一样的就不再重复描述了

1️⃣接收参数

由于我们目前没有学到如何捕获用户输入的信息,所以只能在这里自己定义参数,这里有三个条件,那么我们需要定义三个参数值来模拟从页面接收的数据;这里参数设置的可以与我不相同,仅作参考

int status = 1;
String brandName = "华为";
String companyName = "华为";

2️⃣处理参数

上面提到用户不会输入一模一样的字段名称,但是字段中只要包含用户输入的这几个字就应该要能够查询,所以在这里使用通配符%(也是模糊查询中的,如果不熟悉的小伙伴可以回顾一下数据库的表查询相关知识点)

brandName = "%" + brandName + "%";
companyName = "%" + companyName + "%";

3️⃣传递参数,执行方法

由于我们构造的是带参数的方法,所以要传递三个参数,这里只需要将我们之前定义的三个参数传进去就可以了

List<Brand> brandList = brandMapper.selectByCondition(status, brandName, companyName);

[Brand{id=2, brandName=‘华为’, companyName=‘华为技术有限公司’, ordered=100, description=‘华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界’, status=1}]

三、将参数封装成实体对象

1.BrandMapper接口

这里我们同样用List集合来放置方法查询出来的结果,方法定义为一个含参构造的方法,将参数封装为实体对象后,到时候只需要把对象传递进去就行了

List<Brand> selectByCondition(Brand brand);

2.BrandMapper.xml文件

同上,SQL语句也一致,这里不用改动

3.测试类

1️⃣传递参数

由于我们目前没有学到如何捕获用户输入的信息,所以只能在这里自己定义参数,这里有三个条件,那么我们需要定义三个参数值来模拟从页面接收的数据;这里参数设置的可以与我不相同,仅作参考

int status = 1;
String brandName = "华为";
String companyName = "华为";

2️⃣处理参数

上面提到用户不会输入一模一样的字段名称,但是字段中只要包含用户输入的这几个字就应该要能够查询,所以在这里使用通配符%(也是模糊查询中的,如果不熟悉的小伙伴可以回顾一下数据库的表查询相关知识点)

brandName = "%" + brandName + "%";
companyName = "%" + companyName + "%";

3️⃣封装对象

这里就要用到之前学的set方法来给对象赋值,将前面设置的参数封装到new出来的对象中,到时候执行方法时,只需要传递一个对象即可,优化了之前的代码,但依然不是最好的方法

Brand brand = new Brand();
brand.setStatus(status);
brand.setBrandName(brandName);
brand.setCompanyName(companyName);

四、使用Map集合(常用)

1.BrandMapper接口

这里我们同样用List集合来放置方法查询出来的结果,方法定义为一个含参构造的方法,将参数封装为实体对象后,到时候只需要把对象传递进去就行了

List<Brand> selectByCondition(Brand brand);

2.BrandMapper.xml文件

同上,SQL语句也一致,这里不用改动

3.测试类

使用Map集合封装对象时,要注意键值对所对应的是什么,前面的是键,也就是在SQL语句中使用占位符中的那几个参数,而后面的是值,也就是前面定义完并经过处理的参数

Map map = new HashMap();
map.put("status",status);
map.put("brandName",brandName);
map.put("companyName",companyName);

这里放出完整的代码以供参考

public class MyBatisTest3_selectByCondition2_useMap {
    @Test
    public void SelectByCondition() throws IOException {
        //接收参数
        int status = 1;
        String brandName = "华为";
        String companyName = "华为";

        //处理参数
        brandName = "%" + brandName + "%";
        companyName = "%" + companyName + "%";

        //封装对象,键值对,前面是键名称,后面是值
        Map map = new HashMap();
        map.put("status",status);
        map.put("brandName",brandName);
        map.put("companyName",companyName);

        //加载MyBatis的核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);


        //SqlSession获取对象
        SqlSession sqlSession = sqlSessionFactory.openSession();


        //获取BrandMapper接口代理对象
        BrandMapper brandMapper= sqlSession.getMapper(BrandMapper.class);

        //传入对象,执行方法
        List<Brand> brands = brandMapper.selectByCondition(map);

        //打印结果
        System.out.println(brands);

        //释放资源
        sqlSession.close();
    }
}

五、存在问题&结语

这里还是存在一定的问题的,比如当我们有一个参数没有值的时候,就查询不出来结果了,这不是我们需要的,说明这个代码还需要改进,这就是动态SQL,也就是我们下一篇文章会讲述的
在这里插入图片描述

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

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

相关文章

【论文阅读】Exathlon: A Benchmark for Explainable Anomaly Detection over Time Series

论文来源 标题: Exathlon: A Benchmark for Explainable Anomaly Detection over Time Series (Vincent Jacob,2021) 作者: Vincent Jacob, Fei Song, Arnaud Stiegler, Bijan Rad, Yanlei Diao, Nesime Tatbul 期刊: Proceedings of the VLDB Endowment 研究问题 Exathlon是…

尚医通(三)医院设置模块后端 | swagger | 统一日志 | 统一返回结果

目录一、医院设置模块需求二、医院设置表结构三、医院模块配置四、医院查询功能1、创建包结构&#xff0c;创建SpringBoot启动类2、编写controller代码3、创建SpringBoot配置类5、运行启动类6、统一返回的json时间格式五、医院设置逻辑删除功能1、HospitalSetController添加删除…

CDA Level Ⅱ 模拟题(二)

练习题 【单选题】1/20 一项针对全国25-35岁用户群的手机喜好调查&#xff0c;但调研项目经费大概是10万元&#xff0c;并且用户群相对集中在中国中部城市。前期预调研显示&#xff0c;用户群的数值方差和调研费用不等。以下哪种情况是比较适宜的调查方式&#xff1f; A.简单随…

【C++入门】

目录1、命名空间1.1、命名空间定义1.2、命名空间的使用2、C输入和输出3、缺省参数3.1 缺省参数概念3.2缺省参数分类4、函数重载4.1、函数重载概念4.2 C支持函数重载的原理--名字修饰5、引用5.1、引用概念5.2、引用特性5.3、常引用5.4、使用场景5.5、传值、传引用效率比较5.6、引…

【JavaEE】如何构造 HTTP请求认识HTTPS

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaEE】 ✈️✈️本篇内容:如何构造 HTTP 请求同时认识HTTPS&#xff01; &#x1f680;&#x1f680;代码存放仓库gitee&#xff1a;JavaEE代码&#xff01; …

HW在即,那些被遗忘的物理安全还好吗?

近段时间&#xff0c;一个网络攻击的段子在互联网上火了起来。 “某公司被黑客勒索&#xff0c;每20分钟断一次网&#xff0c;给公司带来了极其严重的影响&#xff0c;但通过技术手段怎么也找不到问题。最后公司发现是黑客买通了保安&#xff0c;每20分钟拔一次网线。” 看完…

即时通讯系列---如何设计消息协议层方案

1. 前言 上篇即时通讯系列—如何下手做技术方案设计 最后总结出IM系统的端侧基本结构 后续文章将从下到上以此做架构设计. 本文Agenda 什么是消息同步同步协议的常见设计方案包含哪些应该采用哪种方案方案细节 2. 名词定义: 消息漫游 : 用户如何从消息服务器获取会话和消息…

MITK2021.02编译记录

编译成功效果 编译文件夹 参考教程 https://libaineu2004.blog.csdn.net/article/details/124202508?spm1001.2101.3001.6650.6&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ERate-6-124202508-blog-76460702.pc_relevant_aa2&depth_…

C语言——数据在内存中的存储

C语言——数据的存储一、C语言中常见的数据类型1.1 数据类型的基本归类二. 整型在内存中的存储2.1原码、反码、补码知识回顾2.2大小端字节序2.2.1 何为大小端字节序2.2.2为什么会产生大小端字节序2.2.3练习三、浮点型在内存中的存储3.1浮点数存储规则一、C语言中常见的数据类型…

Java两大工具库:Commons和Guava(5)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客。值此新春佳节&#xff0c;我给您拜年啦&#xff5e;祝您在新的一年中所求皆所愿&#xff0c;所行皆坦途&#xff0c;展宏“兔”&#xff0c;有钱“兔”&#xff0c;多喜乐&#xff0c;常安宁&#xff01;在开发中&#…

C语言最鸡肋的关键字

C语言的关键字有很多&#xff0c;要说最不常见的&#xff0c;我觉得应该是auto。 说它不常见&#xff0c;因为很多时候&#xff0c;我们都把它给省略了。 比如在函数内部定义变量a&#xff0c;正常人都会这样写&#xff1a; void function() {int a; }很少有人会在前面加一个…

1616_MIT 6.828 program header相关只是小结

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 前面刚刚分析了elf的header&#xff0c;看了两行代码又遇到了program的header。又是一个概念类的问题&#xff0c;还得去简单了解下。 1. 这里面的信息其实是可能有…

hgame2023 week2 writeup

WEEK2 文章目录WEEK2web1、Git Leakage2、v2board3、DesignerRE1、before_main2、stream3、VidarCamera4、mathpwn1、YukkuriSay2、editable_note3、fast_note4、new_fast_noteCrypto1、零元购年货商店2、包里有什么3、Rabin3、RSA 大冒险1misc1、Tetris Master2、Sign In Pro …

深入理解Linux网络学习总结

文章目录一、绪论二、内核如何接收网络包1、收包流程的一些核心概念2、网络接收过程总览三、内核如何与用户进程协作1、进程的一些基础概念3、同步阻塞IO工作流程4、epoll工作流程四、内核如何发送网络包1、发包流程的一些基础概念2、网络发送过程总览3、发包流程的内存拷贝操作…

Cnetsdk:PDF 转图像转换器 SDK 大文档轻松转

.NET PDF 到图像转换器 SDK&#xff0c;成熟的PDF转换器 CnetSDK .NET PDF Converter for Images是一个完整的PDF到图像转换解决方案。无需将任何其他 Adob​​e 或 PDF 阅读器安装到您的 .NET 应用程序&#xff08;C# 或 VB.NET&#xff09;&#xff0c;例如 Windows 和 ASP.N…

Cnetsdk.NET PDF 条码阅读器 SDK

.NET PDF 条码阅读器 SDK 易于整合 Cnetsdk.NET PDF 条码阅读器 SDK易于添加和集成到您的 C# 和 VB.NET 应用程序开发中。您只需要将您的 VS .NET 项目引用添加到 CnetSDK .NET PDF Barcode Reader SDK 库 dll。这个独立的 .NET 库与 .NET Framework 2.0、Visual Studio 2005、…

Linux(常用操作+服务器部署项目运行环境的过程记录)

Linux&#xff08;常用操作实例springboot项目&#xff08;包含数据库&#xff09;打包上传&#xff0c;配置到腾讯云轻量级服务器&#xff0c;中间一些错误也记录了解决方法和自己的理解&#xff09; Linux中一切皆文件【文件: 读写执行(查看、创建、删除、移动、复制、编辑)…

java易错题锦集一

易错题 字符串 题一 原题链接 public class Example { String str new String("good"); char[] ch {a,b,c}; public static void main(String[] args) { Example ex new Example(); ex.change(ex.str, ex.ch); System.out.print(ex.str "and"); Syst…

Spring设计模式总结

Spring 框架用到了哪些设计模式&#xff1f; 代理模式 总述 所谓代理&#xff0c;是指它与被代理对象实现了相同的接口&#xff0c;客户端必须通过代理才能与被代理的目标类进行交互&#xff0c;而代理一般在交互的过程中&#xff08;交互前后&#xff09;&#xff0c;进行某…

前端——周总结系列三

1 数组对象使用变量作为key加中括号 2 遍历数组异同 主要针对for…in&#xff0c; for…of &#xff0c;map遍历方法 for…in和for…of都可以遍历数组&#xff0c;其中for…of可以获取数组的每一项&#xff0c;for…in不仅可以获取每一项&#xff0c;也可以获取索引值 for…o…