当前位置:

首页 > 编程开发 > 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方式在复杂查询和团队协作方面优势明显,值得熟练掌握。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    MyBatis Mapper 接口原理与实现解析
    MyBatis Mapper 接口原理与实现解析

    MyBatis通过动态代理自动生成Mapper接口实现类,运行时将接口方法绑定到SQL语句,结合XML映射文件中的SQL与参数配置,由SqlSession执行并返回结果,避免了手动编写实现类的繁琐过程。

    MyBatis框架常见问题及解决方案
    MyBatis框架常见问题及解决方案

    MyBatis常见问题包含:1.实体类属性与数据库字段不一致,解决方案为使用@Column注解映射;2.执行更新操作失败,需要配置update元素并检查SQL语句;3.查询结果映射出错,需检查resultMap配置是否正确;4.解析SQL参数失败,要使用#{}占位符并确保参数类型匹配。

    MyBatis框架中设计模式的应用
    MyBatis框架中设计模式的应用

    MyBatis框架广泛应用设计模式,包括:工厂模式:创建SqlSessionFactory对象,管理数据库连接和查询;代理模式:实现延迟加载和懒加载,提高性能。外观模式:封装对数据库访问,简化代码维护。其中,一对多关系映射可以通过User和Order类、Mapper接口和MapperXML配置实现,使用延迟加载和嵌套resultMap优化性能。

    MyBatis 的动态 SQL 解析:原理、实现和优化
    MyBatis 的动态 SQL 解析:原理、实现和优化

    MyBatis动态SQL解析:原理:使用TAG和OGNL表达式动态构建SQL语句。实现:通过SqlNode、SqlSource和ParameterHandler接口实现。优化:避免不必要的动态SQL、优化OGNL表达式、使用PreparedStatement缓存和配置查询超时。

    正确使用MyBatis中的小于符号
    正确使用MyBatis中的小于符号

    MyBatis是一个用Java语言编写的持久层框架,广泛用于数据库操作。在MyBatis中,使用小于号(<)进行条件查询是很常见的操作。但是,小于号在MyBatis中有一些使用注意事项,本文将介绍MyBatis小于号的正确使用方法,并提供具体的代码示例。1.在MyBatis中使用小于号的基本方法在MyBatis中使用小于号进行条件查询,一般是在SQL

    解析MyBatis的缓存机制:比较一级缓存和二级缓存的使用场景
    解析MyBatis的缓存机制:比较一级缓存和二级缓存的使用场景

    MyBatis的缓存机制解析:一级缓存与二级缓存的区别与应用在MyBatis框架中,缓存是一个非常重要的特性,可以有效提升数据库操作的性能。其中,一级缓存和二级缓存是MyBatis中常用的两种缓存机制。本文将详细解析一级缓存与二级缓存的区别与应用,并提供具体的代码示例进行说明。一、一级缓存一级缓存也被称为本地缓存,它默认开启且不可关闭。一级缓存是SqlSes

    深入了解MyBatis缓存机制:揭秘缓存存储原理
    深入了解MyBatis缓存机制:揭秘缓存存储原理

    MyBatis缓存机制详解:一文读懂缓存存储原理引言在使用MyBatis进行数据库访问时,缓存是一个非常重要的机制,能够有效减少对数据库的访问,提高系统性能。本文将详细介绍MyBatis的缓存机制,包括缓存的分类、存储原理和具体的代码示例。一、缓存的分类MyBatis的缓存主要分为一级缓存和二级缓存两种。一级缓存一级缓存是SqlSession级别的缓存,当在

    详解在MyBatis中使用小于符号的方法
    详解在MyBatis中使用小于符号的方法

    MyBatis中小于号的写法详解MyBatis是一个优秀的持久层框架,广泛应用于Java开发中。在使用MyBatis进行数据库操作的过程中,我们经常会用到小于号(<)进行条件查询。但是,MyBatis中小于号的写法并不像普通的SQL语句那样直接使用小于号符号,而是需要使用特定的方式来实现。本文将详细解释MyBatis中小于号的写法,并提供具体的代码示例

    深入理解MyBatis的批量插入操作
    深入理解MyBatis的批量插入操作

    MyBatis是一款流行的Java持久层框架,在数据库操作中有着很好的灵活性和扩展性。在实际开发中,我们经常会遇到批量添加数据的需求,本文将详细介绍如何在MyBatis中进行批量添加操作,并提供具体的代码示例。1.批量添加操作概述批量添加操作指的是一次性向数据库中插入多条数据的操作。相比单条插入,批量添加能够有效减少与数据库的交互次数,提高数据插入的效率。

    深入探讨MyBatis Generator的配置与操作技巧
    深入探讨MyBatis Generator的配置与操作技巧

    MyBatisGenerator是一个强大的代码生成工具,可以帮助开发人员自动生成与数据库表对应的JavaBean、Mapper接口和XML文件。本文将详细介绍如何配置和使用MyBatisGenerator,并提供具体的代码示例,帮助读者快速上手该工具。一、配置MyBatisGenerator在项目的pom.xml文件中添加MyBatisGener

    查看更多
    精品专题 更多
    装机必备
    装机必备

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

    Windows
    Windows

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

    PDF教程
    PDF教程

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

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。