Mybatis:CRUD数据操作之多条件查询及动态SQL

Mybatis基础环境准备请看:Mybatis基础环境准备
本篇讲解Mybati数据CRUD数据操作之多条件查询

1,编写接口方法

com.itheima.mapper 包写创建名为 BrandMapper 的接口。在 BrandMapper 接口中定义多条件查询的方法。

而该功能有三个参数,我们就需要考虑定义接口时,参数应该如何定义。Mybatis针对多参数有多种实现

  • 使用 @Param("参数名称") 标记每一个参数,在映射配置文件中就需要使用 #{参数名称} 进行占位

    List<Brand> selectByCondition1(@Param("status") int status, @Param("companyName") String companyName,@Param("brandName") String brandName);
    
  • 将多个参数封装成一个 实体对象 ,将该实体对象作为接口的方法参数。该方式要求在映射配置文件的SQL中使用 #{内容} 时,里面的内容必须和实体类属性名保持一致。

    List<Brand> selectByCondition2(Brand brand);
    
  • 将多个参数封装到map集合中,将map集合作为接口的方法参数。该方式要求在映射配置文件的SQL中使用 #{内容} 时,里面的内容必须和map集合中键的名称一致。

    List<Brand> selectByCondition3(Map map);
    

即在接口中,定义接口如下3种形式:

    List<Brand> selectByCondition1(@Param("status") int status, @Param("companyName") String companyName, @Param("brandName") String brandName);List<Brand> selectByCondition2(Brand brand);List<Brand> selectByCondition3(Map map);

2,编写SQL语句

​ 在 reources 下创建 com/itheima/mapper 目录结构,并在该目录下创建名为 BrandMapper.xml 的映射配置文件

<?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.itheima.mapper.BrandMapper"><resultMap id="brandResultMap" type="brand"><!--id:完成主键字段的映射column:表的列名property:实体类的属性名result:完成一般字段的映射column:表的列名property:实体类的属性名--><result column="brand_name" property="brandName"/><result column="company_name" property="companyName"/></resultMap><select id="selectByCondition1" resultMap="brandResultMap">select *from tb_brandwhere status = #{status}and company_name like #{companyName}and brand_name like #{brandName}</select><select id="selectByCondition2" resultMap="brandResultMap">select *from tb_brandwhere status = #{status}and company_name like #{companyName}and brand_name like #{brandName}</select><select id="selectByCondition3" resultMap="brandResultMap">select *from tb_brandwhere status = #{status}and company_name like #{companyName}and brand_name like #{brandName}</select>
</mapper>

3,编写测试方法

test/java 下的 com.itheima.mapper 包下的 MybatisTest类中 定义测试方法

三种实现方式分别对应上述三种接口写法。

@Test
public void testSelectByCondition() throws IOException {//接收参数int status = 1;String companyName = "华为";String brandName = "华为";// 处理参数companyName = "%" + companyName + "%";brandName = "%" + brandName + "%";//1. 获取SqlSessionFactoryString resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2. 获取SqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession();//3. 获取Mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);//4. 执行方法//方式一 :接口方法参数使用 @Param 方式调用的方法// 对应接口:List<Brand> selectByCondition1(@Param("status") int status, @Param("companyName") String companyName,@Param("brandName") String brandName);List<Brand> brands1 = brandMapper.selectByCondition1(status, companyName, brandName);System.out.println(brands1);//方式二 :接口方法参数是 实体类对象 方式调用的方法// 对应接口:List<Brand> selectByCondition2(Brand brand);//封装对象Brand brand = new Brand();brand.setStatus(status);brand.setCompanyName(companyName);brand.setBrandName(brandName);List<Brand> brands2 = brandMapper.selectByCondition2(brand);System.out.println(brands2);//方式三 :接口方法参数是 map集合对象 方式调用的方法// 对应接口:List<Brand> selectByCondition3(Map map);Map map = new HashMap();map.put("status" , status);map.put("companyName", companyName);map.put("brandName" , brandName);List<Brand> brands3 = brandMapper.selectByCondition3(map);System.out.println(brands3);//5. 释放资源sqlSession.close();
}

执行测试方法结果如下:
在这里插入图片描述

结果与数据库里信息一致,3种方式都可以得到相同的结果。

4,动态SQL

上述功能实现存在很大的问题, 用户在输入条件时,肯定不会所有的条件都填写,如果写死sql

select *from tb_brandwhere status = #{status}and company_name like #{companyName}and brand_name like #{brandName}

