JavaEE简单示例——<select>中的查询参数传递和结果集封装自动映射关系

news2024/11/28 18:35:19

简单介绍:

在之前我们在讲SQL映射文件中的映射查询语句的<select>标签的时候,对其中的四个常用属性的讲解并不是那么的透彻,今天就来详细的解释<select>的四个常用属性的具体含义以及<select>标签在进行查询的时候查询参数是如何传递的,以及查询出结果后是如何自动映射的。

使用方法:

<select id="SQL语句的唯一标识" resultType="传入参数类型" parameterType="结果集封装实体类">

        select * from user where id = #{id}

</select>

我们对上面的每一个属性进行比较详细的讲解:

id:

在同一个命名空间下,这条SQL语句的唯一标识。在同一命名空间下,这个值不能重复,但是在不同的命名空间下,这个值是可以重复的。命名空间的概念就相当于Java中的类名,而id的值就相当于是类名,通过包名+类名的方式可以在所有文件中精确定位一条唯一的SQL映射语句

resultType:

翻译过来就是结果类型。表示当这条SQL语句查询完成之后返回的结果将要封装到哪一个POJP实体类中,如果之前配置过别名映射,这个地方填的就是POJO类的短别名,如果没有配置别名映射,这个地方填的就是POJO类的全限定类名。全限定类名就是包名+类名的方式定位唯一的类。

parameterType:

翻译过来就是参数类型。在我们的查询语句中会有一些参数是外部引用的,也就是使用#{}的方式,在花括号里面会有一些从外部引用的参数,这种#{}的写法在XML文件中表示引用外部的变量,而这个变量的来源就是取自于parameterType的值。

代码实现:

首先,我们就来实现一个非常简单的,根据id查询相应的数据,我们这次不使用接口化开发,而是使用最原本的MyBatis给我们提供的API来完成查询的动作:

 

 

可以看到,只要我们正确的配置SQL映射文件和MyBatis核心配置文件的<mappers>属性,以及在查询的时候正确的使用命名空间.唯一标识的方式正确的引用SQL语句,以及传递正确的参数,就能正确的查询出想要的结果,而我们这次讨论的问题在于两个。

1.我们的参数经历了什么?

2.他是怎么做到把MySQL的数据表信息和Java中的类映射到一起的。

文字讲解:

首先就是我们传递的参数经历了什么?

在我们编写SQL映射语句的时候,parameterType属性值对应的是我们的参数类型,上面我们写的是Int类型,也就是数字整形,那么这个参数从哪里来?

它来自于这里,也就是我们的查询方法的第二个参数,我们回想一下对于查询方法的参数介绍。第一个参数表示SQL映射语句的唯一标识,第二个参数就是我们在查询的时候会使用到的参数。所以这个参数的类型就是我们parameter的值,具体的值就是我们在调用方法的时候传进去的值,传进去之后它去了哪了呢?

去了这里。之前我们说狗,#{}这种写法表示引用外部的数据,这个外部的数据就是我们传递的参数,如果这个参数的类型和我们预设的数据类型不符合,也就是我们传入的参数的数据类型和我们在parameterType的值不同,就会报错,比如我们传入一个String类型:

他就会非常贴心的提醒我们,String类型不能被转换成Integer类型,就说明这是我们参数传递时候的类型错误。

在正常的传递进来之后,这个SQL语句就算是完整了,然后就可以开始查询,并最终会出现一个查询结果,然后就来到了我们的第二个问题。

MySQL中的表数据是怎么映射到我们的Java实体类的? 

这个问题也非常的简单,之前我们说过。resultType的值就是用来帮助我们自动映射MySQL表数据和Java实体类的,而要完成自动映射的也是有条件的,那就是要求我们数据库表的列名和Java实体类的属性名要完全一致,并且数据类型也要一直,其中Java中的String类型对应MySQL中的varchar类型:

 

只有满足了这两个条件,并且将resultType的值设置为对应的Java实体类的之后才可以完成自动映射。如果这时候我改变一下数据类型,我们将Java实体类中的name的值改为int类型:

 

这时候再来进行查询,就会出现下面的效果:

