当前位置: 首页 > news >正文

mybatis(5)参数处理+语句查询

参数处理+语句查询

  • 1、简单单个参数
  • 2、Map参数
  • 3、实体类参数
  • 4、多参数
  • 5、@Param注解
  • 6、语句查询
    • 6.1 返回一个实体类对象
    • 6.2 返回多个实体类对象 List<>
    • 6.3 返回一个Map对象
    • 6.4 返回多个Map对象 List<Map>
    • 6.5 返回一个大Map
    • 6.6 结果映射
      • 6.6.1 使用resultMap
      • 6.6.2 驼峰式映射

1、简单单个参数

简单类型包括:
● byte short int long float double char
● Byte Short Integer Long Float Double Character
● String
● java.util.Date
● java.sql.Date

总而言之就是 mybaits可以自动匹配参数类型,之后通过setXXX来注入。
我们也可以显示标注类型,省去mybatis的类型匹配。
比如 char 类 我们可以通过parameterType 来告诉mybatis 参数类型是什么,其他基本数据类型都一样,不在举例。

 <select id="selectbysex" resultType="student" parameterType="java.lang.Character">select *from t_student where sex=#{sex}</select>

2、Map参数

注意的是 我们传的如果是map,则我们#{map的key值},不能是其他的。

    <select id="selectBYmap" resultType="student">select * from t_student where name=#{namekey} and age=#{agekey}</select>
   @Testpublic  void testMap(){SqlSession sqlSession = MybatisUtils.openSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);Map<String,Object> map=new HashMap<>();map.put("namekey","cky");map.put("agekey",18);mapper.selectBYmap(map).forEach(student -> System.out.println(student));sqlSession.close();}

3、实体类参数

注意:如果我们传的是实体类,则#{},{}里应该是实体类的属性名,不能是其他。

 <select id="selectByclass" resultType="student">select * from t_student where name=#{name} and age=#{age}</select>
   @Testpublic  void testClass(){SqlSession sqlSession = MybatisUtils.openSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);Student student=new Student();student.setAge(18);student.setId(10L);student.setBirth(new Date());student.setHeight(1.65);student.setSex('女');student.setName("c");mapper.selectByclass(student).forEach(stu -> System.out.println(stu));sqlSession.close();}

4、多参数

传入多参数时,其实mybatis底层是帮我们封装成了map集合。

使用arg

    List<Student> selectNameandSex2(String name, Character sex);
    <select id="selectNameandSex2" resultType="student">select * from t_student where name=#{arg0} and sex=#{arg1}</select>
   @Testpublic  void testarg(){SqlSession sqlSession = MybatisUtils.openSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);mapper.selectNameandSex2("cky",'女').forEach(student -> System.out.println(student));sqlSession.close();}

使用param

    <select id="selectNameandSex2" resultType="student">select * from t_student where name=#{param1} and sex=#{param2}</select>

两者联合使用

    <select id="selectNameandSex2" resultType="student">select * from t_student where name=#{param1} and sex=#{arg1}</select>

这里例子 就等同于帮我们封装了一个map集合
map(“arg0”,“cky”);map(“arg1”,18);map(“param1”,“cky”);map(“param2”,18);
args从0开始,param参数从1开始。
两个都在map中。

5、@Param注解

如果我们想要使用自己标注的名字,就要使用@Param注解。

   List<Student> selectNameandSex(@Param("name1") String name,@Param("sex1") Character sex);
   <select id="selectNameandSex" resultType="student">select * from t_student where name=#{name1} and sex=#{sex1}</select>

使用了param注解,底层也是帮我们封装成了map集合,但是是将我们自己定义的名字封装为key,且这里argx不能再用,但是paramx仍可以使用。
就相当于帮我们封装成
map(“param1”,“cky”);map(“param2”,18);map(“name1”,“cky”);map(“sex1”,18);

6、语句查询

6.1 返回一个实体类对象

根据id查找时,我们查找的对象正好有对应的实体类,则我们可以直接返回一个实体类对象

 <select id="selectByid" resultType="car">select * from t_car where id=#{id}</select>
    @Testpublic void testid1(){SqlSession sqlSession = MybatisUtils.openSession();CarMapper mapper = sqlSession.getMapper(CarMapper.class);Car car = mapper.selectByid(2);System.out.println(car);sqlSession.close();}

在这里插入图片描述

