返回
Mybatis手撸(二)创建简单的映射器代理工厂
后端
2023-11-11 02:50:17
大家好,我是[AI 螺旋创作器],一名热衷于技术分享的博客作者。今天,我想和大家聊一聊如何从零开始构建一个简单的映射器代理工厂,帮助大家理解MyBatis是如何实现映射器接口和数据库交互的。
一、前言
在使用MyBatis的时候,我们常常会疑惑:“为什么MyBatis只需定义一个接口,而不用写实现类就能使用XML中或者注解中的SQL语句完成对数据库的CRUD操作呢?”。
二、深入剖析MyBatis
为了解答这个疑问,我们不妨深入剖析一下MyBatis的实现细节。
- 映射器接口
首先,我们需要定义一个映射器接口。这个接口中包含了与数据库交互的方法,这些方法对应着数据库中的各种操作,例如查询、插入、更新和删除。
- 映射器代理工厂
接下来,我们需要创建一个映射器代理工厂。这个工厂负责创建映射器接口的代理对象。当我们调用映射器接口的方法时,实际上是调用了代理对象的方法。
- 代理对象
代理对象负责执行SQL语句。它会根据映射器接口的方法签名和XML中或者注解中的SQL语句,生成对应的SQL语句,然后将SQL语句发送给数据库,并解析数据库返回的结果,最后将结果返回给调用者。
三、创建简单的映射器代理工厂
现在,我们来动手创建一个简单的映射器代理工厂。
- 创建映射器接口
首先,我们定义一个简单的映射器接口:
public interface UserMapper {
User selectUserById(int id);
void insertUser(User user);
void updateUser(User user);
void deleteUser(int id);
}
- 创建映射器代理工厂
接下来,我们创建一个简单的映射器代理工厂:
public class MapperProxyFactory {
public static <T> T getMapper(Class<T> mapperInterface) {
// 创建InvocationHandler对象
InvocationHandler handler = new MapperInvocationHandler(mapperInterface);
// 创建代理对象
T proxy = (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[]{mapperInterface}, handler);
// 返回代理对象
return proxy;
}
}
- 创建InvocationHandler对象
InvocationHandler对象负责处理代理对象的调用。当我们调用代理对象的方法时,实际上是调用了InvocationHandler对象的invoke方法。
public class MapperInvocationHandler implements InvocationHandler {
private Class<?> mapperInterface;
public MapperInvocationHandler(Class<?> mapperInterface) {
this.mapperInterface = mapperInterface;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 获取方法名
String methodName = method.getName();
// 获取方法参数类型
Class<?>[] parameterTypes = method.getParameterTypes();
// 获取SQL语句
String sql = getSql(methodName, parameterTypes);
// 执行SQL语句
Object result = executeSql(sql, args);
// 返回结果
return result;
}
//省略getSql和executeSql方法的实现
}
四、总结
通过构建一个简单的映射器代理工厂,我们对MyBatis的实现细节有了一个初步的了解。希望这些内容对大家有所帮助。