通过myBatis将sql语句返回的值自动包装成一个java对象(2)

1.之前我们是如何执行一个sql语句自动包装成一个java对象呢?

1.创建一个mapper.xml,定义 执行的语句名字包装成什么类

2.在总的配置文件里申明这个mapper

 3.在java里通过sqlSession执行mapper里定义好的内容

我们还可以使用另一种方法实现第三步。现在我们我们实际上是通过读取xml配置文件中的映射关系来确定selectUser执行的是哪条sql语句,返回什么值。

我们还可以再创建一个接口,在接口中写抽象方法,将接口中的抽象方法和xml文件里的映射关系一一对应。这样我们通过调用接口里的抽象方法,就可以找到xml中的映射关系,进而确定 selectUser执行的是哪条sql语句。

2.现在我们如何执行一个sql语句自动包装成一个java对象

1.基本逻辑

mapper.xml中存放了很多映射关系:

sql语句名称-》真正的sql语句,ie:selectUser-》select * from accounting_ledger.user

现在我们编写一个接口,对这些映射关系命名:

a(映射关系名)= 【sql语句名称-》真正的sql语句】

有了接口之后,我们再调用某个sql语句,就只需要知道映射关系名即可。

2.编写接口和xml

接口:

package Mybatis.Mapper;import Mybatis.User;import java.util.List;public interface UserMapper {List<User> selectStudent();
}

xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--MyBatis 映射器(Mapper)XML 文件,用于定义 SQL 映射配置。映射器文件通常用于将数据库操作与 Java 方法关联起来。
--><!-- 定义映射器命名空间,通常与对应的 Java 接口或类的全限定名一致 -->
<mapper namespace="Mybatis.Mapper.UserMapper"><!--namespace是这个mapper配置文件的名字,这里我们通过namespace属性把这个mapper和UserMapper接口对应这样当我们调用接口中的抽象方法时,myBatis就知道通过这个mapper里的配置文件,来实现那个抽象方法id指的是“select * from user”这条语句的名字,起了这个名字后,我们就可以在后面的java代码里用这个名字指代这条sql语句这里我们已经将这个mapper和接口对应,接口里会有一个名叫selectUser的抽象方法当调用selectUser方法时,myBatis会通过namespace找到这个mapper再通过id来找到调用的这个selectUser方法具体对应这个mapper里的哪一部分语句resultType是需要映射成的类型的位置(不是电脑里的路径,是在java里的位置,哪个包(也可能不在包里,看你自己),哪个类)在这个例子里User是类名,Mybatis是User类所在的包名,这个地方每个人不一样,根据你的类的位置来决定。--><select id="selectUser" resultType="Mybatis.User">select * from accounting_ledger.user</select><!--在实际项目中,查询语句通常更为复杂,可以包含条件、关联查询等。这里的示例是一个简单的查询所有user的语句。--></mapper>

3.接口和mapper.xml是如何对应的

(1)一个项目里可能有多个mapper,而每一个mapper对应一个接口,所以我们需要将mapper和接口对应。

mapper的namespace属性应该等于接口的全限定名

