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

news/2024/12/2 4:34:53/

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.ppmy.cn/news/1551663.html

相关文章

量化交易系统开发-实时行情自动化交易-8.4.MT4/MT5平台

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来会对于MT4/MT5平台介绍。 MetaT…

龙迅#LT8612UX适用于HDMI 转 HDMIVGA应用领域,分辨率高达4K60HZ,内置程序,方便调试!

1. 描述 LT8612UX 是一款 HDMI 转 HDMI&VGA 转换器&#xff0c;可将 HDMI2.0 数据流转换为 HDMI2.0 信号和模拟 RGB 信号。它还输出 8 通道 I2S 和 SPDIF 信号&#xff0c;可实现高质量的 7.1 通道音频。 LT8612UX 使用最新的 ClearEdge 技术&#xff0c;除了原始的 HDMI…

关于按天切割Tomcat的catalina.out日志文件的配置

1、catalina.out 是 Tomcat 的标准输出和标准错误日志&#xff0c;通常输出到 Tomcat 安装目录下的 logs 文件夹中。这个日志文件会记录 Tomcat 启动、停止以及运行过程中产生的所有日志信息。 2、在Apache Tomcat中&#xff0c;日志文件catalina.out默认情况下不会自动按天切割…

深入学习指针(5)!!!!!!!!!!!!!!!

文章目录 1.回调函数是什么&#xff1f;2.qsort使用举例2.1使用qsort函数排序整形数据2.2使用sqort排序结构数据 3.qsort函数的模拟实现 1.回调函数是什么&#xff1f; 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递…

【商业化GPT】AI对话|绘画|音乐|视频|文件|知识库于一体的商业化GPT解决方案

急速AI 是一个综合性的 AI Web 应用平台&#xff0c;旨在为用户提供一个集成化、易于部署的人工智能服务站点。参考ChatGPT 官网的理念&#xff0c;将多种 AI 技术集成于一个单一的平台中&#xff0c;从而提供了一个全方位的 AI 服务体验&#xff0c;包括但不限于对话、绘画、语…

LabVIEW实现UDP通信

目录 1、UDP通信原理 2、硬件环境部署 3、云端环境部署 4、UDP通信函数 5、程序架构 6、前面板设计 7、程序框图设计 8、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利…

selinux、firewalld

一、selinux 1、selinux&#xff08;是Security-Enhanced Linux&#xff09;------ 安全强化的linux 2、selinux的工作原理 2.1 工作原理 ------- SELinux是通过MAC的方式来控制管理进程&#xff0c;它控制的主体是进程&#xff0c;而目标则是该进程能否读取的文件资源。 主…

facebook欧洲户开户条件有哪些又有何优势?

在当今数字营销时代&#xff0c;Facebook广告已成为企业推广产品和服务的重要渠道。而为了更好地利用这一平台&#xff0c;广告主们需要理解不同类型的Facebook广告账户。Facebook广告账户根据其属性可分为多种类型&#xff0c;包括个人广告账户、企业管理&#xff08;BM&#…