【gopher的java学习笔记】mybatis的mapper是什么

MyBatis Mapper技术介绍

简介

MyBatis是一个流行的Java持久层框架,它提供了对象关系映射(ORM)的功能,使得Java对象和数据库中的表之间的映射变得简单。在MyBatis中,Mapper是一个核心的概念,它定义了映射到数据库操作的接口。简而言之,Mapper是一个接口,MyBatis通过这个接口与XML映射文件或者注解绑定,以实现对数据库的操作。[12]

Mapper的含义

数据库操作的映射

Mapper提供了一种映射机制,允许开发者在XML文件或接口的注解中定义SQL语句,然后通过接口方法直接调用这些SQL语句。这样,Java代码就与SQL语句解耦了,提高了代码的可维护性和可读性。[12]

接口绑定

Mapper通常是一个接口,每一个Mapper接口对应数据库中的一个表或者一组相关操作。MyBatis在启动时会自动扫描这些接口,并通过动态代理技术生成这些接口的实现类。开发者通过调用这些接口方法就可以执行相应的SQL语句。[7]

Mapper的作用

简化数据库操作

开发者无需编写具体的JDBC代码,只需要定义接口方法和对应的SQL映射即可直接操作数据库。[12]

提升开发效率

Mapper的使用大大减少了数据库操作代码的重复编写工作,让开发者可以将更多的精力集中在业务逻辑上。[12]

保障SQL和Java代码的分离

将SQL语句写在XML文件或通过注解与接口方法绑定,实现了SQL语句与Java代码的物理分离,提升了代码的可读性和可维护性。[12]

Mapper的实现

MyBatis支持两种方式来实现Mapper:XML映射文件和注解。

XML映射文件

这是最传统的方式,开发者在XML文件中定义Mapper接口的命名空间和对应的SQL语句,然后在接口中定义相应的方法。MyBatis通过读取这些XML文件,自动将接口方法和SQL语句绑定。[12]

XML映射文件的结构
  • namespace :命名空间,通常是一个接口的完全限定名,用以隔离不同的Mapper,以确保其唯一性。[6]
  • select、insert、update、delete等标签 :这些标签用于定义具体的操作数据库的SQL语句。每个标签都具有多个属性,如id、parameterType、resultType等,用于配置SQL语句的详细信息。[6]
  • parameterType :用于指定SQL语句的参数类型,可以是基本类型,也可以是JavaBean或者Map等复杂类型。[6]
  • resultType :用于指定查询结果的返回类型,可以是基本类型,也可以是JavaBean,还可以是集合类型。[6]
  • #{} :使用在SQL语句中,用于指定参数占位符,MyBatis会自动进行参数替换。[6]
  • :允许引用在标签中定义的SQL片段,实现SQL语句的复用。[6]
示例

假设我们有一个用户表users,下面是对应的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" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
    <insert id="insertUser" parameterType="com.example.model.User">
        INSERT INTO users (username, email, password) VALUES (#{username}, #{email}, #{password})
    </insert>
    <!-- Add more SQL mappings here -->
</mapper>

注解

为简化开发,MyBatis也支持在Mapper接口的方法上直接使用注解来定义SQL语句,这样可以不需要编写XML映射文件。但是,对于复杂的SQL语句,使用注解方式可能会使接口方法变得较为混乱。[12]

示例

假设我们有一个用户表users,下面是对应的UserMapper接口,使用注解方式定义SQL语句:

java 复制代码
package com.example.mapper;

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

import java.util.List;

public interface UserMapper {

    @Select("SELECT * FROM users WHERE id = #{id}")
    User selectUserById(Integer id);

    @Select("SELECT * FROM users")
    List<User> selectAllUsers();

    @Insert("INSERT INTO users (username, email, password) VALUES (#{username}, #{email}, #{password})")
    void insertUser(User user);

    @Update("UPDATE users SET username = #{username}, email = #{email}, password = #{password} WHERE id = #{id}")
    void updateUser(User user);

    @Delete("DELETE FROM users WHERE id = #{id}")
    void deleteUser(Integer id);
}

Mapper的优化

使用MyBatis Generator

MyBatis Generator是一个代码生成工具,可以根据数据库表自动生成Mapper接口、XML映射文件和Java模型类。通过合理配置,可以大大减少手动编写代码的工作量。[3]

自定义模板和插件

MyBatis Generator允许使用自定义模板和插件来生成代码。开发者可以根据项目需求,创建自定义模板来生成符合项目规范的代码,或者使用插件来扩展MyBatis Generator的功能。[3]

通用Mapper

MyBatis通用Mapper是一个开源项目,提供了一系列通用的数据库操作方法,如单表的增删改查等。通过引入通用Mapper,可以进一步简化Mapper接口的定义和使用。[8]

Mapper的注意事项

一致性

Mapper接口中的方法名称和XML映射文件中的SQL语句ID必须一一对应,否则会导致找不到对应的SQL语句。[7]

参数类型

Mapper接口中的方法参数必须与SQL语句的参数一致,包括命名和类型,否则会导致参数无法传递或类型转换错误。[7]

缓存

MyBatis提供了两级缓存机制,包括SqlSession级别的缓存和mapper级别的缓存。开发者可以根据项目需求,合理配置缓存策略,以提高数据访问的性能。[9]

总结

MyBatis的Mapper技术通过接口绑定机制,实现了对数据库操作的简化和高效。开发者可以通过XML映射文件或注解方式定义SQL语句,并通过Mapper接口直接调用这些SQL语句。同时,通过合理使用MyBatis Generator、自定义模板和插件以及通用Mapper等工具,可以进一步优化Mapper的使用,提高开发效率。

相关推荐
sigmoidAndRELU5 分钟前
读Vista
笔记·stable diffusion·世界模型
wei_shuo24 分钟前
飞算 JavaAI 开发助手:深度学习驱动下的 Java 全链路智能开发新范式
java·开发语言·飞算javaai
Sincerelyplz41 分钟前
【Temproal】快速了解Temproal的核心概念以及使用
笔记·后端·开源
欧阳秦穆1 小时前
apoc-5.24.0-extended.jar 和 apoc-4.4.0.36-all.jar 啥区别
java·jar
岁忧1 小时前
(LeetCode 面试经典 150 题 ) 58. 最后一个单词的长度 (字符串)
java·c++·算法·leetcode·面试·go
Java初学者小白1 小时前
秋招Day14 - Redis - 应用
java·数据库·redis·缓存
代码老y1 小时前
Spring Boot + 本地部署大模型实现:优化与性能提升
java·spring boot·后端
GodKeyNet1 小时前
设计模式-桥接模式
java·设计模式·桥接模式
许白掰1 小时前
【stm32】HAL库开发——CubeMX配置RTC,单片机工作模式和看门狗
stm32·单片机·嵌入式硬件·学习·实时音视频
future14122 小时前
C#学习日记
开发语言·学习·c#