mapper 创建
- 因为mybatis可以脱离spring自己使用,所以mapper的bean创建是由mybatis完成的
- 创建方式,根据不同的mapper,方法都是对应与注解或者配置文件对应名称的方法,所以我们猜测使用的是spring的动态代理创建方式
我们自己实现mapper创建工厂代理类:
public class MySessionFactoryProxy {
public static Object getMapper(Class c){
Class[] classes = new Class[]{c};
//动态代理获取mapper
Object o = Proxy.newProxyInstance(MySessionFactoryProxy.class.getClassLoader(), classes, new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//解析sql
//执行sql
Select annotation = method.getAnnotation(Select.class);
String sql = annotation.value()[0];//一个注解可能有多个sql语句
System.out.println("sql:"+sql);
return null;
}
});
return o;
}
}复制代码
那么由谁来调用这个getMapper方法呢,毫无疑问是mybatis,这个时候需要一个工厂bean,用来调用该方法,每次调用,创建一个factoryBean,传入一个mapper类,来创建该mapper(这样就可以解决代码写死的情况)
- MyMapperFactoryBean
public class MyMapperFactoryBean<T> implements FactoryBean<T> {
//实例化的时候传入
public MyMapperFactoryBean(Class<T> mapperInterface) {
this.mapperInterface = mapperInterface;
}
//使用全局变量存储不同的mapper类
private Class<T> mapperInterface;
public T getObject() throws Exception {
System.out.println("get mapper");
return (T) MySessionFactoryProxy.getMapper(mapperInterface);
}
public Class<?> getObjectType() {
return this.mapperInterface;
}
}复制代码