展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > MyBatis XML开发全面完整指南

MyBatis XML开发全面完整指南

MyBatisXML开发方式适合复杂SQL逻辑,通过配置数据库连接与mapper路径,在接口和XML映射文件中实现增删改查操作。XML支持多表查询及结果映射,#{}使用预编译防注入,${}直接拼接需注意字符串引号。

前期回顾:

MyBatis的开发有两种方式:

1.注解

2.XML

上一小节,我们聊了注解方式,这一节再来看XML方式。简单来说,注解适合快速搞定简单的增删改查,但一旦涉及复杂SQL逻辑,XML配置文件才是真正的利器——把SQL语句写在XML里,维护起来清晰得多。

一、MyBatis XML配置文件

用XML方式,主要完成两步:

  1. 配置数据库连接信息和MyBatis基础设置
  2. 写持久层代码

1.1 配置数据库连接信息和MyBatis基础设置

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.2 写持久层代码

持久层代码分两部分:

  1. 方法定义:Interface
  2. 方法实现:XXX.xml

MyBatis XML开发全面完整指南

1.2.1 添加mapper接口

先加一个插件:

MyBatis XML开发全面完整指南

数据持久层的定义接口:

package com.MybatisDemo.demo.mapper;
import com.MybatisDemo.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import ja va.util.List;
@Mapper
public interface UserInfoXMLMapper {
List queryAllUser();
}

1.2.2 添加UserInfoXMLMapper.xml



//这里的namespace根据实际情况写

创建UserInfoXMLMapper.xml,路径参考properties/yml中的配置

MyBatis XML开发全面完整指南

查询所有用户的具体实现:

  • 光标对准queryAllUser方法名,然后alt+enter键,点击Generate statement

MyBatis XML开发全面完整指南

将自动生成:

MyBatis XML开发全面完整指南

  • 标签中写入sql语句:

select username,`password`,age,gender,phone from user_info

  • 单元测试
@SpringBootTest
class UserInfoXMLMapperTest {
    @Autowired
    private UserInfoXMLMapper userInfoXMLMapper;
    @Test
    void queryAllUser(){
        List userInfoXMLList =userInfoXMLMapper.queryAllUser();
        System.out.println(userInfoXMLList);
    }
}
  • 运行展示

MyBatis XML开发全面完整指南

以上是具体操作,接下来对标签进行说明

