MyBatis开发: XML配置⽂件

news2025/1/11 11:26:51

前言

在IDEA的yml文件注释发现乱码

1.配置文件注释中文显示乱码

退出重进,发现不是乱码就成功


一.MyBatis XML配置⽂件 

学习了注解的⽅式, 接下来我们学习XML的⽅式.
使⽤Mybatis的注解⽅式,主要是来完成⼀些简单的增删改查功能. 如果需要实现复杂的SQL功能,建议使⽤XML来配置映射语句,也就是将SQL语句写在XML配置⽂件中.
MyBatis XML的⽅式需要以下两步:
  • 配置数据库连接字符串和MyBatis
  • 写持久层代码

1.1配置连接字符串和MyBatis

此步骤需要进⾏两项设置,数据库连接字符串设置和 MyBatis 的 XML ⽂件配置。
如果是application.yml⽂件, 配置内容如下:
# 数据库连接配置
spring:
 datasource:
 url: jdbc:mysql://127.0.0.1:3306/mybatis_test?
characterEncoding=utf8&useSSL=false
 username: root
 password: root
 driver-class-name: com.mysql.cj.jdbc.Driver
# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mybatis:
 mapper-locations: classpath:mapper/**Mapper.xml
如果是application.properties⽂件, 配置内容如下:
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_test?
characterEncoding=utf8&useSSL=false
#连接数据库的⽤⼾名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=root
# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mybatis.mapper-locations=classpath:mapper/**Mapper.xml

 1.yml文件配置

# 配置 mybatis xml 的文件路径,在 resources/mapper 创建所有表的 xml 文件
  mapper-locations: classpath:mybatis/**Mapper.xml

1.2 写持久层代码

持久层代码分两部分
1. ⽅法定义 Interface
2. ⽅法实现: XXX.xml

2.建包 

 3.创建一个接口(方法的声明),在mapper文件下创建一个接口

@Mapper
public interface UserInfoXmlMapper {
    Integer insert( UserInfo userInfo);
}

二.使用XML进行数据库操作

2.1增操作(insert)

4.方法的调用(在mybits包下创建一个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="com/example/demo/mapper/UserInfoXmlMapper">
    <insert id="insert">
        insert into userinfo (username, password, age, gender)
        values (#{username}, #{password}, #{age}, #{gender})
    </insert>
</mapper>

返回⾃增 id
接⼝定义不变, Mapper.xml 实现 设置useGeneratedKeys 和keyProperty属性
如果使⽤@Param设置参数名称的话, 使⽤⽅法和注解类似  

5.返回声明的方法进行单元测试 

6.插入数据(记得注解信息要全) 

package com.example.demo.mapper;

import com.example.demo.model.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class UserInfoXmlMapperTest {
    @Autowired
    private UserInfoXmlMapper userInfoXmlMapper;
    @Test
    void insert() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("日向雏田");
        userInfo.setPassword("520");
        userInfo.setAge(18);
        userInfo.setGender(1);
        userInfoXmlMapper.insert(userInfo);
    }
}

7.查看数据库,是否插入成功


2.2删除操作(delete)

删除操作(单元测试):

对数据库进行删除id为5的信息

1.方法声明

Integer delete(Integer id);

2.使用xml文件进行SQL

 <delete id="delete">
        delete from userinfo where id = #{id}
    </delete>

 3.单元测试

 @Test
    void delete() {
        userInfoXmlMapper.delete(5);
    }

4. 删除成功


2.3修改操作(update)

对数据库更新操作(更新id=1,用户admin的password)

1.方法声明

 Integer update(UserInfo userInfo);

2.使用xml文件进行SQL

<update id="update">
        update userinfo set password = #{password} where id =#{id}
    </update>

 3.单元测试 


    @Test
    void update() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(1);
        userInfo.setPassword("admin");
        userInfoXmlMapper.update(userInfo);
    }

4.修改成功 


2.4查询操作(select)

1.声明方法

List<UserInfo> selectAllUser();

 2.使用xml文件进行SQL

 <select id="selectAllUser"  resultType="com.example.demo.model.UserInfo">
        select * from userinfo
    </select>
<mapper> 标签:需要指定 namespace 属性,表⽰命名空间,值为 mapper 接⼝的全限定
名,包括全包名.类名。
<select> 查询标签:是⽤来执⾏数据库的查询操作的:
  • id :是和 Interface (接⼝)中定义的⽅法名称⼀样的,表⽰对接⼝的具体实现⽅法。
  • resultType :是返回的数据类型,也就是开头我们定义的实体类.

在MyBatis中,<select>标签用于定义SQL查询操作,而resultType属性是该标签中一个非常重要的属性,它指定了SQL查询返回的结果应该被映射成的Java类型。具体来说,resultType告诉MyBatis如何将数据库中的结果集(ResultSet)中的每一行数据转换成Java对象。

 3.单元测试 

 

 @Test
    void selectAllUser() {
        System.out.println(userInfoXmlMapper.selectAllUser());
    }

4.查询成功 

补充:

同样的, 使⽤XML 的⽅式进⾏查询, 也存在数据封装的问题 

解决办法和注解类似

  1. 起别名
  2. 结果映射
  3. 开启驼峰命名

其中1,3的解决办法和注解⼀样,不再多说, 接下来看下xml如果来写结果映射。

2.4.1结果映射 

以下Mapper.xml文件

<resultMap id="BaseMap" type="com.example.demo.model.UserInfo">
    <id column="id" property="id"></id>
    <result column="delete_flag" property="deleteFlag"></result>
    <result column="create_time" property="createTime"></result>
    <result column="update_time" property="updateTime"></result>
</resultMap>

<select id="queryAllUser" resultMap="BaseMap">
    select id, username,`password`, age, gender, phone, delete_flag, 
create_time, update_time from userinfo
</select>

关于开发中使⽤哪种模式这个问题, 没有明确答案. 仁者⻅仁智者⻅智, 并没有统⼀的标准, 更多是取决于你的团队或者项⽬经理, 项⽬负责⼈


三.多表查询

多表查询和单表查询类似, 只是SQL不同⽽已
⽂章表的uid, 对应⽤⼾表的id.

1.数据库创建articleinfo表

2.创建对象

3.定义接口,声明方法 

Mybatis 不分单表还是多表, 主要就是三部分: SQL, 映射关系和实体类 

通过映射关系, 把SQL运⾏结果和实体类关联起来.

 4.创建xml文件使用SQL语句

5.单元测试

6.测试没问题

 7.开始连接表

7.1新增连接表的对象

7.2,新增对象

7.3xml文件写连接表SQL语句

<select id="selectArticleAndUserById" resultType="com.example.demo.model.ArticleInfo">
        select ta.*, tb.username, tb.gender from articleinfo ta
        left join userinfo tb
        on ta.uid = tb.id
        where ta.id = #{id}
    </select>

 7.4进行单元测试

 @Test
    void selectArticleAndUserById() {
        System.out.println(articleInfoMapper.selectArticleById(1));
    }

8 连接成功

总结:

在MyBatis中,XML配置文件扮演着至关重要的角色,它们定义了数据库操作的行为和规则。接下来,我将用通俗的例子来解释这些配置文件的概念和功能。

1. XML配置文件的概念

XML配置文件是一种使用XML语言编写的文件,它们包含了MyBatis框架运行所需的配置信息。MyBatis通过解析这些XML文件来获取数据库连接信息、SQL语句、映射关系等,从而实现对数据库的操作。

2. 全局配置文件(mybatis-config.xml)

概念

全局配置文件是MyBatis的“总开关”,它包含了MyBatis运行所需的全局设置,如数据源、事务管理、类型别名、插件等。

功能

  • 数据源配置:告诉MyBatis如何连接到数据库,包括数据库的URL、用户名、密码等信息。这就像是你告诉家里的水龙头(MyBatis):“嘿,水龙头,去厨房的水管(数据库)那里取水吧,密码是XXX”。
  • 事务管理:配置MyBatis如何进行事务管理,确保数据库操作的原子性、一致性、隔离性和持久性。这就像是你告诉水龙头:“记得每次用完都要关紧,别漏水哦”。
  • 映射器配置:指定Mapper XML文件的位置,Mapper XML文件是定义SQL语句和映射规则的地方。这就像是你告诉水龙头:“哦对了,那些具体的用水规则(SQL语句)都在那边的墙上贴着(Mapper XML文件)呢”。

3. 映射器文件(Mapper XML)

概念

映射器文件是MyBatis的核心,它定义了SQL语句以及这些SQL语句如何与Java对象进行映射。

功能

  • 定义SQL语句:在Mapper XML文件中,你可以定义各种SQL语句,如查询、插入、更新、删除等。这些SQL语句会根据你的业务需求来编写,实现数据的增删改查。
  • 映射规则:除了SQL语句外,Mapper XML文件还定义了SQL语句的返回结果如何映射到Java对象上,以及Java对象的哪些属性会被用作SQL语句的参数。这就像是你告诉水龙头:“嘿,当我打开这个开关(调用Mapper接口的方法)时,你就去执行墙上的那条规则(SQL语句),然后把结果放到这个杯子里(Java对象)吧”。

举个例子~

想象一下,你是一家餐厅的老板,MyBatis就是你的厨房助手。全局配置文件就像是厨房的“总菜单”,它告诉厨房助手(MyBatis)如何准备食材(连接到数据库),以及厨房的基本规则(事务管理)。而映射器文件就像是具体的“菜品制作说明”,它详细描述了每一道菜(SQL语句)的制作步骤(SQL逻辑),以及如何将食材(数据库数据)变成美味的菜品(Java对象)。

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

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

相关文章

使用Langchain构建简单的数据库Agent

这篇文章我们介绍一个使用LangChain实现SQLagent的方法&#xff0c;LangChain直接内置了自己的SQLagent实现-—SQLDatabaseChain。这个方法使用 SQL Alchemy 与数据库交互。感兴趣的可以考虑一下这两个方案是否可以融合&#xff0c;这样保证SQL的准确性从而提升最终结果的准确率…

修改依赖库

修改依赖库 在开发时&#xff0c;当我们发现使用的依赖库有 bug&#xff0c;需要修改&#xff0c;一般都有这几种处理方式&#xff1a; fork 源码&#xff0c;修复 bug 然后提交 pr&#xff0c;等待作者合并&#xff0c;发布新版本提 issue 等待作者修复&#xff08;跟方式1类…

从物理学到电气工程:如何自学PLC进入工厂担任助理工程师?

本科物理专业自学 PLC 方向&#xff0c;有机会进厂担任助理电气工程师&#xff0c;但可能会面临一些挑战。在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「PLC的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“…

reactive函数

承上启下 在上一节 ref() 函数中&#xff0c;我们大致理解了 ref() 函数的作用是用来将数据转化为响应式的。但是对于基本类型和引用类型&#xff0c;Vue3底层做的转换不一致&#xff1a;对于基本类型&#xff0c;Vue3 通过 ref() 函数将变量转化为了 RefImpl引用对象从而实现响…

NVIDIA把Llama-3的上下文长度扩展16倍,长上下文理解能力超越GPT-4

在 Llama-3.1 模型发布之前&#xff0c;开源模型与闭源模型的性能之间一直存在较大的差距&#xff0c;尤其是在长上下文理解能力上。 大模型的上下文处理能力是指模型能够处理的输入和输出 Tokens 的总数。这个长度有一个限制&#xff0c;超过这个限制的内容会被模型忽略。一般…

Power功效分析之均值差原理及案例实操分析

Power功效分析常用于实验研究时样本量的计算&#xff08;或功效值计算&#xff09;&#xff0c;实验研究中均值差的使用较多&#xff0c;具体包括单样本t检验、独立样本t检验、配对t检验、单样本z检验、Mann-whitey检验和配对符号秩和检验等&#xff0c;具体如下表格所述&#…

最新版的,SpringBoot整合Sharding-Jdbc实现读写分离

Sharding-Jdbc实现读写分离 Hello&#xff0c;兄弟们好&#xff0c;我是Feri&#xff0c;最近整理了最新的基于Seata-Server2.0实现分布式事务的demo&#xff0c;希望对你有所帮助&#xff0c;有任何问题&#xff0c;可以随时沟通交流&#xff0c;在成为技术大牛的路上&#xf…

校园点餐系统

1 项目介绍 1.1 摘要 在这个被海量信息淹没的数字化时代&#xff0c;互联网技术以惊人的速度迭代&#xff0c;信息的触角无处不在&#xff0c;社会的脉动随之加速。每一天&#xff0c;我们都被汹涌而至的数据浪潮包裹&#xff0c;生活在一个全方位的数字信息矩阵中。互联网的…

vue3解析markdown文件为html并且高亮显示代码块

前言&#xff1a; 很多时候我们程序员写的文档都是以markdown为主&#xff0c;但是我们每次找相关资料极为不便&#xff0c;如果能直接把markdown文档引进vue项目里&#xff0c;解析成html并且展示出来&#xff0c;然后部署在服务器上&#xff0c;查看是不是极为方便呢。&…

3D打印随形透气钢:模具困气终结者

困气是模具经常遇到的问题&#xff0c;是制约生产效率与产品质量的关键因素之一。传统透气钢材料虽有所助益&#xff0c;但其在加工复杂度、形状适应性及性能均衡性上的局限性明显。在此背景下&#xff0c;3D打印技术的革新性应用——随形透气钢应运而生&#xff0c;为困气、排…

view 和 reshape的区别 及 测试对一个数据执行view 和 reshape之后得到的数据还一样吗

一、测试对一个数据执行view 和 reshape之后得到的数据还一样吗 问题&#xff1a; x torch.randn(2, 3, 4) y_view x.view(12&#xff0c; 2) y_reshape y_view.reshape(2&#xff0c;3, 4)得到的结果一样吗 import torch# 创建一个张量 x torch.randn(2, 3, 4)# 使用 …

Datawhale夏令营AI for Science(AI+气象)学习笔记1

如何针对降水预测问题搭建模型 回顾baseline, 我们可以大致将搭建模型并解决问题分为以下几个步骤: 定义数据集, 建立起训练数据和标签之间的关系&#xff1b;定义数据加载器(DataLoader)&#xff0c; 方便取数据进行训练 定义模型, 利用PyTorch搭建网络&#xff0c;根据输入…

关于DynamoRIO处理多线程程序时候的问题

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

【天机学堂】面试总结

写在前面&#xff0c;首先要将天机学堂包装一下&#xff0c;智慧教育平台》&#xff0c;暂时就想到这个。天机学堂文档 1.包装简历 待更新。。。

持续集成09--Jenkins配置Sonar代码漏洞扫描工具

专栏内容 持续集成01--Git版本管理及基础应用实践_持续集成下的git分支-CSDN博客 持续集成02--Linux环境更新/安装Java新版本-CSDN博客 持续集成03--Jenkins的安装与配置-CSDN博客 持续集成04--Jenkins结合Gitee创建项目_jenkins集成gitee-CSDN博客 持续集成05--Gogs的安装与使…

Ubuntu运行深度学习代码,代码随机epoch中断没有任何报错

深度学习运行代码直接中断 文章目录 深度学习运行代码直接中断问题描述设备信息问题补充解决思路问题发现及正确解决思路新问题出现最终问题&#xff1a;ubuntu系统&#xff0c;4090显卡安装英伟达驱动535.x外的驱动会导致开机无法进入桌面问题记录 问题描述 运行深度学习代码…

MySQL--表完整性约束

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 作用&#xff1a;用于保证数据的完整性和一致性 约束条件说明PRIMARY KEY (PK)该字段为该表的主键&#xff0c;可以唯一的标识记录&#xff0c;不可以…

【Python 逆向滑块】(实战三)逆向滑块,并实现用Python+Node.js 生成滑块、识别滑块、验证滑块、发送短信

逆向日期&#xff1a;2024.08.01 使用工具&#xff1a;Node.js 本章知识&#xff1a;逆向网易易盾【cb】参数 文章难度&#xff1a;中等&#xff08;没耐心的请离开&#xff09; 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理…

乐鑫ESP32-S3语音唤醒和命令词识别,XIAO ESP32 S3 Sense开发套件应用

在这个数字化飞速发展的时代&#xff0c;小型化、智能化已成为技术发展的趋势。ESP32-S3芯片在物联网和嵌入式机器学习领域的应用潜力&#xff0c;让我们对智能设备的未来充满了无限遐想。 OpenGlass项目中的Seeed Studio XIAO ESP32 S3 Sense开发套件&#xff0c;以其小巧的体…