我们在使用Mybatis时,只需要写Mapper和Dao接口就行,使用的时候只需要调用Dao中的方法就能完成数据的增删改查。那么Dao中的方法是谁实现的呢?难道Mybatis自动帮我们写了一个Dao的实现类吗?非也!而是使用了映射器代理工厂来实现的。
映射器代理工厂(Mapper Proxy Factory)在Mybatis框架中扮演着至关重要的角色。它是用来创建映射器接口的代理对象的工厂类,通过这个工厂类,可以实现对数据库操作的抽象和简化。映射器代理工厂在Mybatis中的作用是:根据映射器接口(Mapper Interface),动态生成该接口的代理对象。这个代理对象实现了接口中定义的所有方法,并且在方法被调用时,会执行相应的数据库操作。通过这种方式,Mybatis实现了接口与数据库操作之间的解耦,使得开发者只需要定义接口,而无需编写具体的实现类。
MapperProxy
public class MapperProxy<T> implements InvocationHandler {
private final Class<T> mapperInterface;
public MapperProxy(Class<T> mapperInterface) {
this.mapperInterface = mapperInterface;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if("getUserNameById".equals(method.getName())){
System.out.println("查询Id为"+args[0]+"的用户名...");
return "周杰伦"; // 模拟从执行SQL从数据库中查询数据
}
if("deleteUserById".equals(method.getName())){
System.out.println("删除Id为"+args[0]+"的用户...");
System.out.println("成功删除User");
}
return null;
}
}
MapperProxyFactory
public class MapperProxyFactory<T> {
private final Class<T> mapperInterface;
public MapperProxyFactory(Class<T> mapperInterface) {
this.mapperInterface = mapperInterface;
}
public T newInstance() {
final MapperProxy<T> mapperProxy = new MapperProxy<>(mapperInterface);
return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[]{mapperInterface}, mapperProxy);
}
}
IUserDao
public interface IUserDao {
String getUserNameById(String id);
void deleteUserById(String id);
}
Test
public class MainTest {
public static void main(String[] args) {
MapperProxyFactory<IUserDao> factory = new MapperProxyFactory<>(IUserDao.class);
IUserDao iUserDao = factory.newInstance();
String name = iUserDao.getUserNameById("123");
System.out.println(name);
iUserDao.deleteUserById("123");
}
}
标签:映射器,MapperProxyFactory,代理,接口,mapperInterface,Mybatis,工厂,public
From: https://blog.csdn.net/cj151525/article/details/140414918