MyBatis XML开发全面完整指南

  • 标签:需要指定 namespace 属性,表示命名空间,值为 mapper 接口的全限定名,包括全包名.类名。
  • 标签,这在上一节已初步接触。这里补充更详细的用法和参数传递。

    Mapper 接口方法定义(带参数查询):

    // 根据用户名查询用户
    UserInfo selectUserByName(String username);

    XML 映射配置:

    运行展示:

    MyBatis XML开发全面完整指南

    解决方法和类注解类似:

    1.起别名

    2.结果映射

    3.开启驼峰命名

    其中1,3的解决方法和注解一样,感兴趣的可以看上一篇文章,接下来介绍xml中的结果映射

    
        
        
        
        
    
    

    通过 XML 配置 SQL,使得 SQL 语句与 Ja va 代码分离,结构更清晰,尤其便于维护复杂的动态 SQL

    三、其他查询操作

    3.1 多表查询

    多表查询和单表查询类似,只是sql不同而已

    数据准备:

    DROP TABLE IF EXISTS articleinfo;
    CREATE TABLE articleinfo (
     id INT PRIMARY KEY auto_increment,
     title VARCHAR ( 100 ) NOT NULL,
     content TEXT NOT NULL,
     uid INT NOT NULL,
     delete_flag TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
     create_time DATETIME DEFAULT now(),
     update_time DATETIME DEFAULT now() 
    ) DEFAULT charset 'utf8mb4';
    //插入测试数据
    INSERT INTO articleinfo ( title, content, uid ) VALUES ( 'Ja va', 'Ja va正文', 1);

    数据查询 需求: 根据uid查询作者的名称等相关信息:

    select ta.id,ta.title,ta.content,ta.uid,tb.username,tb.age,tb.gender 
    from articleinfo ta 
    left join user_info tb 
    on ta.uid = tb.id 
    where ta.id =1

    对应model:

    @Data
    public class ArticleInfo {
        private Integer id;
        private String title;
        private String content;
        private Integer uid;
        private Integer deleteFlag;
        private Date createTime;
        private Date updateTime;
        //⽤⼾相关信息
        private String username;
        private Integer age;
        private Integer gender;
    }

    接口定义:

    @Mapper
    public interface ArticleInfoMapper {
         @Select("SELECT ta.id,ta.title,ta.content,ta.uid,tb.username,tb.age,tb.gender " + "FROM articleinfo ta LEFT JOIN user_info tb ON ta.uid = tb.id " + "WHERE ta.id = #{id}") ArticleInfo queryUserByUid(Integer id);}

    3.2 #{} 和 ${}

    3.2.1 #{} 和 ${} 使用

    • 先看Interger类型的参数

    #{} 的使用示例:

      @Select("select username, password, age, gender, phone from user_info where id = #{id}")
        UserInfo queryById(Integer id);

    MyBatis XML开发全面完整指南

    我们发现我们输入的参数并没有在后面拼接,id值使用 ?进行占位,这中sql我们称为“预编译sql”

    ${} 的使用示例:

      @Select("select username, password, age, gender, phone from user_info where id = ${id}")
        UserInfo queryById(Integer id);

    MyBatis XML开发全面完整指南

    • 看String类型的参数

    #{} 的使用示例:

        @Select("select username, password, age, gender, phone from user_info where username = #{name}")
        UserInfo queryByname(String name);

    MyBatis XML开发全面完整指南

    ${} 的使用示例:

        @Select("select username, password, age, gender, phone from user_info where username = ${name}")
        UserInfo queryByname(String name);

    MyBatis XML开发全面完整指南

    可以看到,这次参数依然是直接拼接在sql语句中了,但是字符串作为参数,需要添加单引号,使用${ }不会拼接引号,导致程序报错

    修改代码为:

    @Select("select username, password, age, gender, phone from user_info where username = '${name}'")
        UserInfo queryByname(String name);

    MyBatis XML开发全面完整指南

    从上面例子可以看出:

    #{} 使用的是预编译SQL, 通过 ? 占位的⽅式, 提前对SQL进行编译, 然后把参数填充到SQL语句中. #{} 会根据参数类型, ⾃动拼接引号 '' . ${} 会直接进行字符替换, ⼀起对SQL进行编译. 如果参数为字符串, 需要加上引号 '' . 参数为数字类型时, 也可以加上, 查询结果不变, 但是可能会导致索引失效, 性能下降.

    3.2.2 #{} 和 ${} 区别

    1. 处理方式不同:#{} 采用预编译处理,而 ${} 是字符串直接替换。
    2. 安全性差异:#{} 可以有效防止 SQL 注入攻击,而 ${} 存在 SQL 注入的风险。在查询语句中,虽然可以使用 ${},但通常推荐使用 #{}。
    3. 适用场景:在某些特定场景下,#{} 无法满足需求,例如:
      • 排序功能(ORDER BY 子句)
      • 表名作为参数时
      • 字段名作为参数时
      这些情况需要使用 ${}。
    4. 模糊查询处理:虽然 ${} 可以完成模糊查询,但由于存在 SQL 注入风险,通常建议使用 MySQL 内置的 CONCAT() 函数配合 #{} 来实现:
    
    

    总结:在大多数情况下,应优先使用 #{} 以确保安全性;只有在需要动态指定表名、字段名或排序方式等特殊场景下,才考虑使用 ${},并确保参数来源可信。

    3.3 排序功能

    在 MyBatis 中实现动态排序功能时,由于 #{} 会对参数进行预编译处理并添加引号,导致 SQL 语句语法错误,因此需要使用 ${} 来实现。

    Mapper 接口方法定义:

    // 根据指定字段排序查询用户列表
    List selectUsersOrderBy(@Param("orderField") String orderField, @Param("orderType") String orderType);

    XML 映射配置:

    测试方法:

    @Test
    void testSelectUsersOrderBy() {
        // 按年龄降序排列
        List users = userInfoXMLMapper.selectUsersOrderBy("age", "DESC");
        users.forEach(System.out::println);
    // 按创建时间升序排列
    List users2 = userInfoXMLMapper.selectUsersOrderBy("create_time", "ASC");
    users2.forEach(System.out::println);
    }

    安全注意事项:

    • 使用 ${} 时,必须确保参数值来自可信来源,避免用户直接输入
    • 可以在业务层对排序字段和排序类型进行白名单验证
    • 建议提供固定的排序选项供用户选择,而不是完全开放输入

    3.4 like查询

    在 MyBatis 中进行模糊查询时,虽然可以使用 ${},但由于安全考虑,推荐使用 #{} 配合 MySQL 的 CONCAT() 函数来实现。

    Mapper 接口方法定义:

    // 根据用户名模糊查询
    List selectUsersLikeName(@Param("keyword") String keyword);

    XML 映射配置(安全写法):

    XML 映射配置(不安全写法 - 不推荐):

    
    

    测试方法:

    @Test
    void testSelectUsersLikeName() {
        // 查询包含"张"字的用户
        List users = userInfoXMLMapper.selectUsersLikeName("张");
        System.out.println("查询结果数量:" + users.size());
        users.forEach(System.out::println);
    // 查询包含"admin"的用户
    List users2 = userInfoXMLMapper.selectUsersLikeName("admin");
    System.out.println("查询结果数量:" + users2.size());
    }

    其他模糊查询模式:

    • 左模糊: LIKE CONCAT('%', #{keyword})
    • 右模糊: LIKE CONCAT(#{keyword}, '%')
    • 全模糊: LIKE CONCAT('%', #{keyword}, '%')(如上例)

    性能优化建议:

    • 对于大数据表的模糊查询,建议添加合适的索引
    • 避免在模糊查询条件前使用通配符 %,这会导致索引失效
    • 考虑使用全文索引(FULLTEXT)替代 LIKE 查询,提高查询效率

    四、数据库连接池

    4.1 介绍

    数据库连接池(Database Connection Pool)是一种用于管理数据库连接的技术,它在应用程序启动时创建一定数量的数据库连接,并将这些连接保存在一个"池"中。当应用程序需要访问数据库时,从连接池中获取一个空闲连接,使用完毕后归还给连接池,而不是直接关闭连接。

    数据库连接池的主要优势:

    • 提高性能:避免了频繁创建和销毁连接的开销
    • 资源复用:连接可以被多个请求重复使用
    • 连接管理:可以控制连接数量,防止数据库过载
    • 超时处理:自动回收空闲连接,避免连接泄漏

    常见的数据库连接池实现:

    1. Hikari(黑卡里):Spring Boot 2.x 默认连接池,性能优异
    2. Druid(德鲁一):阿里巴巴开源,功能全面,监控完善
    3. Tomcat JDBC Pool:Tomcat 内置连接池
    4. C3P0:老牌连接池,稳定性好

    4.2 使用

    • Hikari:SpringBoot默认数据库连接池

    MyBatis XML开发全面完整指南

    • Druid:如果我们想把默认的数据库连接池切换为Druid数据库连接池,只需要引入相关依赖即可
    
     com.alibaba
     druid-spring-boot-3-starter
     1.2.21
    
    //如果SpringBoot版本为2.X, 使⽤druid-spring-boot-starter 依赖 
    
     com.alibaba
     druid-spring-boot-starter
     1.1.17
    

    五、小结

    这样,MyBatis XML开发的核心知识点就基本覆盖了。从配置文件到增删改查,再到动态SQL和安全注意事项,每一步都完整走通了。实际开发中,XML方式在复杂查询和团队协作方面优势明显,值得熟练掌握。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。