Mybatis中的映射文件编写原则

news2025/2/27 19:55:40

先来回顾一下,在Java项目中如何使用Mybatis执行SQL语句:

  1. 添加依赖:在项目中添加 MyBatis 和数据库驱动依赖
  2. 配置 MyBatis:创建 MyBatis 的配置文件,配置数据源和 Mapper 映射
  3. 创建 POJO 类:定义与数据库对应的实体类
  4. 创建 Mapper 接口:定义操作数据库的方法。
  5. 创建 SQL 映射文件:使用 XML 定义 SQL 语句和结果映射。
  6. 编写主程序:执行 SQL 查询并获取结果。

下面再来详细讲解一下如何编写Mapper文件。

Mapper文件有统一的格式,我们可以建立一个模板,这样我们每次建立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">
<mapper namespace="org.mybatis.example.BlogMapper">
 <select id="selectBlog" resultType="Blog">
 select * from Blog where id = #{id}
 </select>
</mapper>

接下来我们来讲解每个标签的作用

1.Mapper标签

<mapper> 标签是 MyBatis Mapper XML 文件的根标签,用于定义 SQL 映射。它包含一系列的子标签,如 <select><insert><update> 和 <delete>,用于定义具体的数据库操作。

1.1 namespace参数

指定映射器接口的完全限定名(即包名+接口名),用于将 XML 中的 SQL 语句与 Java 接口中的方法关联起来。(说明白点就是指明我调用SQL语句时,给每个SQL起一个唯一的名字,这样每次调用只要输入SQL的名字,就可以进行调用了。注意:这里的是一个大的范围,因为一般是每一个POJO类都有一个Mapper文件,而在这个类的业务逻辑中,需要很多条SQL语句(如增删改查),每个SQL都有一个id,在使用是可以使用namespace.id的值,唯一指明一条SQL语句)

1.2 resource参数

注意:一旦使用这个参数,就说明此条<mapper>是在Mybatis-config.xml这个核心配置文件中的。

我们需要记住:每次建立一个Mapper映射文件,就需要在mapper-config.xml核心配置文件中说明有这么个文件,就要添加一个<mapper>标签

<mappers>
    <mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>

在Java项目中,特别是使用MyBatis这类框架时,项目的结构通常遵循Maven或Gradle等构建工具的约定。这些约定中,src/main/java目录用于存放Java源代码(.java文件),这些代码在编译时会被转换成.class字节码文件。

然而,一个完整的Java应用不仅仅包含Java源代码,还可能包含其他类型的资源文件,如配置文件、属性文件、XML映射文件等。在MyBatis中,Mapper XML文件就是这类资源文件,它们包含了SQL语句和映射定义,是MyBatis框架在运行时解析和执行SQL所必需的

虽然这些XML文件不是Java源代码,不需要被编译,但它们在运行时是必需的,因为MyBatis会读取这些文件来构建和执行相应的SQL操作。因此,需要在项目的配置中指明这些文件的位置,以便MyBatis能够正确地加载它们

在MyBatis的核心配置文件中,<mappers>标签就是用来完成这个任务的。通过<mapper resource="..."/>子标签,可以告诉MyBatis去哪里找到这些XML映射文件。这样,Java代码通过Mapper接口调用SQL操作时,MyBatis就知道去哪里找到对应的SQL语句和映射定义。

所以,总结来说:

  1. src/main/java中的.java文件是Java源代码,需要被编译成.class文件。
  2. Mapper XML文件是MyBatis的资源文件,不需要编译,但在运行时是必需的。
  3. 需要在MyBatis配置中指明Mapper XML文件的位置,以便框架能够加载和使用它们。

2. Mapper的子标签

其子标签有很多,这里重点以<select>标签为例子,主要讲解其参数。

基本结构如下:

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUserById" parameterType="int" resultType="com.example.pojo.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

2.1 id标签

唯一标识一个<select>标签。这个id用于在Java接口中匹配方法名。就像上面说的,可以根据namespace.id来选择唯一一个SQL,如下:

public class UserTest {
    @Test
    public void findByIDTest(){
        String resources = "mybatis-config.xml";
        Reader reader = null;
        try{
            reader = Resources.getResourceAsReader(resources);
        } catch (IOException e) {
            e.printStackTrace();
        }

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = sqlSessionFactory.openSession();
        User user = session.selectOne("com.example.mapper.UserMapper.selectByID",1);  //这里面的第一个参数就是一个例子
        System.out.println(user);
        session.close();
    }
}

这里使用session.selectOne()来查询,第一个参数就是要使用的SQL语句的ID,第二个参数是这个SQL的需要的参数(parameterType)

2.2 parameterType标签

指定输入参数的类型。可以是Java基本数据类型(如intString)或自定义的Java类。

2.3 resultType标签

指定查询结果的类型。可以是Java基本数据类型、自定义的Java类或集合类型。

2.4 resultMap标签

可以看到上面的User类中的属性名字和表users表中的字段名字都一一对应。