(<mapper namespace="Mybatis.Mapper.UserMapper">

全限定名:

package com.example.myproject.interfaces;public interface TestMapper {// 接口方法定义
}

那么,TestMapper 接口的全限定名就是 com.example.myproject.interfaces.TestMapper。这个全限定名唯一标识了这个接口在Java代码中(不是计算机的路径)的位置。

(2)一个mapper里有多个sql语句,所以接口里也要有多个抽象方法,我们需要将接口里的抽象方法和mapper中的sql语句对应

xml中,每条sql的id应该和接口中的抽象方法名相同

(select id="selectUser"-》List<User> selectUser();)

(3)抽象方法的返回值应该和sql语句的返回值相同

这里抽象方法返回List<User>,而这个sql语句返回的就是一些列user对象的属性。

4.工程文件的格式

我们建议将mapper.xml和接口写在同一目录下:

5.更改最初的mybatis全局配置文件

因为此时我们的mapper被移动到了src文件夹内(接口肯定写在src里,mapper和接口在一起-》mapper在src里),所以此时我们要将全局配置文件中的mapper部分由:

<mapper url="file:UserMapper.xml"/>

改为

<mapper resource="Mybatis/Mapper/UserMapperWithInterface.xml"/>
当配置文件在src文件夹下的时候,用resource,用/表示层级关系。在src文件夹外的时候,用url,用.表示层级关系。resource指类目录,url指电脑的文件目录

6.调用

package Mybatis.Mapper;import Mybatis.MyBatisUtil;
import Mybatis.User;
import org.apache.ibatis.session.SqlSession;import java.util.List;public class Main3 {public static void main(String args[]){//用MyBatisUtil来包装之前Main1的工厂类,更简单地得到连接try(SqlSession sqlSession = MyBatisUtil.getSession(true)){//获取接口的实现类UserMapper testMapper = sqlSession.getMapper(UserMapper.class);//通过接口来实现sql语句List<User> user = testMapper.selectUser();//这行代码使用了 Java 8 引入的新特性之一,称为方法引用(Method Reference)。// 具体来说,System.out::println 是一个静态方法引用,用于将 println 方法关联到 System.out 对象上。//在这里,System.out::println 等效于 lambda 表达式 (s) -> System.out.println(s)。// 它表示将遍历 student 集合的每个元素,并将每个元素传递给 System.out.println 方法,实现在控制台上打印每个元素的效果。user.forEach(System.out::println);}}
}

1.当上述代码调用testMapper.selectUser();时,java发现这是一个接口的抽象方法,没有发现真正的实现方法,先暂停

2.与此同时,java读取到了mybatis的大配置文件,发现了

<mapper resource="Mybatis/Mapper/UserMapperWithInterface.xml"/>

3.mybatis开始工作,找到了这个mapper,和刚刚的那个接口,发现了mapper.xml和接口的各种对应关系

4.mybatis通过这个mapper里的sql语句开始为接口里的抽象方法同态生成实现的方法。

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

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

相关文章

java如何修改windows计算机本地日期和时间?

本文教程&#xff0c;主要介绍&#xff0c;在java中如何修改windows计算机本地日期和时间。 目录 一、程序代码 二、运行结果 一、程序代码 package com;import java.io.IOException;/**** Roc-xb*/ public class ChangeSystemDate {public static void main(String[] args)…

快速更改flutter已有项目的项目名称和id等

如果你使用了别人已有的仓库模板或者想更改现有项目的名称&#xff0c;是一件非常繁琐的工作&#xff0c;需要修改全平台的文件还是相当麻烦的&#xff0c;所以这里推荐一个小工具&#xff0c;可以帮助大家快速实现更改项目名称的目的&#xff0c;这个工具地址&#xff1a;rena…

任务14:使用MapReduce提取全国每年最低/最高气温

任务描述 知识点&#xff1a; 使用MapReduce提取数据 重 点&#xff1a; 开发MapReduce程序统计每年每个月的最低气温统计每年每个月的最高气温 内 容&#xff1a; 使用IDEA创建一个MapReduce项目开发MapReduce程序使用MapReduce统计每年每个月的最低气温使用MapReduce…

正则表达式和爬虫

目录 一、正则表达式&#xff1a; 作用&#xff1a; 字符类&#xff08;只匹配一个字符&#xff09; 细节 预定义字符字符&#xff08;只匹配一个字符&#xff09; 细节 数量词 二、爬虫 Pattern Matcher 要点说明 一、正则表达式&#xff1a; 作用&#xff1a; 1、校验字符…

pytorch集智-5手写数字识别器-卷积神经网络

1 简介 简称&#xff1a;CNN&#xff0c;convolutional neural network 应用场景&#xff1a;图像识别与分类&#xff08;CNN&#xff09;&#xff0c;看图说话&#xff08;CNNRNN&#xff09;等 优越性&#xff1a;和多层感知机相比&#xff0c;cnn可以识别独特的模式&…

Kubernetes (K8S) 3 小时快速上手 + 实践

1. Kubernetes 简介 k8s即Kubernetes。其为google开发来被用于容器管理的开源应用程序&#xff0c;可帮助创建和管理应用程序的容器化。用一个的例子来描述&#xff1a;"当虚拟化容器Docker有太多要管理的时候&#xff0c;手动管理就会很麻烦&#xff0c;于是我们便可以通…

二叉树:从基础结构到高级遍历技术

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 引言结构定义接口需求构建二叉树销毁二叉树计算节点和叶子的数量二叉树节点个数二叉树叶子节点个数二叉树第k层节点个数 二叉树查找值为x的节点二叉树的…

立白科技集团:研发安全推动数字化蜕变,日化业务再上新高度

立白科技集团成立于1994年&#xff0c;是我国日化行业的领军企业&#xff0c;致力于成为一家“品牌引领、数字经营、富有创新、富有活力”的智慧服务型企业。从2018年开始&#xff0c;立白科技集团加速数字化转型&#xff0c;打造数据和业务中台&#xff0c;并建立toB和toC平台…

修改和调试 onnx 模型

1. onnx 底层实现原理 1.1 onnx 的存储格式 ONNX 在底层是用 Protobuf 定义的。Protobuf&#xff0c;全称 Protocol Buffer&#xff0c;是 Google 提出的一套表示和序列化数据的机制。使用 Protobuf 时&#xff0c;用户需要先写一份数据定义文件&#xff0c;再根据这份定义文…

【C语言】指针知识点笔记(2)

目录 一、野指针 二、assert断言 三、指针的使用和传址调用 四、数组名的理解 五、使用指针访问数组 一、野指针 二、assert断言 三、指针的使用和传址调用 四、数组名的理解 五、使用指针访问数组

Vue响应式系统(二)

Vue响应式系统(一) 六、嵌套的effect与effect栈。 什么场景会用到effect嵌套呢&#xff1f;听我娓娓道来。 就用Vue.js来说吧&#xff0c;Vue.js的渲染函数就是在effect中执行的&#xff1a; /*Foo组件*/ const Foo {render() {return /*.....*/} }// effect中执行Foo组件中…

kubectl与 jq的另外一些用法

背景&#xff1a; 在日常运维工作中&#xff0c;我们需要管理和操作大量的配置文件&#xff0c;这在使用 Kubernetes 集群管理应用时尤为常见。Kubernetes 提供了一个名为 ConfigMap 的资源对象&#xff0c;它用于存储应用的配置信息。有时&#xff0c;我们需要查找哪些 Confi…

基于SSM的驾校信息管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue、HTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是…

人机协同中存在一个独特的时空体系

一、在人机协同中存在一个独特的时空体系 在人机这个独特的时空体系中&#xff0c;人和机器之间的时间和空间的交织和共同作用。 在时间维度上&#xff0c;人机协同体系中的人和机器具有不同的时间节奏和速度。人类有限的生命周期和有时候需要休息的需求使得他们的工作时间和生…

机器人制作开源方案 | 智能循迹避障小车

作者&#xff1a;刘元青、邹海峰、付志伟、秦怀远、牛文进 单位&#xff1a;哈尔滨信息工程学院 指导老师&#xff1a;姚清元 智能小车是移动式机器人的重要组成部分&#xff0c;而移动机器人不仅能够在经济、国防、教育、文化和生活中起到越来越大的作用&#xff0c;也是研究…

Codeforces Round 114 (Div. 1) C. Wizards and Numbers(思维题 辗转相除+博弈 巴什博弈)

题目 t(t<1e4)组询问&#xff0c;每次询问(a,b)&#xff08;0<a,b<1e18&#xff09;&#xff0c; 不妨a<b&#xff08;a>b时需要交换两个数考虑&#xff09; ①令b减去a的k次方&#xff08;k>1&#xff09;&#xff0c;要求减完之后b非负 ②令bb%a 当a和…

java处理16进制字符串的一些方法和基础知识

前言&#xff1a;本篇文章是对于基础数据的处理的一些简单经验总结里边包含了一些基础的数据储存和数据转化的一些知识&#xff0c;同样也包含有部分快捷的数据处理方法。主要用于个人知识的一个记录和方便进行对应的数据转换和处理。 1、bit,字节和字的关系 1.1 bit和字节的…

2024全新开发API接口调用管理系统网站源码 附教程

2024全新开发API接口调用管理系统网站源码 附教程 用layui框架写的 个人感觉很简洁 方便使用和二次开发

腾讯云MPS为出海媒体企业助力

在如今互联网发达的时代&#xff0c;一个视频通过网络发布即可供给全球用户进行观看。其中视频媒体企业便其中的领头先锋&#xff0c;为了让创作者们以及全球各大用户的视频进行快速推广&#xff0c;出海则是不二之选。但是因为各地区域的不同&#xff0c;带宽的不同与网络的限…

深信服技术认证“SCSA-S”划重点:逻辑漏洞

为帮助大家更加系统化地学习网络安全知识&#xff0c;以及更高效地通过深信服安全服务认证工程师考核&#xff0c;深信服特别推出“SCSA-S认证备考秘笈”共十期内容&#xff0c;“考试重点”内容框架&#xff0c;帮助大家快速get重点知识~ 划重点来啦 *点击图片放大展示 深信服…