当前位置: 首页 > news >正文

Mybatis 的代理开发方式

MyBatis 的 代理开发方式(Mapper 接口代理)是其核心特性之一,通过动态代理技术,将 Mapper 接口的方法调用自动映射到 XML 或注解中定义的 SQL 语句。这种方式避免了手动编写 DAO 实现类,极大简化了持久层代码。

1.代理开发的核心原理

  1. 动态代理机制
    MyBatis 在运行时通过 JDK 动态代理 为 Mapper 接口生成代理对象。当调用接口方法时,代理对象会根据方法名、参数和返回类型,找到对应的 SQL 并执行。

  2. 映射规则

    • XML 映射:接口方法名与 XML 中的 <select|insert|update|delete> 标签的 id 匹配。
    • 注解映射:直接在接口方法上使用 @Select@Insert 等注解定义 SQL。
  3. 核心组件

    • Mapper 接口:定义数据库操作方法。
    • 映射文件/注解:绑定 SQL 与接口方法。
    • SqlSession.getMapper():获取接口的代理对象。

2.代理开发步骤(XML方式)

2.1定义Mapper接口

public interface UserMapper {
    // 根据ID查询用户
    User selectById(int id);
    
    // 插入用户
    int insert(User user);
    
    // 更新用户
    int update(User user);
    
    // 删除用户
    int delete(int id);
}

2.2创建XML映射文件

在resource/mapper/UserMapper.xml中编写SQL:

<?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">
    <!-- 根据ID查询 -->
    <select id="selectById" parameterType="int" resultType="User">
        SELECT * FROM user WHERE id = #{id}
    </select>

    <!-- 插入用户 -->
    <insert id="insert" parameterType="User">
        INSERT INTO user (name, age) 
        VALUES (#{name}, #{age})
    </insert>

    <!-- 更新用户 -->
    <update id="update" parameterType="User">
        UPDATE user SET name = #{name}, age = #{age}
        WHERE id = #{id}
    </update>

    <!-- 删除用户 -->
    <delete id="delete" parameterType="int">
        DELETE FROM user WHERE id = #{id}
    </delete>
</mapper>

2.3配置myBatis核心文件

在mybatis-config.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">
    <!-- 根据ID查询 -->
    <select id="selectById" parameterType="int" resultType="User">
        SELECT * FROM user WHERE id = #{id}
    </select>

    <!-- 插入用户 -->
    <insert id="insert" parameterType="User">
        INSERT INTO user (name, age) 
        VALUES (#{name}, #{age})
    </insert>

    <!-- 更新用户 -->
    <update id="update" parameterType="User">
        UPDATE user SET name = #{name}, age = #{age}
        WHERE id = #{id}
    </update>

    <!-- 删除用户 -->
    <delete id="delete" parameterType="int">
        DELETE FROM user WHERE id = #{id}
    </delete>
</mapper>

2.4获取对象并调用方法

// 1. 获取 SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();

// 2. 获取 Mapper 代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 3. 调用接口方法执行 SQL
User user = userMapper.selectById(1);
int rows = userMapper.insert(new User("Alice", 25));

// 4. 提交事务并关闭会话
sqlSession.commit();
sqlSession.close();

3.代理开发方式(注解方式)

3.1使用注解定义SQL

public interface UserMapper {
    @Select("SELECT * FROM user WHERE id = #{id}")
    User selectById(int id);

    @Insert("INSERT INTO user (name, age) VALUES (#{name}, #{age})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(User user);

    @Update("UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}")
    int update(User user);

    @Delete("DELETE FROM user WHERE id = #{id}")
    int delete(int id);
}

3.2配置扫描mapper接口

在mybatis-config.xml中指定包接口路径

<mappers>
    <package name="com.example.mapper"/>
</mappers>

4.注意事项

Mapper接口开发方法只需要编写Mapper接口(相当于DAO接口),由MyBatis框架根据接口定义创建接口的动态代理对象。

Mapper接口开发需要遵循以下规范:

  • Mapper.xml文件中的namespace与mapper接口的全限定名相同
  • Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
  • Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的patameterType的类型相同
  • Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType类型相同
http://www.dtcms.com/a/47709.html

相关文章:

  • golang接口
  • JS逆向获取算法 使用算法逻辑进行爆破
  • 晨控CK-FR03与汇川H5U系列PLC配置EtherCAT通讯连接手册
  • 蓝桥杯真题解题思路——因数计数
  • [免费]微信小程序(校园)二手交易系统(uni-app+SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
  • C++小课堂——构造函数与析构函数
  • 2025 Lakehouse 趋势全景展望:从技术演进到商业重构
  • Linux线程
  • Tauri+React+Ant Design跨平台开发环境搭建指南
  • Maven
  • B3DM转换成PLY
  • Spark之数据倾斜调优
  • 【后端】Flask vs Django vs Node.js 对比分析
  • Linux系统(以Ubuntu为例)安装高版本nodejs
  • 爬虫:一文掌握 Celery 分布式爬虫,及对应实战案例
  • 《AI模型变形记:从绿巨人到Hello Kitty的魔幻减肥营》
  • 【计算机网络——概述】
  • 【3D格式转换SDK】HOOPS Exchange技术概览(二):3D数据处理高级功能
  • 如何合理设置请求间隔?
  • 如何优化百度下拉框?下拉框展示规则是怎样的?
  • JavaEE--计算机是如何工作的
  • 优选算法的智慧之光:滑动窗口专题(二)
  • 如何将一台服务器的pip环境迁移到另一个机器?
  • 【开源-常用C/C++命令行解析库对比】
  • jvm内存不够,怎么重新分配
  • 蓝桥杯4T平台(串口打印电压值)
  • 【Prometheus】prometheus如何监控k8s集群
  • 工程化与框架系列(16)--前端路由实现
  • Kotlin协程(二)协程的生命周期及管理
  • 在Vscode开发QT,完成QT环境的配置