他会告诉我们无法从字符串”张三“确定数据类型。这个张三是我们数据库的name字段的值,但是根据我们配置的自动映射规则,Java实体类student的name属性字段是int类型,而"张三”是字符串类型,两者类型并不匹配,所以会导致类型无法匹配的错误。

所以,我们可以画一张图来最终演示一下这一整个的过程:

 图画的略微有一些抽象,但是我觉得问题不大,能理解就好

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

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

相关文章

LQB02控制LED灯,74HC138芯片,74HC02芯片,74HC573芯片。

一&#xff0c;硬件图解读。 二&#xff0c;控制LED需要的74HC595程序编程。 三&#xff0c;控制某个LED亮&#xff0c;其他保持不变&#xff0c;或者控制整8个LED&#xff0c;其他不变&#xff1b; 四&#xff0c;读取某个LED的状态&#xff0c;一秒时间读取一次&#xff0c;如…

mapreduce与yarn

文章目录一、MapReduce1.1、MapReduce思想1.2、MapReduce实例进程1.3、MapReduce阶段组成1.4、MapReduce数据类型1.5、MapReduce关键类1.6、MapReduce执行流程1.6.1、Map阶段执行流程1.6.2、Map的shuffle阶段执行流程1.6.3、Reduce阶段执行流程1.7、MapReduce实例WordCount二、…

版本控制软件SVN

SVN学习 1 版本控制软件定义及用途 版本控制软件是为适应软件配置管理的需要&#xff0c;控制软件的修改&#xff0c;减少混乱&#xff0c;提高软件生产效率&#xff0c;其是软件质量保证的重要环节软件配置管理是对软件修改进行标识、组织和控制的技术&#xff0c;用来协调和…

MASA MAUI Plugin (八)Android相册多选照片(Intent 方式)

背景 MAUI的出现&#xff0c;赋予了广大.Net开发者开发多平台应用的能力&#xff0c;MAUI 是Xamarin.Forms演变而来&#xff0c;但是相比Xamarin性能更好&#xff0c;可扩展性更强&#xff0c;结构更简单。但是MAUI对于平台相关的实现并不完整。所以MASA团队开展了一个实验性项…

代码随想录NO49 | 动态规划 _LeetCode1143.最长公共子序列 1035.不相交的线 53. 最大子序和

动态规划 _LeetCode1143.最长公共子序列 1035.不相交的线 53. 最大子序和今天继续子序列问题&#xff01; 1143.最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符…

docker全解

目录说明docker简介为什么是docker容器与虚拟机比较容器发展简史传统虚拟机技术容器虚拟化技术docker能干什么带来技术职级的变化开发/运维&#xff08;Devops)新一代开发工程师Docker应用场景why docker&#xff1f;docker的优势docker和dockerHub官网Docker安装CentOS Docker…

10 种 Spring事务失效场景

10 种 Spring事务失效场景 1.概述 Spring针对Java Transaction API (JTA)、JDBC、Hibernate和Java Persistence API(JPA)等事务 API&#xff0c;实现了一致的编程模型&#xff0c;而Spring的声明式事务功能更是提供了极其方便的事务配置方式&#xff0c;配合Spring Boot的自动…

supervisor看守进程

supervisor可以用于看守正在运行的服务&#xff0c;如果服务以外停止&#xff0c;他会在设置的时间间隔内重新启动该服务。 本测试使用的系统是TencentOS3.1. 安装supervisor最简单方法是使用yum。 yum install supervisor supervisor需要python3支持&#xff0c;因此请先确…

【Android玩机】跟大家聊聊面具Magisk的使用(安装、隐藏)

目录:1、Magisk中文网2、隐藏面具和Root&#xff08;一共3种方法&#xff09;1、Magisk中文网 &#xff08;1&#xff09;首先Magisk有一个中文网&#xff0c;对新手非常友好 &#xff08;2&#xff09;这网站里面主要包含&#xff1a;6 部分 &#xff08;3&#xff09;按照他给…

c++常用stl算法