现在又有一种新的需求,如果二者的这些内容不对应呢?那又要如何操作呢?

请看已经有下面的内容:

POJO类有(id,name,age)这三个属性。

而我们的表t_student中有(sid,sname,sage)这三个属性。

现在的问题是,它们已经不匹配了,我们又要如何查询?这里我们就需要使用<resultMap>标签。

我们还是首先建立一个<select>标签用于查询,只不过需要修改一下参数:

    <select id="selectAll" resultMap="studentMap">
        select *
        from t_student
    </select>

这里我们把原来的"resultType"属性换成了"resultMap"属性(注意:这两个属性之间是互斥的,只能存在一个)。这个意思是说,我返回值的类型需要做一下映射,请你根据我的"resultMap"标签的值,找到<resultMap>标签,然后再查看返回值类型。

然后我们还需要在下面创建一个<resultMap>标签:

    <resultMap id="studentMap" type="Student">
     <id property="id" column="sid"></id>
     <result property="name" column="sname"></result>
     <result property="age" column="sage"></result>
    </resultMap>

这里的参数id是来表示唯一<resultMap>的,"type"属性是用来指定映射后的返回值。(注意这里应该是com.example.pojo.Student,后面会讲如何简化。

这里每个<resultMap>标签下面只能有一个<id>子标签,用来映射主键。其余的<result>标签是用来映射除主键之外的字段。

这里的property属性的值是POJO类中的属性名字(如这里Student类的id、name、age),而column属性的值是表中的字段名(这里是t_studnet表中的sid、sname、sage)。

这样就可以用select来查询了。

整体xml文件如下:

<mapper namespace="com.example.mapper.StudentMapper">
    <select id="selectAll" resultMap="studentMap">
        select *
        from t_student
    </select>

    <resultMap id="studentMap" type="Student">
     <id property="id" column="sid"></id>
     <result property="name" column="sname"></result>
     <result property="age" column="sage"></result>
    </resultMap>
</mapper>

然后测试文件中:

    @Test
    public void findAllTest(){
        SqlSession session  = MybatisUtils.getSession();//这里是我自己建立的工具类
        List<Student> list = session.selectList("com.example.mapper.StudentMapper.selectAll");
        for(Student student:list){
            System.out.println(student);
        }
        session.commit();
        session.close();
    }

如何简化

在上面的xml文件中,每次都需要写明返回值类型所在的地址(如com.example.pojo.Student),我们可以加一些内容使只用写Student即可。

只需要在mybatis-config核心配置文件中的<properties>标签下加上下面内容:

<configuration>
    <!-- 其他配置项 -->

    <typeAliases>
        <package name="com.example.pojo"/>
    </typeAliases>

    <!-- 其他配置项 -->
</configuration>

这样就可以简化操作了。

至此,本文结束!!!

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

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

相关文章

拒绝飞单,微信监控轻松搞定!

微信作为广泛使用的社交工具&#xff0c;其安全性和监控问题受到了广泛关注。对于企业来说&#xff0c;确保客户资源的安全和防止员工“飞单”是重要的管理挑战。以下是一些有效的方法和工具&#xff0c;可以帮助企业提高微信的安全性&#xff0c;防止飞单&#xff0c;从而保护…

LLM - 配置 ModelScope SWIFT 测试 Qwen2-VL 模型推理(Infer) 教程 (1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142827217 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 SWIFT …

QT文件操作【记事本】

mainwindow.h核心函数 QFileDialog::getOpenFileName()QFileDialog::getSaveFileName() #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include<QFileDialog> #include<QMessageBox> #include<QDebug> #include<QFile> #…

Apache Kafka的生态

Kafka 生态系统 微信公众号&#xff1a;阿俊的学习记录空间 小红书&#xff1a;ArnoZhang wordpress&#xff1a;arnozhang1994 博客园&#xff1a;arnozhang CSDN&#xff1a;ArnoZhang1994 以下是与 Kafka 集成的工具列表&#xff0c;涵盖了不同领域的工具和扩展。这些…

Jmeter如何进行多服务器远程测试?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 JMeter是Apache软件基金会的开源项目&#xff0c;主要来做功能和性能测试&#xff0c;用Java编写。 我们一般都会用JMeter在本地进行测试&#xff0c;但是受到单…

鱼跃医疗荣获深交所信息披露工作“A”级评价

2024年10月11日&#xff0c;深圳证券交易所&#xff08;以下简称“深交所”&#xff09;发布了《关于深市上市公司2023-2024年度信息披露评价结果的通报》&#xff0c;鱼跃医疗&#xff08;002223.SZ&#xff09;凭借在信息披露质量、投资者关系管理等各方面的优异表现&#xf…

总结拓展十四:批次管理(1)

1、批次的概念 批次是指生产或采购过程中&#xff0c;为了区分不同供应商之间相同产品间的微小区别而进行的管理方式。它通常用于确保产品质量的一致性和可追溯性。批次的概念可以应用于多个领域&#xff0c;包括生产、采购、物流、销售等。 2、批次管理的概念 批次管理是指对…

SIC MOS的保护方式

SIC MOS与IGBT短路保护有所不同的原因&#xff1a; 由于SIC MOS芯片尺寸较小(散热能力较差&#xff0c;在短路情况下&#xff0c;浪涌电流会产生大量的热量)&#xff0c;SIC MOS的浪涌能力低于IGBT。SiC MOSFET 和 IGBT 的输出特性不同&#xff0c;在正常导 通状态期间&#x…

【vue3】弹幕效果实现

本次弹幕基于vue3-danmaku组件实现。 弹幕效果 1.安装插件 npm install vue3-danmaku --save 2.基础使用方法 <template><vue-danmaku v-model:danmus"danmus" loop style"height:100px; width:300px;"></vue-danmaku> </templat…

发布自己的python包

文章目录 概要模块和包发布自己的package创建目录结构发布 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; openAI 的 GPT 大模型的发展历程。 模块和包 在Python中&#xff0c;程序的划分可以分为三个层次&#xff1a;脚本、模块和包 script&#xff1a;独…

【人工智能】探索最强AI工具:实际应用与影响

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;AI工具已经深入到人们日常生活和工作的方方面面。这些工具不仅提高了生产力&#xff0c;还改变了我们解决问题和处理信息的方式。在中文互联网和国际市场中&#xff0c;众多AI工具已成为人们工作、学习、创作…

软考结构化开发 -- (耦合,内聚,设计原则,系统文档,数据字典)

文章目录 一、耦合二、内聚三、设计原则四、系统文档五、数据字典 一、耦合 模块化&#xff1a;将一个待开发的软件分解成若干个小的简单部分–模块模块独立 无直接耦合&#xff1a;指两个模块之间没有直接的关系&#xff0c;它们分别从属于不同模块的控制与调用&#xff0c;…

spring boot itext7 修改生成文档的作者、制作者、标题,并且读取相关的信息。

1、官方的example文件&#xff1a;iText GitHub itext-java-7.2.5\kernel\src\test\java\com\itextpdf\kernel\pdf\PdfStampingTest.java 2、修改代码&#xff1a; Testpublic void stamping1() throws IOException {String filename1 destinationFolder "stamping1_…

特惠电影票API接口的优势功能以及对接因素?

特惠电影票对接接口通常是指允许第三方开发者或平台通过编程方式接入电影票预订服务的API。这些接口可以提供查询电影场次、座位信息、票价、订票、支付等功能。以下是一些关键点和考虑因素&#xff0c;以及一些提供特惠电影票API接口的平台&#xff1a; 关键功能 电影场次信息…

RK3568 4G模块移远 EM05-CE

首先确保4G模块的天线是否正确安装,这一步会影响到后面测试成功与失败,购买模块时可以咨询厂家 然后就可以进行测试,首先需要关闭所有网络设备,以我的开发板为例子,确保等会使用的是4G模块的功能 ifconfig eth0 down ifconfig eth1 down ifconfig eth2 down 然后查看ifc…

java-day7

练习一&#xff1a;飞机票 需求: ​ 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 ​ 按照如下规则计算机票价格&#xff1a;旺季&#xff08;5-10月&#xff09;头等舱9折&#xff0c;经济舱8.5折&#xff0c;淡季&#xff08;11月到来…

【Spring相关技术】spring进阶-自定义请求报文转对象HttpMessageConverter

文章目录 类继承体系核心类与接口说明底层调用链完整示例步骤 1: 创建自定义的HttpMessageConverter步骤 2: 配置Spring MVC使用自定义转换器步骤 3: 使用自定义转换器 相关文献 类继承体系 默认转换器即springmvc默认的转换器&#xff0c; 用的比较多的是以下两种&#xff0c;…

生信技能61 - 获取比对后BAM文件的多项基础统计指标

获取比对后BAM文件的多项基础统计指标 1. 运行实例 采用pysam库解析bam文件,将bam文件路径作为输入参数,统计输出比对的参考基因组大小、ATCGN各碱基数量/比率、GC含量、UR reads数量、平均测序深度、总reads数量等统计指标。 python bam_statistics.py -b sample.sorted.…

【Nestjs】从入门到精通(依赖注入)

NestJS 是一个基于 Node.js 的渐进式框架&#xff0c;构建在 Express 或 Fastify 之上&#xff0c;主要用于构建高效、可扩展的服务器端应用程序。它使用 TypeScript 并借鉴了 Angular 的设计理念&#xff0c;采用了依赖注入&#xff08;IoC, Inversion of Control&#xff09;…

动态网站及爬虫技术应用(题目)

/*T26:HTTP响应消息的状态代码为500时表示&#xff08; &#xff09;: HTTP响应消息的状态代码为500时表示服务器内部错误&#xff08;Internal Server Error&#xff09;。这通常意味着服务器在处理请求时遇到了意外的情况&#xff0c;导致无法完成该请求。这种错误可能是由于…