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>

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

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

相关文章

Windows10安装配置nodejs环境

一、下载 下载地址&#xff1a;https://nodejs.cn/download/ ​ 二、安装 1、找到node-v16.17.0-x64.msi安装包, 根据默认提示安装, 过程中间的弹窗不勾选 2、安装完成后, 打开powershell(管理员身份) ​ 3、命令行输入 node -v 和 npm -v 如下图所示则nodejs安装成功 ​ 三…

A27 STM32_HAL库函数 之 IRDA通用驱动 -- B -- 所有函数的介绍及使用

A27 STM32_HAL库函数 之 IRDA通用驱动 -- B -- 所有函数的介绍及使用 1 该驱动函数预览1.11 HAL_IRDA_DMAPause1.12 HAL_IRDA_DMAResume1.13 HAL_IRDA_DMAStop1.14 HAL_IRDA_Abort1.15 HAL_IRDA_AbortTransmit1.16 HAL_IRDA_AbortReceive1.17 HAL_IRDA_Abort_IT1.18 HAL_IRDA_A…

JavaScript Promise与async/await

Promise与async/await 为什么要使用他们如何使用.then() 和.catch()如何将相同的代码转换成sync和Await关键字 为什么要使用他们 前面学习了JavaScript的简单类型&#xff08;例如 数字和字符串&#xff09;&#xff0c;我们的代码会按顺序从上往下执行 console.log(1111); c…

并发编程之ConcurrentHashMap源码分析