那么,肯定会报错,比如status字段没有,则语法报错。
这就需要我们根据实际去动态生成SQL语句。
Mybatis对动态SQL有很强大的支撑:

  • if

  • choose (when, otherwise)

  • trim (where, set)

  • foreach

  • if 标签:条件判断

    • test 属性:逻辑表达式,如果为是,则 if标签保留,否则if标签内容不保留
  • where 标签
    作用:

    • 替换where关键字
    • 会动态的去掉第一个条件前的 and
    • 如果所有的参数没有值则不加where关键字

注意:需要给每个条件前都加上 and 关键字。

动态sql示例

sql配置编写:

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

测试类里:

 Map map2 = new HashMap();//map2.put("status" , status);map2.put("companyName", companyName);map2.put("brandName" , brandName);List<Brand> brands = brandMapper.selectByCondition(map2);System.out.println(brands);

运行结果:
在这里插入图片描述
可以看到,SQL语句动态生成了,结果正确!

[声明]:内容主要来源黑马程序员网上资源学习

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

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

相关文章

Day3 洛谷 1161+1179+1200+1304

零基础洛谷刷题记录 Day1 2024.11.18 Day2 2024.11.25 Day3 2024.11.26 文章目录 零基础洛谷刷题记录1161&#xff1a;题目描述1161&#xff1a;解题代码1161&#xff1a;学习成果1179&#xff1a;题目描述&#xff08;成功写出&#xff09;1179&#xff1a;解题代码1179&…

18:(标准库)DMA二:DMA+串口收发数据

DMA串口收发数据 1、DMA串口发送数据2、DMA中断串口接收定长数据包3、串口空闲中断DMA接收不定长数据包4、串口空闲中断DMA接收不定长数据包DMA发送数据包 1、DMA串口发送数据 当串口的波特率大于115200时&#xff0c;可以通过DMA1进行数据搬运&#xff0c;以防止数据的丢失。如…

【Flink-scala】DataStream编程模型之窗口计算-触发器-驱逐器

DataStream API编程模型 1.【Flink-Scala】DataStream编程模型之数据源、数据转换、数据输出 2.【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 文章目录 DataStream API编程模型前言1.触发器1.1 代码示例 2.驱逐器2.1 代码示例 总结 前言 本小节我想…

MATLAB —— 机械臂工作空间,可达性分析

系列文章目录 前言 本示例展示了如何使用可操作性指数对不同类型的机械手进行工作空间分析。工作空间分析是一种有用的工具,可用于确定机器人工作空间中最容易改变末端效应器位置和方向的区域。本示例的重点是利用不同的可操控性指数类型来分析各种机械手的工作空间。了解工作…

提升异步编程性能:使用 uvloop 加速你的 Python 应用

提升异步编程性能&#xff1a;使用 uvloop 加速你的 Python 应用 引言什么是 uvloop&#xff1f;安装 uvloop使用 uvloop示例代码代码解释性能对比性能测试结果 总结参考资料 引言 在现代的 Python 异步编程中&#xff0c;asyncio 是一个非常强大的工具&#xff0c;它允许我们…

Python 小高考篇(8)拓展

目录 列表读取内容修改内容for 循环遍历列表下标越界 ASCII码和字符的相互转换导入库进制转换结尾 本文由Jzwalliser原创&#xff0c;发布在CSDN平台上&#xff0c;遵循CC 4.0 BY-SA协议。 因此&#xff0c;若需转载/引用本文&#xff0c;请注明作者并附原文链接&#xff0c;且…

11.21c++中的函数

练习&#xff1a; 编写mystring类&#xff1a;拥有以下功能&#xff1a; 1.带参、无参构造函数&#xff0c;拷贝构造函数&#xff0c;析构函数 2.编写 append(const mystring r) 为当前字符串尾部&#xff0c;拼接新的字符串r 3.编写 isEqual(const mystring r) 判断当前字符串…

windbg使用定位内核内存泄露

零 打开驱动测试测试工具 verifier /standard /driver fileflt.sys 然后重启电脑等待生效 一 设置 Windows 内核调试的符号路径和模块加载 1. 设置微软符号服务器路径&#xff1a; 在 WinDbg 中&#xff0c;可以通过以下命令设置符号路径&#xff1a; .sympath srv*c:\s…

vue3使用monaco编辑器(VSCode网页版)

vue3使用monaco编辑器&#xff08;VSCode网页版&#xff09; 文章说明参考文章核心代码效果展示实践说明源码下载 文章说明 一直在找网页版的编辑器&#xff0c;网页版的VSCode功能很强大&#xff0c;这个monaco就是VSCode样式的编辑器&#xff0c;功能很强大&#xff0c;可以直…

