Mybatis之参数处理
在MyBatis中,参数处理是非常关键的部分,它负责将传入的参数正确映射到SQL语句中
单个简单类型参数
简单类型对于mybatis来说都是可以自动类型识别的:
-
也就是说对于mybatis来说,它是可以自动推断出ps.setXxxx()方法的。ps.setString()还是ps.setInt()。它可以自动推断。
简单类型包括:
-
byte short int long float double char
-
Byte Short Integer Long Float Double Character
-
String
-
java.util.Date
-
java.sql.Date
参数自动绑定:
在执行 SQL 时,MyBatis 会根据参数的类型自动绑定到 PreparedStatement 对应的 setXxx() 方法。
示例:
public interface UserMapper {User getUserById(int id);
}
SQL 映射文件:
<select id="getUserById" resultType="User">SELECT * FROM user WHERE id = #{id}
</select>
在执行时,MyBatis 自动判断 id 是 int 类型,因此会使用 PreparedStatement.setInt() 方法。
多个参数处理(使用@Param注解)
如果一个方法有多个参数,你可以使用 @Param 注解给参数命名,方便在 SQL 中引用:
示例:
/*** 根据name和age查询* @param name* @param age* @return*/List<Student> selectByNameAndAge(@Param(value="name") String name, @Param("age") int age);
value值可以省略不写
SQL映射文件:
<select id="selectByNameAndAge" resultType="student">select * from t_student where name = #{name} and age = #{age}</select>
Java对象作为参数
查找:
你也可以将 Java 的对象传递给 MyBatis 方法,MyBatis 会自动将对象的属性与 SQL 中的字段进行映射:
public interface UserMapper {User getUserByObject(User user);
}
SQL映射文件:
<select id="getUserByObject" resultType="User">SELECT * FROM user WHERE name = #{name} AND age = #{age}
</select>
这里 #{name} 和 #{age} 会自动对应 User 对象中的 name 和 age 属性。
使用pojo类保存数据 :
/*** 保存学生数据* @param student 实体类pojo* @return*/int insertPojo(Student student);
sql映射文件:
<!-- pojo#{}里面写的是属性名--><insert id="insertPojo" parameterType="mybatis.pojo.Student">insert into t_student (id, name, age, sex, birth, height)values (#{id}, #{name}, #{age}, #{sex}, #{birth}, #{height})</insert>
测试类:
@Testpublic void testInsertPojo(){Student student = new Student("小李子",23,1.67,new Date(),'男');SqlSession sqlSession = SqlSessionUtil.openSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);mapper.insertPojo(student);sqlSession.commit();sqlSession.close();}
易错:
注意这里我的student类中存在不含有id的构造方式(也就是构造方式的重载),因为我id设置了自增主键,所以可以不需要指定id值,这里不能传入null会报错!!!
Map 作为参数
查找
/**
* 根据name和age查询
* @param paramMap
* @return
*/
List<Student> selectByParamMap(Map<String,Object> paramMap);
测试类:
@Test
public void testSelectByParamMap(){// 准备MapMap<String,Object> paramMap = new HashMap<>();paramMap.put("nameKey", "张三");paramMap.put("ageKey", 20);List<Student> students = mapper.selectByParamMap(paramMap);students.forEach(student -> System.out.println(student));
}
sql映射文件:
<select id="selectByParamMap" resultType="student">select * from t_student where name = #{nameKey} and age = #{ageKey}
</select>
这种方式是手动封装Map集合,将每个条件以key和value的形式存放到集合中。然后在使用的时候通过#{map集合的key}来取值。
通过map来保存数据到表格中
/*** 保存学生数据* @param paramMap 使用map进行传参*/void insertStudent(Map<String, Object> paramMap);
sql映射文件:
<!--这里设置自增主键(创建表格时也需要声明是自增主键),id值就可以传null值了,否则会报错--><insert id="insertStudent" parameterType="map" useGeneratedKeys="true" keyProperty="id">insert into t_student (id, name, age, sex, birth, height)values (null,#{name}, #{age}, #{sex}, #{birth}, #{height})</insert>
java测试类:
public void testInsertMapParam() {// 准备 MapMap<String, Object> paramMap = new HashMap<>();paramMap.put("name", "张三");paramMap.put("age", 20);paramMap.put("sex", '女'); paramMap.put("birth", new java.sql.Date(new Date().getTime())); // 使用 java.sql.DateparamMap.put("height", 1.85);SqlSession sqlSession = SqlSessionUtil.openSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);mapper.insertStudent(paramMap);sqlSession.commit();sqlSession.close();}
易错点:
如果不设置自增主键而且sql映射文件上面id值为null就会报错!!所以一定要记得设置自增主键
相关文章:
Mybatis之参数处理
在MyBatis中,参数处理是非常关键的部分,它负责将传入的参数正确映射到SQL语句中 单个简单类型参数 简单类型对于mybatis来说都是可以自动类型识别的: 也就是说对于mybatis来说,它是可以自动推断出ps.setXxxx()方法的。ps.setSt…...
windows内核探索--打印windows的GDT表(全局描述符表)
x86 #include <windows.h> #include<stdio.h> #include "x86struct.h" void PrintSegmentDescriptor(ULONG64* sd, WORD Count); SegmentSelector GetSegmentSelector(USHORT Selector); int main() {printf("0环cs段寄存器 ");GetSegmentSel…...
【ChatGPT】让ChatGPT帮助进行头脑风暴与创意生成
让ChatGPT帮助进行头脑风暴与创意生成 在日常工作和生活中,创意和头脑风暴是解决问题、创新和推动项目的关键步骤。ChatGPT,作为一个强大的语言模型,不仅可以提供信息和答案,还可以成为强大的头脑风暴工具,帮助用户快…...
大数据处理随堂测试
HDFS MapReduce HBase Spark...
2024最新pycharm安装教程及基本使用(超详细,新手小白必看)
文章目录 前言一、官网下载二、安装步骤三、使用示范四、番外篇(汉)大纲 PythonPyCharm安装包领取方式戳‘这块里’ 前言 一、官网下载 1. 进入pycharm官网,点击下载 PyCharm: The Python IDE for data science and web development by J…...
三国杀钓鱼自动化
三国杀钓鱼脚本 前言 本来是想做必杀的,但是后来测试了大约400钓发现纯靠连点没有漏掉的鱼,所以必杀功能就舍弃了。 我pyinstaller打包后运行.exe居然黑屏了???可能是多进程报错处理没写好,反正还是用vsc…...
在pycharm中使用sqllite
在pycharm中使用sqllite sqllite 简介 SQLite 是一个开源的、轻量级的、关系型数据库管理系统(RDBMS),它设计用于嵌入到应用程序中,并且可以在无需外部服务器进程的情况下运行。SQLite 提供了完整的 SQL 语言支持,允…...
Linux——文件操作
前言 1)在Linux下面,一切皆文件,文件文件内容文件属性 2)在访问文件是,都得先将文件打开,修改文件的本质其实还是通过执行代码的形式修改。 3)文件是被进程打开的,一个进程可以打…...
数据结构 ——— 数组栈oj题:有效括号
目录 题目要求 代码实现 题目要求 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每…...
Character AI被起诉!14岁青少年自杀,AI陪伴何去何从
终于,AI在青少年心理问题方面,被推上了风口浪尖。 最近,美国佛罗里达州,一名14岁男孩Sewell Setzer的父母控告Character AI公司,声称孩子沉迷该公司的AI聊天机器人,最后走上了自杀的道路。 跟AI聊天还能致…...
CSS3 动画相关属性实例大全(三)(columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性)
CSS3 动画相关属性实例大全(三) (columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性) 本文目录: 一、columns属性(设置元素的列宽和列数) 二、filter属性(调整图像、背景和边…...
中国最厉害的思想家改名大师颜廷利:以诚信为基,塑企业信誉
跨文化融合,共筑包容性文化殿堂。尊重差异,促进团队合作,以诚信为基,塑企业信誉。融合《升命学说》智慧,推动员工多元化,践行社会责任,树立良好形象。创新不息,持续学习,…...
Python 代码实现用于进行水质模拟和优化加氯量
# -*- coding:utf-8 -*- import epamodule as em import epanetmsxmodule as msx import pandas as pd import numpy as np# 水质模拟,会产生一个rpt文件,但并不是返回这个文件。 def quality_simulation(inp_file,rpt_file,msx_file...
挖矿病毒来势汹汹
病毒来了, 我的个人站点使用了 wordpress, 它的不知哪个漏洞让黑客攻入了我的站点 使用 top 命令看到了有不明进程始终占据了 100% 的 CPU snapshot 1 snapshot 2 通过以下 "三板斧"可以查杀这个进程 先用 top (shiftp) 查找占据 CPU 最多的进程根据其进程号 pid 查看…...
国产数据库的蓝海在哪?
昨天有幸参加了 OceanBase2024年度发布会。在过去的几年中,OB 作为国内自主研发的分布式数据库,取得了令人瞩目的成就,特别是在金融行业,OB 通过不断的技术革新和优化,已经成为行业的领导者之一。OceanBase 展现了强大…...
MySQL~表的操作(创建表,查看表,修改表,删除表)
1.创建表 1.1.创建表 首先要选择需要操作的数据库,USE 数据库名,后续可以根据实际情况操作时添加。 USE fruitsales;建表语法: create table 表名( 字段名1 数据类型, 字段名2 数据类型, ); 实例:创建fruit_bak1表。 create t…...
多线程加锁与手搓智能指针实践
前缀知识 如何手搓智能指针 参考链接 如何多线程加锁,线程间通信 参考链接 注意: 在第一个链接中,重载赋值构造函数时,返回值类型为引用类型,仅适用于返回的这个对象, 在该函数调用前 (已经)存在了!!! 具体可参考 参考…...
3180. 执行操作可获得的最大总奖励 I
力扣刷题记录 dp 回溯 3180. 执行操作可获得的最大总奖励 I 思路 和往常一样,先使用暴力求解,想到了回溯算法,选择了当前数字,就跳到下一个数字,形成一个树形结构来遍历所有结果集合,但是没有找到优化算…...
react18中的jsx 底层渲染机制相关原理
jsx 底层渲染机制 渲染 jsx 时,会先解析 jsx,生成一个虚拟 dom(virtual dom)。然后将虚拟 dom 渲染成真实 dom。如果 jsx 中包含事件,会将事件绑定到真实 dom 上。 虚拟 dom 对象,是框架内部构建的一套对象体系,对象…...
Spring Boot 实现文件上传下载功能
文章目录 一、原理分析1.1 请求类型1.2 服务器解析 二、功能实现2.1 创建项目并导入依赖2.2 文件上传功能实现2.2.1 文件上传 Service2.2.2 文件上传 Controller 2.3 文件下载功能实现2.3.1 文件下载 Service2.3.2 文件下载 Controller 2.4 文件上传前端代码(可选)2.4.1 上传文…...
国产多模态大模型:产业协同全景与实战指南
国产多模态大模型:产业协同全景与实战指南 引言 在人工智能浪潮席卷全球的背景下,国产多模态大模型正从技术探索迈向广泛的产业协同应用。与只能处理文本或图像的单一模态模型相比,多模态大模型能同时理解、关联和生成文本、图像、音频、视频…...
G-Helper深度解析:华硕笔记本的终极轻量级控制方案
G-Helper深度解析:华硕笔记本的终极轻量级控制方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Exper…...
终极免费方案:如何用Wand-Enhancer解锁WeMod高级功能完整指南
终极免费方案:如何用Wand-Enhancer解锁WeMod高级功能完整指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 你是否厌倦了WeMod免费版的种种…...
别再只认Revit了!盘点7种主流BIM数据格式(RVT/IFC/FBX...)的优缺点与选型指南
建筑数字化进阶指南:7大BIM数据格式深度解析与实战选型策略 在建筑信息模型(BIM)与地理信息系统(GIS)加速融合的今天,数据格式的选择直接影响着项目协同效率与成果交付质量。当设计院的Revit模型需要与施工…...
从零到一:FOFA搜索引擎实战语法精解与场景化应用
1. FOFA搜索引擎:网络空间测绘的"瑞士军刀" 第一次接触FOFA时,我正为一个企业客户做资产梳理。客户自己都说不清有多少对外暴露的服务器,传统扫描工具又慢又容易被防火墙拦截。同事扔给我一个FOFA搜索语句:"domain…...
ZYNQ启动太慢?从FSBL到U-Boot的完整性能分析与优化实战
ZYNQ启动太慢?从FSBL到U-Boot的完整性能分析与优化实战 在嵌入式系统开发中,启动时间往往是衡量产品性能的关键指标之一。对于基于Xilinx ZYNQ平台的产品,从按下电源键到系统完全就绪,这中间经历的毫秒级延迟可能决定着一个工业控…...
实验室新到Franka机器人?保姆级Ubuntu20.04+ROS Noetic配置避坑指南
Franka机器人开箱配置全攻略:Ubuntu 20.04与ROS Noetic深度适配指南 当实验室那台崭新的Franka Emika机械臂拆箱时,整个团队都围了上来——这台价值不菲的协作机器人即将成为我们最重要的研究伙伴。但很快我们就发现,从开箱到真正让机械臂流畅…...
别再死记硬背了!PADS Logic/Layout/Router这三个界面,到底该怎么分工协作?
PADS三剑客协作指南:从原理图到PCB的高效设计流 在电子设计自动化(EDA)领域,Mentor Graphics(现为Siemens EDA)的PADS系列工具以其专业性和高效性著称。然而,许多初学者常陷入一个误区——将PAD…...
通过curl命令快速测试Taotoken的ChatGPT接口是否通畅
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过curl命令快速测试Taotoken的ChatGPT接口是否通畅 对于开发者而言,在集成大模型API时,一个快速、直接的…...
避坑指南:Tina Linux下MIPI DSI与LVDS屏调试的那些‘坑’(以V853/D1s为例)
Tina Linux下MIPI DSI与LVDS屏调试实战避坑指南(V853/D1s开发板为例) 1. 高速差分接口调试的"死亡陷阱" 当V853开发板首次连接那块7英寸MIPI屏时,我遭遇了职业生涯最诡异的显示故障——屏幕上半部正常显示,下半部却呈现…...