1、头文件 这些算法通常包含在头文件<algorithm> <functional> <numeric>中。 2、常用遍历算法 for_each(v.begin(),v.end(), 元素处理函数/仿函数) 注意&#xff1a;在使用transform转存时&#xff0c;目标容器需要提取开辟合适的空间。 void printfunc(…

【C++】类和对象入门必知

面向过程和面向对象的初步认识类的引入类的定义类的访问限定符封装类的作用域类的实例化类对象模型this指针C语言和C实现Stack的对比面向过程和面向对象的初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解…

【归一化小记】,batchnorm,layernorm,IN,GN,分布式归一化...

BatchNorm 最早在全连接网络中被提出&#xff0c;对每个神经元的输入做归一化。扩展到 CNN 中&#xff0c;就是对每个卷积核的输入做归一化&#xff0c;或者说在 channel 之外的所有维度做归一化。 BN 带来的好处有很多&#xff0c;这里简单列举几个&#xff1a; 防止过拟合&am…

【HTML】HTML 表单 ④ ( textarea 文本域控件 | select 下拉列表控件 )

文章目录一、textarea 文本域控件二、select 下拉列表控件一、textarea 文本域控件 textarea 文本域 控件 是 多行文本输入框 , 标签语法格式如下 : <textarea cols"每行文字字符数" rows"文本行数">多行文本内容 </textarea>实际开发中 并不…

聚观早报 | 嘀嗒出行重启赴港IPO;饿了么到店业务将与高德合并

点击蓝字 / 关注我们今日要闻&#xff1a;嘀嗒出行重启赴港 IPO&#xff1b;饿了么到店业务将与高德合并&#xff1b;美团香港骑手月收入高达3.5万港元&#xff1b;腾讯或引进Meta旗下VR眼镜Quest 2&#xff1b;苹果将阻止用户免费装开测版iOS 17 嘀嗒出行重启赴港 IPO 港交所文…

Java企业开发学习笔记(2)利用组件注解符精简Spring配置文件

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【http://t.csdn.cn/iSeSH】 文章目录一、 利用组件注解符精简Spring配置文件1.1 创建新包1.2 复制四个类1.3 修改杀龙任务类1.4 修改救美任务类1.5 修改勇敢骑士类1.6 修改救美骑士类1.7 创建Spring配置文件1.8 创建…

【数据库】redis数据持久化

目录 数据持久化 一&#xff0c; RDB 1&#xff0c; 什么是RDB 2&#xff0c;持久化流程 3&#xff0c; 相关配置 案例演示&#xff1a; 4&#xff0c; 备份和恢复 1、备份 2、恢复 3&#xff0c;优势 4&#xff0c; 劣势 二&#xff0c;AOF 1&#xff0c;什么是A…

Java笔记026-集合/数组、Collection接口、ArrayList、Vector、LinkedList

集合集合的理解和好处保存多个数据使用的是数组&#xff0c;分析数组的弊端数组1、长度开始必须指定&#xff0c;而且一旦指定&#xff0c;不能更改2、保存的必须为同一类型的元素3、使用数组进行增加/删除元素的示意代码-比较麻烦Person数组扩容示意代码Person[] pers new Pe…

ChatGPT三个关键技术

情景学习&#xff08;In-context learning&#xff09; 对于一些LLM没有见过的新任务&#xff0c;只需要设计一些任务的语言描述&#xff0c;并给出几个任务实例&#xff0c;作为模型的输入&#xff0c;即可让模型从给定的情景中学习新任务并给出满意的回答结果。这种训练方式能…

论文笔记:How transferable are features in deep neural networks? 2014年NIP文章

文章目录一、背景介绍二、方法介绍三、实验论证四、结论五、感想参考文献一、背景介绍 1.问题介绍&#xff1a; 许多在自然图像上训练的深度神经网络都表现出一个奇怪的共同现象&#xff1a;在第一层&#xff0c;它们学习类似于Gabor过滤器和color blobs的特征。这样的第一层特…

c++提高篇——list容器

一、基本概念 功能:将数据进行链式存储 链表&#xff08;(list)是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的&#xff0c;链表由一系列结点组成。 结点的组成:一个是存储数据元素的数据域&#xff0c;另一个是存储下一个…