Vue.js 组件开发进阶:构建可扩展的组件库

在构建大型应用或企业级前端项目时&#xff0c;往往需要将多个组件模块化、封装成可复用的组件库。这种组件库不仅能够大幅提升开发效率&#xff0c;还能确保一致的用户体验和易于维护的代码结构。Vue.js 作为一个渐进式的前端框架&#xff0c;其灵活的组件化设计使得开发高质量…

UWB数字钥匙安全测距和场景应用

1. CCC数字钥匙 2021年7月CCC将UWB定义为第三代数字钥匙的核心技术&#xff0c;并发布CCC R3&#xff08;第三代数字钥匙&#xff09;规范。 CCC R3是基于NFC/BLE/UWB作为基础的无线电技术的使用&#xff0c;该系统采用非对称密码技术对车辆和设备进行相互签名认证&#xff0…

SpringBoot小知识(2):日志

日志是开发项目中非常重要的一个环节&#xff0c;它是程序员在检查程序运行的手段之一。 1.日志的基础操作 1.1 日志的作用 编程期调试代码运营期记录信息&#xff1a; * 记录日常运营重要信息(峰值流量、平均响应时长……) * 记录应用报错信息(错误堆栈) * 记录运维过程数据(…

SAP Native SQL 的简单说明

Open SQL访问数据字典中声明的数据库表&#xff0c;不区分数据库类型&#xff0c;执行时会自动转换为对应的语句&#xff0c;且可以使用本地缓存。Native SQL使用特定于数据库的SQL语句,但是可以访问比Open SQL 更多的表&#xff0c;更多的操作&#xff0c;缺点也很明显&#x…

2024前端面试经验分享

一、简历 1、整理步骤 把自己过去做过的有亮点的事情整理一遍。项目经历&#xff0c;通过 star 法则来做&#xff0c;不赘述&#xff0c;网上很多人讲。需要突出的亮点见下面。 2、前端开发常见突出亮点&#xff1a; 性能优化代码优化组件封装框架原理项目推进、协调能力技…

IEEE 802.11s wifi mesh网络

IEEE 802.11s 是对 IEEE 802.11 标准的扩展&#xff0c;允许多个无线节点相互连接&#xff0c;而无需在它们之间有接入点&#xff08;AP&#xff09;。例如&#xff0c;如果您家里有一个 AP&#xff0c;您想将文件复制到另一台连接到相同 AP 的笔记本电脑 B&#xff08;与您的笔…

Git中HEAD、工作树和索引的区别

在Git版本控制系统中&#xff0c;HEAD、工作树&#xff08;Working Tree&#xff09;和索引&#xff08;Index&#xff09;是三个非常重要的概念&#xff0c;它们分别代表了不同的状态或区域&#xff0c;下面我将对这三个概念进行详细的解释。 HEAD 定义&#xff1a;HEAD是一…

ARP欺骗-监控网络

kali: 使用arp-scan -l 查看同个局域网 windows arp -a 查看地址的物理地址 192.168.21.2 对应的是00-50-56-f5-d5-f0 攻击利用: 我们要让目标ip的流量经过我的网卡,从网关出去 使用的开启 echo 1 > /proc/sys/net/ipv4/ip_forward 当为0时&#xff0c;我们不转发&…

HTML 画布:网页上的创意绘图板

HTML 画布:网页上的创意绘图板 HTML5的画布(Canvas)元素为网页开发者提供了一种在网页上绘制图形和动画的强大工具。它是HTML5标准的一部分,被设计为允许脚本语言(通常是JavaScript)动态渲染图形、图像和动画。在这篇文章中,我们将深入探讨HTML画布的各个方面,包括其基…

pycharm链接neo4j(导入文件)

1.新建csv文件 2.写入文件 3.运行代码 import csv from py2neo import Graph, Node# 连接到Neo4j数据库&#xff0c;使用Bolt协议 graph Graph("bolt://localhost:7687", auth("neo4j", "password"))# 读取CSV文件 with open(D:\\Users\\ran…

Lodash的debounce方法:优化你的函数调用

在JavaScript开发中&#xff0c;我们经常会遇到需要在特定事件触发后执行某些操作的情况&#xff0c;比如窗口调整大小、滚动、按键输入等。然而&#xff0c;如果这些事件被频繁触发&#xff0c;相应的函数也会被频繁调用&#xff0c;这可能导致性能问题。这时&#xff0c;Loda…