羊蹓狼 发表于 2024-12-5 18:57:13

计划模式-署理模式

JDK动态署理

Mapper 接口的工作原理是 JDK 动态署理

在 MyBatis 框架中,Mapper 接口的工作原理确实是基于 JDK 动态署理机制。MyBatis 使用动态署理来创建接口的实现类实例,以便在运行时实行 SQL 语句并返回结果。以下是 MyBatis 怎样使用 JDK 动态署理实现 Mapper 接口的工作原理:
工作原理


[*] Mapper 接口定义:

[*]开发者定义一个 Mapper 接口,其中包罗了与数据库交互的方法。这些方法通常通过注解或 XML 文件来关联具体的 SQL 语句。

[*] 动态署理创建署理对象:

[*]当应用步调调用 SqlSession.getMapper(Class<T> type) 方法获取 Mapper 接口的实例时,MyBatis 会使用 JDK 动态署理为该接口创建一个署理对象。
[*]这个署理对象实现了 Mapper 接口,并且会将对接口方法的调用委托给一个 InvocationHandler 实现。

[*] MapperProxy 作为 InvocationHandler:

[*]MyBatis 使用 MapperProxy 类作为 InvocationHandler 的实现。
[*]MapperProxy 的 invoke 方法会拦截对 Mapper 接口方法的调用,并根据方法的署名和设置文件中的映射信息来实行相应的 SQL 语句。

[*] 实行 SQL 语句:

[*]MapperProxy 从 MyBatis 的设置中获取 SQL 语句,并通过 SqlSession 实行这些语句。
[*]SQL 实行的结果会被转换为方法的返回值范例,然后返回给调用者。

[*] 结果映射:

[*]MyBatis 会根据设置中的映射规则,将 SQL 实行结果映射为 Java 对象。这通常涉及将结果集的列映射到 Java 对象的属性上。

示例

假设有一个简单的 Mapper 接口:
public interface UserMapper {
    User selectUserById(int id);
}
在 MyBatis 中使用时,实行过程如下:


[*]当调用 UserMapper userMapper = sqlSession.getMapper(UserMapper.class) 时,MyBatis 会创建一个实现 UserMapper 接口的署理对象。
[*]当调用 userMapper.selectUserById(1) 时,MapperProxy 的 invoke 方法会被触发。
[*]MapperProxy 会查找与 selectUserById 方法对应的 SQL 语句,并通过 SqlSession 实行该语句。
[*]实行结果会被映射为 User 对象,并返回给调用者。
优势



[*]无需手动实现接口:开发者只需定义接口和映射设置,无需编写实现类。
[*]机动性:可以通过设置文件轻松更改 SQL 语句,而不需要修改 Java 代码。
[*]简化代码:淘汰了重复的 JDBC 代码,进步了开发服从。
通过 JDK 动态署理,MyBatis 能够在运行时为 Mapper 接口提供强大的动态 SQL 实行功能,同时保持代码的简洁和可维护性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 计划模式-署理模式