1. 主源码逻辑 final V putVal(K key, V value, boolean onlyIfAbsent) {if (key null || value null) throw new NullPointerException();// 1.计算key对应的hashint hash spread(key.hashCode());int binCount 0;// 2. 进行自旋 for (Node<K,V>[] tab table;;) {N…

Win11启用HyperV

Win11启用HyperV 编辑一个txt&#xff0c;输入下面的指令 pushd "%~dp0"dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txtfor /f %%i in (findstr /i . hyper-v.txt 2^>nul) do dism /online /norestart /add-package:"%SystemRoot%…

PLC中连接外部现场设备和CPU的桥梁——输入/输出(I/O)模块

输入&#xff08;Input&#xff09;模块和输出&#xff08;Output&#xff09;模块简称为I/O模块&#xff0c;数字量&#xff08;Digital&#xff0c;又称为开关量&#xff09;输入模块和数字量输出模块简称为DI模块和DQ模块&#xff0c;模拟量&#xff08;Analog&#xff09;输…

第3章 数据

第3章 数据 学习笔记书后练习问题3问题7问题10问题11问题21 学习笔记 value value - 0; 通常用于将字符转换为其对应的整数值enum Jar_Type { CUP, PINT, QUART, HALF_GALLON, GALLON }; 这些符号名的实际值都是整型值&#xff0c;例如&#xff0c;CUP 是0&#xff0c;PINT …

Android安卓写入WIFI热点自动连接NDEF标签

本示例使用的发卡器&#xff1a;Android Linux RFID读写器NFC发卡器WEB可编程NDEF文本/网址/海报-淘宝网 (taobao.com) package com.usbreadertest;import android.os.Bundle; import android.view.MenuItem; import android.view.View; import android.widget.EditText; impo…

JAVA算法训练营打卡总结

目录 初心 目标 挑战 总结 初心 过完年后&#xff0c;突然发现自毕业后到现在已经工作将近两年&#xff0c;在这段时间中除了工作和备考软考外&#xff0c;也就是算法偶尔的刷几道&#xff0c;其它没有什么实际上的提升。 抱着现在的时间不去提升那以后就更没时间提升的心…

LabVIEW频谱感知实验平台

LabVIEW频谱感知实验平台 在当前的通信网络中&#xff0c;频谱资源的高效利用成为了研究和实践的重要方向之一。随着无线通信技术的快速发展&#xff0c;传统的固定频谱分配策略已无法满足日益增长的通信需求&#xff0c;因此&#xff0c;频谱感知技术作为认知无线电的核心组成…

Zed 捕获图像+测距

Zed 捕获图像测距 1. 导入相关库2. 相机初始化设置3. 获取中心点深度数据4. 计算中心点深度值5. 完整代码5. 实验效果 此代码基于官方代码基础上进行改写&#xff0c;主要是获取zed相机深度画面中心点的深度值&#xff0c;为yolo测距打基础。 1. 导入相关库 import pyzed.sl …

iview中基于upload源代码组件封装更为完善的上传组件

业务背景 最近接了一个用iview为基础搭建的vue项目&#xff0c;在开需求研讨会议的时候&#xff0c;我个人提了一个柑橘很合理且很常规的建议&#xff0c;upload上传文件支持同时上传多个并且可限制数量。当时想的是这不应该很正常吗&#xff0c;但是尴尬的是&#xff1a;只有…

【Proteus】蜂鸣器播放音乐

按键按一次&#xff0c;蜂鸣器响一次 &#xff0c;LCD1602同步。 #include <REGX52.H> #include <INTRINS.H>unsigned int keynum; sbit RSP3^0; //** sbit RWP3^1; //** sbit EP3^2; //** sbit buzzerP1^5; void delay(unsigned int n)//1ms {unsigned char a,…

SpringMVC接收参数方式讲解

PathVariable 该注解用于接收具有Restful风格的参数&#xff0c;如/api/v1/1001&#xff0c;最终userId的值为1001。 如下代码中&#xff0c;使用name属性可以指定GetMapping中的id名称与之对应&#xff0c;从而可以自定义参数名称userId&#xff0c;而不是使用默认名称id G…

虹科Pico汽车示波器 | 免拆诊断案例 | 2016款保时捷911 GT3 RS车发动机异响

一、故障现象 一辆2016款保时捷911 GT3 RS车&#xff0c;搭载4.0 L水平对置发动机&#xff08;型号为MA176&#xff09;&#xff0c;累计行驶里程约为4.2万km。车主反映&#xff0c;1星期前上过赛道&#xff0c;现在发动机有“哒哒”异响。 二、故障诊断 接车后试车&#xff…

51.基于SpringBoot + Vue实现的前后端分离-校园志愿者管理系统(项目 + 论文)

项目介绍 本站是一个B/S模式系统&#xff0c;采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的校园志愿者管理系统设计与实现管理工…

正则表达式中 “$” 并不是表示 “字符串结束”

△△请给“Python猫”加星标 &#xff0c;以免错过文章推送 作者&#xff1a;Seth Larson 译者&#xff1a;豌豆花下猫Python猫 英文&#xff1a;Regex character “$” doesnt mean “end-of-string” 转载请保留作者及译者信息&#xff01; 这篇文章写一写我最近在用 Python …

C++ 内存分区管理

一、栈区&#xff08;Stack&#xff09; 栈区用来存储函数的参数值、局部变量的值等数据。栈区是自动分配和释放的&#xff0c;函数执行时会在栈区分配空间&#xff0c;函数执行结束时会自动释放这些空间。栈区的数据是连续分配的&#xff0c;由系统自动管理。 注意事项&…

普通人赚钱途径大盘点:从搬砖到玩转智慧,财富之路任你探索

在生活的大舞台上&#xff0c;每个人都在以自己的方式演绎着赚钱的故事。作为普通人&#xff0c;我们或许没有显赫的财富背景&#xff0c;但赚钱的途径却是多种多样&#xff0c;等待我们去发掘。今天&#xff0c;就让我来为大家盘点一下普通人赚钱的常见途径&#xff0c;看看哪…

P2483 【模板】k 短路 / [SDOI2010] 魔法猪学院

题目&#xff1a; 题目背景 注&#xff1a;对于 kk 短路问题&#xff0c;A* 算法的最坏时间复杂度是 O(nk \log n)O(nklogn) 的。虽然 A* 算法可以通过本题原版数据&#xff0c;但可以构造数据&#xff0c;使得 A* 算法在原题的数据范围内无法通过。事实上&#xff0c;存在使用…