6.2 返回多个实体类对象 List<>

 <select id="selectAllCar" resultType="Car">select id,car_num,brand,guide_price,produce_time,car_type from t_car ;</select>
  @Testpublic void tesr(){SqlSession sqlSession = MybatisUtils.openSession();//getMapper()  参数传入我们要代理的接口类 之后底层 会调用javassist 自动帮助我们生成 实现类 并将实现类返回 我们可以直接调用接口类的方法CarMapper mapper = sqlSession.getMapper(CarMapper.class);List<Car> cars = mapper.selectAllCar();cars.forEach(car -> System.out.println(car));sqlSession.close();}

在这里插入图片描述

6.3 返回一个Map对象

如果我们返回的对象在我们的项目中没有对应的实体类的话,我们可以使用map

    Map<String,Object> selectByID(int id);
    <select id="selectByID" resultType="map">select * from t_car where id=#{id}</select>
  @Testpublic void test1(){SqlSession sqlSession = MybatisUtils.openSession();//getMapper()  参数传入我们要代理的接口类 之后底层 会调用javassist 自动帮助我们生成 实现类 并将实现类返回 我们可以直接调用接口类的方法CarMapper mapper = sqlSession.getMapper(CarMapper.class);Map<String, Object> map = mapper.selectByID(2);System.out.println(map);sqlSession.close();}

使用map接收时,其key就是数据库的列名,并不是我们类的列名
在这里插入图片描述

6.4 返回多个Map对象 List

在这里插入图片描述

    List<Map<String,Object>> selectAllCar();
 <select id="selectAllCar" resultType="map">select * from t_car ;</select>
    @Testpublic void tesr(){SqlSession sqlSession = MybatisUtils.openSession();//getMapper()  参数传入我们要代理的接口类 之后底层 会调用javassist 自动帮助我们生成 实现类 并将实现类返回 我们可以直接调用接口类的方法CarMapper mapper = sqlSession.getMapper(CarMapper.class);List<Map<String, Object>> maps = mapper.selectAllCar();maps.forEach(car -> System.out.println(car));sqlSession.close();}

在这里插入图片描述

6.5 返回一个大Map

如果我们使用List的话,我们如果想找一个id=x的map就需要遍历找匹配值,我们可以定义一个大的Map,其key是每一个返回结果的id值,其value是每一个查询结果。
在这里插入图片描述

    @MapKey("id")Map<Integer,Map<String,Object>> selectmyMap();
    <select id="selectmyMap" resultType="map">select * from t_car</select>
 @Testpublic void test2(){SqlSession sqlSession = MybatisUtils.openSession();//getMapper()  参数传入我们要代理的接口类 之后底层 会调用javassist 自动帮助我们生成 实现类 并将实现类返回 我们可以直接调用接口类的方法CarMapper mapper = sqlSession.getMapper(CarMapper.class);Map<Integer, Map<String, Object>> integerMapMap = mapper.selectmyMap();System.out.println(integerMapMap);sqlSession.close();}

结果是一个大的map
{2={car_num=1000, id=2, guide_price=1000000.00, produce_time=2000-11-11, brand=宝马100, car_type=燃油车},
3={car_num=102, id=3, guide_price=40.30, produce_time=2014-10-05, brand=丰田mirai, car_type=氢能源},
4={car_num=102, id=4, guide_price=40.30, produce_time=2014-10-05, brand=丰田mirai, car_type=氢能源},
7={car_num=1002, id=7, guide_price=100.00, produce_time=2023-03-28, brand=五菱11, car_type=电车},
8={car_num=1000, id=8, guide_price=100.00, produce_time=2024-04-09, brand=1, car_type=dianche},
9={car_num=1000, id=9, guide_price=100.00, produce_time=2024-04-09, brand=1, car_type=dianche}}

6.6 结果映射

查询结果的列名和java对象的属性名对应不上怎么办?
● 第一种方式:as 给列起别名
● 第二种方式:使用resultMap进行结果映射
● 第三种方式:是否开启驼峰命名自动映射(配置settings)

不知道为什么 ,我没有起过别名,也没有进行自动映射,但是如果我用一个实体类接收,他自动帮我转成了实体类的属性名。

6.6.1 使用resultMap

<!--resultMap:id:这个结果映射的标识,作为select标签的resultMap属性的值。type:结果集要映射的类。可以使用别名。
-->
<resultMap id="carResultMap" type="car"><!--对象的唯一标识,官方解释是:为了提高mybatis的性能。建议写上。--><id property="id" column="id"/><result property="carNum" column="car_num"/><!--当属性名和数据库列名一致时,可以省略。但建议都写上。--><!--javaType用来指定属性类型。jdbcType用来指定列类型。一般可以省略。--><result property="brand" column="brand" javaType="string" jdbcType="VARCHAR"/><result property="guidePrice" column="guide_price"/><result property="produceTime" column="produce_time"/><result property="carType" column="car_type"/>
</resultMap><!--resultMap属性的值必须和resultMap标签中id属性值一致。-->
<select id="selectAllByResultMap" resultMap="carResultMap">select * from t_car
</select>

6.6.2 驼峰式映射

是否开启驼峰命名自动映射
使用这种方式的前提是:属性名遵循Java的命名规范,数据库表的列名遵循SQL的命名规范。
Java命名规范:首字母小写,后面每个单词首字母大写,遵循驼峰命名方式。
SQL命名规范:全部小写,单词之间采用下划线分割。
比如以下的对应关系:
在这里插入图片描述
如何启用该功能,在mybatis-config.xml文件中进行配置:

<!--放在properties标签后面-->
<settings><setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

相关文章:

mybatis(5)参数处理+语句查询

参数处理&#xff0b;语句查询 1、简单单个参数2、Map参数3、实体类参数4、多参数5、Param注解6、语句查询6.1 返回一个实体类对象6.2 返回多个实体类对象 List<>6.3 返回一个Map对象6.4 返回多个Map对象 List<Map>6.5 返回一个大Map6.6 结果映射6.6.1 使用resultM…...

数据应用OneID:ID-Mapping Spark GraphX实现

前言 说明 以用户实体为例&#xff0c;ID 类型包含 user_id 和 device_id。当然还有其他类型id。不同id可以获取到的阶段、生命周期均不相同。 device_id 生命周期通常指的是一个设备从首次被识别到不再活跃的整个时间段。 user_id是用户登录之后系统分配的唯一标识&#xff…...

第6章 6.2.3 : readlines和writelines函数 (MATLAB入门课程)

讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 在MATLAB的文本数据处理任务中&#xff0c;导入和导出文件是常…...

Matlab应用层生成简述

基础软件层 目前接触到的几款控制器&#xff0c;其厂商并没有提供simulink的基础软件库一般为底层文件被封装为lib&#xff0c;留有供调用API接口虽然能根据API接口开发基础软件库&#xff0c;但耗费时间过长得不偿失 应用层 所以可以将应用层封装为一个子系统&#xff0c;其…...

每日一题(leetcode1702):修改后的最大二进制字符串--思维

找到第一个0之后&#xff0c;对于后面的子串&#xff08;包括那个0&#xff09;&#xff0c;所有的0都能调上来&#xff0c;然后一一转化为10&#xff0c;因此从找到的第一个0的位置开始&#xff0c;接下来是&#xff08;后半部分子串0的个数-1&#xff09;个1&#xff0c;然后…...

PHP自助建站系统,小白也能自己搭建网站

无需懂代码&#xff0c;用 自助建站 做企业官网就像做PPT一样简单&#xff0c;您可以亲自操刀做想要的效果&#xff01; 自助建站是一款简单、快捷、高效的工具&#xff0c;可以帮助您制作响应式网站。我们的自助建站系统&#xff0c;将传统的编码工作转化为直观的拖拽操作和文…...

计算机视觉 | 基于 ORB 特征检测器和描述符的全景图像拼接算法

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目实现了基于 ORB 特征检测器和描述符的全景图像拼接算法&#xff0c;能够将两张部分重叠的图像拼接成一张无缝连接的全景图像。 文章目录 一、随机抽样一致算法二、功能实现三、代码解析四、效果展示五、完整代码 一、随机…...

Scala - 函数柯里化(Currying)

柯里化(Currying)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。 实例 首先我们定义一个函数: def add(x:Int,y:Int)xy 那么我们应用的时候&#xff0c;应该是这样用&#xff1a;add(1,2) 现在我们把这…...

Switch-case

Java switch case 语句 switch case 语句判断一个变量与一系列值中某个值是否相等&#xff0c;每个值称为一个分支。 语法 switch case 语句语法格式如下&#xff1a; switch(expression){case value ://语句break; //可选case value ://语句break; //可选//你可以有任意数量…...

蓝桥杯-单片机基础16——利用定时计数中断进行动态数码管的多窗口显示

综合查阅了网络上目前能找到的所有关于此技能的代码&#xff0c;最终找到了下述方式比较可靠&#xff0c;且可以自定义任意显示的数值。 传统采用延时函数的方式实现动态数码管扫描&#xff0c;在题目变复杂时效果总是会不佳&#xff0c;因此在省赛中有必要尝试采用定时计数器中…...

2024/4/5—力扣—下一个排列

代码实现&#xff1a; 思路&#xff1a;两遍扫描 void swap(int *a, int *b) {int t *a;*a *b;*b t; }void reverse(int *nums, int l, int r) {while (l < r) {swap(nums l, nums r);l;r--;} }void nextPermutation(int *nums, int numsSize) {int i numsSize - 2;wh…...

xss.pwnfunction-Ugandan Knuckles

这个是把<>过滤掉了所以只能用js的事件 ?weya"onfocus"alert(1337)" autofocus"...

LabVIEW和2D激光扫描的受电弓滑板磨耗精确测量

LabVIEW和2D激光扫描的受电弓滑板磨耗精确测量 在电气化铁路运输中&#xff0c;受电弓滑板的健康状况对于保障列车安全行驶至关重要。受电弓滑板作为连接电网与列车的直接介质&#xff0c;其磨损情况直接影响到电能的有效传输及列车的稳定运行。精确、快速测量受电弓滑板磨损情…...

Linux第87步_阻塞IO实验

阻塞IO是“应用程序”对“驱动设备”进行操作&#xff0c;若不能获取到设备资源&#xff0c;则阻塞IO应用程序的线程会被“挂起”&#xff0c;直到获取到设备资源为止。 “挂起”就是让线程进入休眠&#xff0c;将CPU的资源让出来。线程进入休眠后&#xff0c;当设备文件可以操…...

C/C++基础----常量和基本数据类型

HelloWorld #include <iostream>using namespace std;int main() {// 打印cout << "Hello,World!" << endl;return 0; }c/c文件和关系 c和c是包含关系&#xff0c;c相当于是c的plus版本c的编译器也可以编译c语言c文件.cpp结尾.h为头文件.c为c语言…...

什么是生成式AI?有哪些特征类型

生成式AI是人类一种人工智能技术&#xff0c;可以生成各种类型的内容&#xff0c;包括文本、图像、音频和合成数据。那么什么是人工智能&#xff1f;人工智能和机器学习之间的区别是什么&#xff1f;有哪些技术特征&#xff1f; 人工智能是一门学科&#xff0c;是计算机科学的一…...

《Linux C/C++服务器开发实践》之第7章 服务器模型设计

《Linux C/C服务器开发实践》之第7章 服务器模型设计 7.1 I/O模型7.1.1 基本概念7.1.2 同步和异步7.1.3 阻塞和非阻塞7.1.4 同步与异步和阻塞与非阻塞的关系7.1.5 采用socket I/O模型的原因7.1.6&#xff08;同步&#xff09;阻塞I/O模型7.1.7&#xff08;同步&#xff09;非阻…...

SSH穿透ECS访问内网RDS数据库

处于安全考虑&#xff0c;RDS一般只会允许指定的IP进行访问&#xff0c;而我们开发环境的IP往往是动态的&#xff0c;每次IP变动都需要去修改RDS的白名单&#xff0c;为我们的工作带来很大的不便。 那么如何去解决这个问题&#xff1f; 假如我们有一台ESC服务器&#xff0c;E…...

python 有哪些函数

Python内置的函数及其用法。为了方便记忆&#xff0c;已经有很多开发者将这些内置函数进行了如下分类&#xff1a; 数学运算(7个) 类型转换(24个) 序列操作(8个) 对象操作(7个) 反射操作(8个) 变量操作(2个) 交互操作(2个) 文件操作(1个) 编译执行(4个) 装饰器(3个) …...

ubuntu web端远程桌面控制

本方案采用x11vncnovnc来实现x11vnc的安装和配置可以参考UOS搭建VNC及连接教程_uos安装vnc-CSDN博客;并把/lib/systemd/system/x11vnc.service内容修改为如下: [Unit]DescriptionStart x11vnc at startup.Aftermulti-user.target[Service]TypesimpleExecStart/usr/bin/x11vnc …...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

32单片机——基本定时器

STM32F103有众多的定时器&#xff0c;其中包括2个基本定时器&#xff08;TIM6和TIM7&#xff09;、4个通用定时器&#xff08;TIM2~TIM5&#xff09;、2个高级控制定时器&#xff08;TIM1和TIM8&#xff09;&#xff0c;这些定时器彼此完全独立&#xff0c;不共享任何资源 1、定…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示&#xff0c;全球市场规模预计在 2031 年达到 9848 万美元&#xff0c;2025 - 2031 年期间年复合增长率&#xff08;CAGR&#xff09;为 3.7%。在竞争格局上&#xff0c;市场集中度较高&#xff0c;2024 年全球前十强厂商占据约 74.0% 的市场…...