Mybatis增删改查(配置文件版)
准备环境
1、数据库表tb_brand
2、实体类Brand
3、测试用例
3、1在test包中的java包中创建测试类com.xyy.test.MybatisTest.java
4、安装MyBatisX插件
添加插件后,因为在Mapper代理开发时,Mapper接口要和Mapper.xml映射文件放在同一个报下,在如下界面中,可以看到接口名前面和每个接口方法名前都会有一个图标,点击便可以跳转到对应的sql映射文件中,点击接口前的图标会跳转到Mapper.xml中的< select >, < delete >, < insert >, < modify >等标签,点击方法对应的图标,便会跳转到Mapper.xml标签里面的sql语句。同样在接口和映射文件中可以互相进行跳转。
如果在接口中加入方法,但是在映射文件中并没有定义一个statement(< select > 等标签),会爆红提示,通过快捷键alt + shift + enter让mybatis帮忙进行创建
增删改查
1、查询
1、1 查询所有数据
从 XML 中构建 SqlSessionFactory
String resource = "mybatis-config.xml"; InputStream resourceAsStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
从 SqlSessionFactory 中获取 SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
利用Mapper代理开发来执行sql
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); List<Brand> brands = brandMapper.selectAll(); for(Brand brand : brands) { System.out.println(brand); //这里执行的是查询tb_brand表的所有信息 }
结果如下,但是有个Problem:
为什么会出现这种情况?
这是因为在数据库建表的时候,tb_brand表中column字段名和在java的pojo包下创建的实体类Brand的property属性差异造成的!
在数据库表中字段column定义如上图,再看在java中对应的实体类的属性property
可以看到,这两个映射不匹配,所以才会造成上述原因,在传表中数据给实体类中时,找不到匹配属性,所以会显示为null
解决方案(有多种,这里介绍常用灵活的resultMap)
在对tb_brand表的sql映射文件中加入resultMap,格式如下:
<mapper namespace="com.xyy.mapper.BrandMapper"><resultMap id = "brandMap" type="Brand"><result column="brand_name" property="brandName"></result><result column="company_name" property="companyName"></result><!--因为只有两个property和tb_brand中的column不对应,所以只写了两个,这里对于映射有两个写法,一个是result标签,就是上面这个,这种是针对于非主键的,对于主键的映射需要通过id,因为实体类中的id属性和表中的id字段对应了,就没必要写,但是也可以写出来,如下图--> </resultMap><!-- selectAll方法,查询所有品牌信息 --><select id="selectAll" resultMap="brandMap">select * from tb_brand;</select><!-- selectById方法,查询品牌信息,参数为id --><select id="selectById" resultMap="brandMap">select * from tb_brand where id = #{id};</select> </mapper>
添加了resultMap标签,里面有id和type,id是该resultMap标签的唯一标识,type则是需要字段和属性映射的实体类
其次,再将select标签中的resultType删掉,换成resultMap=“其唯一标识”。
官方文档中给出resultType和resultMap不能同时出现
再次运行,结果如下:
对于这些标签的属性,mybatis – MyBatis 3 | XML 映射器 (p2hp.com)给出了非常详细的介绍,可以参阅。
1、2 查看详情
查询所有是将表中所有记录都给查询出来,而查询详情则是将某一条记录拿出来,将所有column字段展示。
步骤流程
1、编写接口方法:Mapper接口
1、1 参数:id
1、2 结果: Brand2、编写SQL语句:SQL映射文件
3、执行方法,测试
<select id="selectById" resultMap="brandMap"> select * from tb_brand where id = #{id}; </select>
参数占位符
1、#{ } :会将其替换成?,为了防止SQL注入
2、${ }:直接拼sql,会存在SQL注入问题
3、使用时机:
3、1 参数传递的时候:#{ }
3、2表名或者列名不固定的情况下:${ } < 动态sql >
参数类型:parameterType:可以省略
特殊字符处理:
sql语句是写在xml文件中的,当sql条件中包含’ > ’ 时便会报错,因为这个是xml中标签的打头,为了避免这种情况:
1、可以使用转移字符,例如对于<的转义字符是:<
2、<![CDATA[ 特殊字符就写在这里面 ]]> 这样,特殊字符就会被当做普通文本来进行处理。(idea通过敲CD回车即可打出快捷键) <![CDATA[...]]>
1、
/*** @param id* @return com.xyy.pojo.Brand* @description 根据id查询品牌信息*/Brand selectById(int id);
以下是采用#{}的传参方式
以下是采用${}的传参方式,可以看到这是采用拼接,会造成安全隐患
1、3 条件查询
1、3、1 多条件查询
给出表中数据,后面三个条件查询都是对这个操作
步骤
1、编写接口方法:Mapper接口
1、1 参数:所有查询条件
1、2 结果: List< Brand>2、编写SQL语句:SQL映射文件
3、执行方法,测试
多条件就代表会传入多个参数,以下提供了三中参数处理的方式。
以下三种传参方式以后都会有应用场景,将一一介绍:
1、散装参数
//假定用户输入的三个数据条件 int status = 1; String companyName = "华为"; String brandName = "华为"; //处理用户输入的三个条件 companyName = "%" + companyName + "%"; brandName = "%" + brandName + "%";String resource = "mybatis-config.xml"; InputStream resourceAsStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession();BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); List<Brand> brands = brandMapper.selectByCondition(status, companyName, brandName); for(Brand brand : brands) {System.out.println(brand); }
2、对象参数
//这里是对象参数 Brand brand = new Brand(); brand.setBrandName(brandName); brand.setCompanyName(companyName); brand.setStatus(status); List<Brand> brands = brandMapper.selectByCondition(brand);
3、map对象
//这里是Map参数 Map map = new HashMap(); map.put("status", status); //这里的键的名称"status需要sql映射文件中的参数一致 //值的名称需要和接收的参数一致即可。 //因为这里接收的参数和sql参数命名一致,所以没啥区别 map.put("companyName", companyName); map.put("brandName", brandName); List<Brand> brands = brandMapper.selectByCondition(map);
总结:
1、3、1、1 多条件判断引入动态sql
引入:
上面的多条件查询会存在一些bug,用户不一定会每次都将所有条件都会输入,这样sql参数就可能接收到null值,最终结果就会有问题。
对此,引入动态条件查询(动态sql)
引入 < if test = “条件表达式” > sql片段 < /if >
<!-- 多条件查询 --> <select id="selectByCondition" resultMap="brandMap">select *from tb_brandwhere<if test="status != null">status = #{status}</if><if test="brandName != null and brandName != '' ">and brand_name like #{brandName}</if><if test="companyName != null and companyName != '' ">and company_name like #{companyName};</if> </select>
1、3、1中的多条件查询可以修改成这样,当用户某个条件没输入字符或者输入为’'时就不会拼接该条件
例如:
在这里可以看到用多个if条件写法可以解决用户部分条件不输入的查询
但是,这个写法会有一些bug,看上面xml代码中,从第二个if标签开始,里面的sql字段都是and开头的,如果第一个if标签没有拼接,则会造成sql语法错误,如下:
解决方案如下:
1、恒等式 1 == 1 (在每个if标签中的条件都加上 and, 同时在where后加上 1 == 1,后面所有的if标签都一视同仁,都是在 1==1 后面进行一个拼接)
2、Mybatis当然想到了这中情况,所以提供了新的标签< where >, 用< where > 抱歉提到原sql中where,这样就不用担心and问题了,
<select id="selectByCondition" resultMap="brandMap">select *from tb_brand<where> <if test="status != null">and status = #{status}</if><if test="brandName != null and brandName != '' ">and brand_name like #{brandName}</if><if test="companyName != null and companyName != '' ">and company_name like #{companyName};</if></where> </select>
这里需要注意一点,用< where > 代替了where后,每个if标签中的sql语句除第一个可以不用加and,后面的都需要加上and,< where > 识别去除and的功能,没有添加and的功能,不然会造成sql语法错误
总结:
1、3、2 单条件查询
针对于如下业务场景,引入但条件查询,就不能像之前多条件查询,一次可以输入多个条件。这种情况下,一次只能输入一个固定的条件,对该条件进行查询。(类似于switch结构,只执行满足条件的case,这里case可以类比于选择的条件)
引入choose(when, otherwise)
<!-- 单条件查询 --> <select id="selectByConditionSingle" resultMap="brandMap">select *from tb_brandwhere<choose><when test="status != null">status = #{status}</when><when test="brandName != null and brandName != '' ">brand_name like #{brandName}</when><when test="companyName != null and companyName != '' ">company_name like #{companyName}</when><otherwise>1 = 1</otherwise></choose> </select>
这个otherwise可以用之前的< where > 代替where来识别条件个数,如果没有条件拼接,Mybatis就会去掉where,如下:
[后续将慢慢完善]
2、添加
3、修改
4、删除
相关文章:

Mybatis增删改查(配置文件版)
准备环境 1、数据库表tb_brand 2、实体类Brand 3、测试用例 3、1在test包中的java包中创建测试类com.xyy.test.MybatisTest.java 4、安装MyBatisX插件 添加插件后,因为在Mapper代理开发时,Mapper接口要和Mapper.xml映射文件放在同一个报下࿰…...

【Spring Security系列】5 次密码错误触发账号锁定?Spring Security 高效实现方案详解
作者:后端小肥肠 🍇 我写过的文章中的相关代码放到了gitee,地址:xfc-fdw-cloud: 公共解决方案 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 姊妹篇: 【Spring Security系列…...
笔记day5
文章目录 1 复习2 最完美的解决方案,解决轮播图问题3 开发Floor组件4 把首页中的轮播图拆分为一个共用全局组件5 search模块开发 1 复习 完成商品分类三级列表路由跳转一级路由传参(合并参数)完成search模块中对于typeNav的使用(…...

Linux快速入门-兼期末快速复习使用
Linux快速入门-兼期末快速复习使用 一小时快速入门linux快速一:Linux操作系统概述1. Linux概述1.1 定义与特点1.2 起源与发展1.3 Linux结构1.4 版本类别1.5 应用和发展方向 2. 安装与启动2.1 Windows下VMware安装Linux2.2 安装Ubuntu 快速二:linux的桌面…...

浅谈文生图Stable Diffusion(SD)相关模型基础
1.U-Net模型基础 1.基础概念 UNet模型是一种基于卷积神经网络的图像分割算法,它采用了U型的网络结构,由编码器(下采样路径)和解码器(上采样路径)两部分组成。 编码器负责提取输入图像的特征,…...

Vivado使用VScode编译器
旧版Vivado使用Vscode编译器偶尔会出现VScode界面卡死的情况,在新版的Vivado中(我的是Vivado 2023.2),可以使用如下方式: 在设置中选择Text Editor,选择Custom Editor 在对话框中输入以下语句:…...

CEF127 编译指南 MacOS 篇 - 拉取 CEF 源码(五)
1. 引言 在完成了所有必要工具的安装和配置后,我们进入到获取 CEF 源码的阶段。对于 macOS 平台,CEF 的源码获取过程需要特别注意不同芯片架构(Intel 和 Apple Silicon)的区别以及版本管理。本文将详细介绍如何在 macOS 系统上获…...
Jenkins 中 写 shell 命令执行失败,检测失败问题
由于项目的 依赖复杂,随着版本的增多,人工操作,手误几率太大,我们选取kenins 来自动化发布、更新。 这里主要解决,发布 的 每个阶段,确保每个阶段执行成功。 比如: js 运行,…...

Java程序打包成exe,无Java环境也能运行
Java程序开发完成后,通常情况下以jar包的形式发布。但有时我们需要给非软件开发人员使用程序,如制作好窗体应用,把它发给没有java开发环境的人使用,此时就需要制作exe安装包。本文介绍如何将java程序制作成exe安装包,并…...

【java 正则表达式 笔记】
文章目录 快速入门匹配中文或数字或大小写字母(一个或多个) 正则表达式底层实现(重要)mather.find() 完成的任务mather.group(0) 分析 正则表达式基本语法元字符转义字符区分大小写限定字符选择匹配符特殊字符字符匹配符定位符 分组、捕获和反向引用捕获特别分组反向引用经典结…...

基于PWLCM混沌映射的麋鹿群优化算法(Elk herd optimizer,EHO)的多无人机协同路径规划,MATLAB代码
一、麋鹿群优化算法EHO 基本概念 麋鹿群优化算法(EHO,Elephant Herding Optimization)是2024年提出的一种启发式优化算法,它的灵感来自麋鹿群的繁殖过程。麋鹿有两个主要的繁殖季节:发情和产犊。在发情季节࿰…...

Vue2五、自定义指令,全局局部注册、指令的值 ,插槽--默认插槽,具名插槽 ( 作用域插槽)
一、自定义指令 使用步骤 1. 注册 (全局注册 或 局部注册) ,在 inserted 钩子函数中,配置指令dom逻辑 2. 标签上 v-指令名 使用 1、自定义指令(全局) Vue.directive("指令名",{ 指令的配置项 insert…...

Pika Labs技术浅析(五):商业智能技术
Pika Labs 的商业智能旨在通过联机分析处理(OLAP)和数据仓库(Data Warehouse)等技术,帮助企业用户高效地进行数据分析和决策支持。 一、商业智能技术模块概述 Pika Labs 的商业智能技术模块旨在通过集成数据仓库和联机…...

YOLO-World:Real-Time Open-Vocabulary Object Detection
目录 摘要 Abstract YOLO-World 1 模型架构 1.1 Text Encoder 1.2 YOLO Backbone 2 RepVL-PAN 2.1 T-CSPLayer 2.2 I-Pooling Attention 2.3 预测 3 消融实验 3.1 预训练数据 3.2 RepVL-PAN的消融实验 3.3 文本编码器 4 效果展示 4.1 零样本 4.2 根据词汇表检…...

Fastjson <= 1.2.47 反序列化漏洞复现
0x01 前言 Fastjson 是一个 Java 语言编写的高性能功能完善的 JSON 库,可以将 Java 对象转换为 JSON 格式,也可以将 JSON 字符串转换为 Java 对象,在中国和美国使用较为广泛。 0x02 漏洞成因 Fastjson < 1.2.68 版本在处理反序列化对象时…...

鸿蒙项目云捐助第二十一讲云捐助项目物联网IoT模拟器的使用
鸿蒙项目云捐助第二十一讲云捐助项目物联网IoT模拟器的使用 在前面的内容中,已经实现了云捐助物联网IoT的产品及设备设置,并且使用华为云Iot设备的在线调试工具进行命令下发的调试,这里也可以通过华为Iot物联网提供的MQTT模拟器进行连接。 …...

大数据技术原理与应用期末复习-知识点(二)
HBASE Hbase与传统关系数据库的对比分析 1.数据类型: 关系型数据库采用关系模型 Hbase采用更简单的数据模型(把数据存储为未经解释的字符串) 2.数据操作: 关系数据库:增删改查等 Hbase:插入 查询 删…...

高效准确的PDF解析工具,赋能企业非结构化数据治理
目录 准确性高:还原复杂版面元素 使用便捷:灵活适配场景 贴心服务:快速响应机制 在数据为王的时代浪潮中,企业数据治理已成为组织优化运营、提高竞争力的关键。随着数字化进程的加速,企业所积累的数据量呈爆炸式增长…...

C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
一、介绍 栈和队列是限定插入和删除只能在表的“端点”进行的线性表,是线性表的子集,是插入和删除位置受限的线性表。 (操作受限的线性表) 二、栈 1)概念: 栈(stack)是一个特殊的线性表,是限…...
读书笔记~管理修炼-缄默效应
缄默效应:学会正确批评下属 员工明明犯了错误,却不及时告知你,总是拖到最后一刻无法弥补时才不得不承认出了问题——你遇到过这样的问题吗? 这其实是缄默效应在发挥作用。 在职场中,即使再扁平化的环境&…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...