通过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 mapper
        PUBLIC "-//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语句开始为接口里的抽象方法同态生成实现的方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣每日一练(24-1-16)

我一开始想到的是&#xff0c;如果数字相同则加一。 然而&#xff0c;对了一点点&#xff0c;而已。 高手的方法不是普通人在几分钟内能想得出来的&#xff0c;hh 继续补充&#xff1a; 如果数字不同则减一&#xff0c;如果计数到达了0&#xff0c;则更新数字&#xff0c;最…

AWS边缘媒体安全交付方案

企业如何在AWS上的边缘站点&#xff0c;安全的将优质视频内容交付给用户&#xff0c;并且禁止哪些未经过授权的访问&#xff1f;九河云将基于AWS平台提供边缘媒体安全交付解决方案 解决方案详情 在通过 Amazon CloudFront 交付时&#xff0c;免受未经授权的访问。基于添加到交…

云畅科技技术中心被认定为湖南省省级企业技术中心

近日&#xff0c;湖南省工业和信息化厅公布《2023年第二批湖南省省级企业技术中心(第29批)》&#xff0c;云畅科技技术中心作为研发设计型代表入选。 省级企业技术中心是强化企业技术创新主体地位&#xff0c;增强企业自主创新能力&#xff0c;推动工业企业高质量发展的一个重要…

数据结构学习 jz59 滑动窗口的最大值

关键词&#xff1a;排序 大顶堆 双端队列 题目&#xff1a; 望远镜中最高的海拔 方法一&#xff1a;维护一个辅助队列。 方法二&#xff1a;大顶堆。 我还在主站 239 写了找最小值的方法。 方法一&#xff1a;最优解 这个方法和jz30维护一个非严格递减的辅助栈是基本一样的…

第 379 场 LeetCode 周赛题解

A 对角线最长的矩形的面积 模拟 class Solution { public:int areaOfMaxDiagonal(vector<vector<int>> &dimensions) {int res 0, len2 0;for (auto &x: dimensions)if (x[0] * x[0] x[1] * x[1] > len2 || x[0] * x[0] x[1] * x[1] len2 &&am…

安全强化学习笔记

这里写自定义目录标题 参考资料 Safe Reinforcement Learning环境算法CPO 2017 ICMLPCPO 2019 ICLRFOCOPS 2020 NIPSCRPO 2021 ICMLCUP 2022 NIPS TRPO 如何看懂TRPO里所有的数学推导细节? - 小小何先生的回答 - 知乎 参考资料 Safe Reinforcement Learning 安全/约束强化学…

排序算法之七:归并排序(非递归)

1.非递归实现思路 我们之前学习了递归实现的归并排序&#xff0c;是分治的思想&#xff0c;即先分解&#xff0c;再归并 这篇文章我们讲一下非递归的实现 非递归实现的思路是模拟递归的过程&#xff0c;在递归过程中&#xff0c;我们找key将数组分成左右数组&#xff0c;然后…

uni-table改表头的样式,uniapp项目,颜色,字体颜色

:first-child,:nth-child选择器的使用和隔行变色_firstchild怎么用-CSDN博客

Rocketmq rust版本-开篇

我是蚂蚁背大象(Apache EventMesh PMC&Committer)&#xff0c;文章对你有帮助给Rocketmq-rust star,关注我GitHub:mxsm&#xff0c;文章有不正确的地方请您斧正,创建ISSUE提交PR~谢谢! Emal:mxsmapache.com Rust重构Rocketmq,大家好我是mxsm(Apache EventMesh PMC&Comm…

高级分布式系统目录汇总

临近《高级分布式系统》考试&#xff0c;所以一边复习((⊙o⊙)…&#xff0c;其实是预习&#xff0c;哈哈^_^)&#xff0c;一边写高级分布式博客。先将高级分布式章节以及相关博客罗列如下&#xff0c;欢迎和大家一起学习。资料部分参考上了以下教材&#xff1a; 分布式实时系统…

css 前端实现通过css动画实现进度条动态加载效果

效果图 代码 CommonProcess.vue 进度条动态加载组件代码 <!-- 进度条组件 --> <template><div class"common_process"><div v-for"(item, index) in dataList" :key"processType index" class"common_process_item…

Qt6入门教程 6:Qt元对象系统

目录 一.什么是Qt元对象系统&#xff1f; 二.编译时Qt Creator偷摸做了哪些事情&#xff1f; 1.uic 2.rcc 3.moc 一.什么是Qt元对象系统&#xff1f; Qt中的元对象系统&#xff08;Meta-Object System&#xff09;提供了对象间通信的信号和槽机制、运行时类型信息和动态属…

算法复习——01背包

01背包 DP分析法要素有&#xff1a;集合&#xff0c;属性&#xff0c;状态计算 &#xff08;集合是指只考虑前i个&#xff0c;总体积小于等于j的所有选法&#xff0c;存取的属性是所有选法的最大值&#xff09; 状态方程计算&#xff08;所有选法可以分为2种不同的子集&#x…

快速高效处理长图:按指定高度切长图的方法,提升设计品质

在现代视觉传达设计中&#xff0c;长图作为一种常见的表现形式&#xff0c;被广泛应用于各种场景。如何快速高效地处理长图&#xff0c;使其符合设计要求和用户体验&#xff0c;成为设计师们面临的一大挑战。现在来看“办公提效工具”如何按指定高度切长图&#xff0c;提升设计…

华清远见作业第二十七天——网络编程(第二天)

思维导图&#xff1a; 在虚拟机实现客户端控制机械臂 代码&#xff1a; #include<stdio.h> #include<string.h> #include<stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <a.h> #define SER_PORT 8888 //服务端口 #d…

基于信号完整性的PCB设计原则

最小化单根信号线质量的一些PCB设计建议 1. 使用受控阻抗线&#xff1b; 2. 理想情况下&#xff0c;所有信号都应该使用完整的电源或地平面作为其返回路径&#xff0c;关键信号则使用地平面作为返回路径&#xff1b; 3. 信号的返回参考面发生变化时&#xff0c;在尽可能接近…

Seaborn——可视化的具体API应用

一、Seaborn概述 Seaborn 是基于 matplotlib的图形可视化 python包。提供了一种高度交互式界面&#xff0c;便于用户能够做出各种有吸引力的统计图表。 Seaborn在 matplotlib的基础上进行了更高级的API封装&#xff0c;从而使得作图更加容易&#xff0c;在大多数情况下使用seab…

WEB 3D技术 three.js 阴影属性

上文 WEB 3D技术 three.js 光照与阴影 我们说了阴影 那么 我们继续将阴影的属性 目前 我们的代码 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";//创建相机 cons…

集成xxljob项目如何迁移到K8S

前言 大家好&#xff0c;今天我们将基于XXL-Job&#xff0c;探讨任务调度迁移到云端的相关话题。 XXL-Job是一款功能强大、易用可靠的国产分布式任务调度平台&#xff0c;是目前国内使用比较广泛的分布式任务调度平台之一。它的主要特点包括&#xff1a; 支持分布式、多线程…

Java中的异常处理

目录 前言&#xff1a; 异常简介&#xff1a; Error类&#xff1a; Exception类&#xff1a; Exception异常&#xff1a; 运行异常&#xff1a; 编译异常&#xff1a; throw和throws关键字&#xff1a; throw: throws: try-catch关键字&#xff1a; finally: 为…