MyBatis Mapper 接口的作用,以及如何将 Mapper 接口与 SQL 映射文件关联起来

MyBatis Mapper 接口在 MyBatis 框架中扮演着至关重要的角色,它充当了 Java 代码与 SQL 映射文件之间的桥梁,使得我们可以通过面向对象的方式来操作数据库。

Mapper 接口的作用:

  1. 定义数据库操作方法: Mapper 接口中定义的方法与 SQL 映射文件中的 SQL 语句(select, insert, update, delete)一一对应。 每个方法代表一个特定的数据库操作。
  2. 类型安全: Mapper 接口提供了类型安全的数据库操作。方法参数和返回值类型在编译时就会进行检查,避免了类型转换错误。
  3. 代码简洁: 通过 Mapper 接口,我们可以直接调用方法来执行 SQL 语句,而无需编写繁琐的 JDBC 代码。
  4. 易于测试: Mapper 接口可以很容易地进行单元测试,我们可以使用 Mock 对象来模拟数据库交互,而无需实际连接数据库。
  5. 与 Spring 集成: MyBatis 可以与 Spring 框架无缝集成,Mapper 接口可以被 Spring 容器管理,方便进行依赖注入。

Mapper 接口与 SQL 映射文件的关联方式:

MyBatis 提供了两种主要的方式来将 Mapper 接口与 SQL 映射文件关联起来:

1. XML 配置方式 (传统方式):

  • SQL 映射文件 (XML): SQL 语句写在 XML 文件中,例如 UserMapper.xml
  • Mapper 接口: 定义与 XML 文件中 SQL 语句对应的方法,例如 UserMapper.java
  • 关联方式: 通过 XML 文件中的 namespace 属性与 Mapper 接口的全限定名进行关联。

示例:

  • UserMapper.xml:
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.mapper.UserMapper"> 
    <select id="selectUserById" parameterType="int" resultType="com.example.model.User">
      SELECT id, username, password, email FROM users WHERE id = #{id}
    </select>

    <insert id="insertUser" parameterType="com.example.model.User">
         INSERT INTO users(username, password) VALUES(#{username}, #{password})
    </insert>
  </mapper>
  • <mapper namespace="com.example.mapper.UserMapper">: namespace 属性值必须与 Mapper 接口的全限定名一致。

  • id="selectUserById":该select语句的唯一标识符,与Mapper接口中对应的方法名相同。

  • id="insertUser":该insert语句的唯一标识符,与Mapper接口中对应的方法名相同。

    • UserMapper.java (Mapper 接口):
    java 复制代码
    package com.example.mapper;
    
    import com.example.model.User;
    
    public interface UserMapper {
        User selectUserById(int id);
        int insertUser(User user);
    }

    MyBatis 配置文件 (mybatis-config.xml 示例,部分配置):

    xml 复制代码
        <mappers>
          <mapper resource="com/example/mapper/UserMapper.xml"/> 
        </mappers>
  • <mapper resource="com/example/mapper/UserMapper.xml"/>: 指定 SQL 映射文件的位置。

  • 也可以使用 <package name="com.example.mapper"/> 来扫描指定包下的所有 Mapper 接口和对应的 XML 文件 (前提是 XML 文件与 Mapper 接口在同一个包下,且文件名与接口名相同)。

2. 注解方式 (更简洁的方式):

  • SQL 映射文件 (可选): 对于简单的 SQL 语句,可以直接在 Mapper 接口的方法上使用 MyBatis 提供的注解 (@Select, @Insert, @Update, @Delete) 来编写 SQL 语句,此时可以不需要 XML 文件。 对于复杂的 SQL 语句,仍然建议使用 XML 文件。
  • Mapper 接口: 在接口方法上使用注解来定义 SQL 语句。
  • 关联方式: MyBatis 会自动扫描带有 @Mapper 注解的接口,并将注解中的 SQL 语句与方法关联起来。

示例:

  • UserMapper.java (Mapper 接口):
java 复制代码
  package com.example.mapper;

  import com.example.model.User;
  import org.apache.ibatis.annotations.*;

  @Mapper // 标记该接口为一个 MyBatis Mapper 接口
  public interface UserMapper {

      @Select("SELECT id, username, password, email FROM users WHERE id = #{id}")
      User selectUserById(int id);

      @Insert("INSERT INTO users(username, password) VALUES(#{username}, #{password})")
      @Options(useGeneratedKeys = true, keyProperty = "id") // 获取自增主键
      int insertUser(User user);

      // 也可以混合使用注解和 XML
      @SelectProvider(type = UserSqlProvider.class, method = "buildGetUsersByName")
      List<User> getUsersByName(String name);
  }
   
  //对于复杂SQL可以使用Provider
  class UserSqlProvider {
     public String buildGetUsersByName(String name) {
       return new SQL(){{
         SELECT("*");
         FROM("users");
         if (name != null) {
           WHERE("username like #{name}");
         }
         ORDER_BY("id");
       }}.toString();
     }
   }
  • @Select, @Insert, @Update, @Delete: 分别对应 SQL 的四种操作。

    • @Options: 用于配置一些额外的选项,例如获取自增主键。
    • @Mapper: 标记该接口,让MyBatis扫描并进行处理
    • @SelectProvider, @InsertProvider, @UpdateProvider, @DeleteProvider: 用于构建动态 SQL。
  • MyBatis 配置文件 (mybatis-config.xml,如果使用纯注解方式,且通过 Spring Boot 自动配置,则通常不需要此文件):

  • 如果使用 Spring Boot,通常不需要手动配置 MyBatis 配置文件,Spring Boot 会自动扫描带有 @Mapper 注解的接口,并进行自动配置。

  • 如果不是 Spring Boot 项目,需要在 MyBatis 配置文件中使用 <mappers> 标签来扫描 Mapper 接口:

xml 复制代码
     <mappers>
        <package name="com.example.mapper"/> 
     </mappers>

或者,如果使用了XML文件

xml 复制代码
<mappers>
   <mapper class="com.example.mapper.UserMapper"/> 
</mappers>

总结:

  • XML 配置方式: 更适合复杂的 SQL 语句和需要细粒度控制的场景。
  • 注解方式: 更简洁,更适合简单的 SQL 语句,并且与 Spring Boot 集成更方便。
  • 两种方式可以混合使用,根据实际情况选择最合适的方式。 通常对于简单的 CRUD 操作使用注解,复杂的查询使用 XML。

无论使用哪种方式,MyBatis 都会根据 Mapper 接口的方法名和参数类型,自动查找并执行对应的 SQL 语句,并将结果映射为 Java 对象或基本类型。

相关推荐
deadknight96 分钟前
表、索引统计信息锁定和解锁
数据库·oracle
yinghuabanwo13 分钟前
【1688】崖山集群YAC安装备忘
数据库·崖山yashandb
不剪发的Tony老师13 分钟前
PostgreSQL 18新特性之虚拟生成列
数据库·postgresql
考虑考虑31 分钟前
UNION和UNION ALL的用法与区别
数据库·后端·mysql
CL_IN44 分钟前
如何将聚水潭·奇门平台数据高效集成到MySQL
android·数据库·mysql
m0_748248021 小时前
Spring Boot 集成 MyBatis 全面讲解
spring boot·后端·mybatis
8643063372 小时前
在Visual Studio 2022中实现Qt插件开发
数据库·qt·visual studio
andrew_12192 小时前
暑期第一面oωo, TME一面面经
java·后端·sql·mysql·面试
笑远2 小时前
Oracle/MySQL/PostgreSQL 到信创数据库数据同步简介
数据库·python·etl