欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mybatis怎么与spring衔接

程序员文章站 2022-03-08 15:37:34
...
interface Tdao{

    @Select({"select * from t","select * from b"})
    public void select();
}

class mybatis{

    public void getMapper(){

//        SqlSessionFactory factory = null;
//        SqlSession sqlSession = factory.openSession();

        Tdao tdao = (Tdao) SqlSession2.getMapper(Tdao.class);
        tdao.select();
    }


}

class SqlSession2{//动态代理就是创建一个新对象,

    public static Object getMapper(Class clazz1){
        //ClassLoader loader,  类加载器需要将接口类加载到jvm内存,这样才能生成实现clazz接口内方法的新对象
//        Class<?>[] interfaces, java对象可以实现多个接口,所以新对象可以实现多个接口,故给了数组
//        InvocationHandler h  动态代理必须实现它,为的是同一方法名,
//              这样mapper接口中diy的op数据库的方法才能被动态代理
//          通过唯一的方法名invoke来实现执行sql的所需要的一系列操作
        Proxy.newProxyInstance(SqlSession2.class.getClassLoader(),new Class[]{clazz1},new myInvokerHandler());
        return null;
        //mybatis是如何实现执行sql语句的呢?
//
    }
}

class myInvokerHandler implements InvocationHandler{

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//        invoke的方法全部重写到clazz1接口中声明的所有方法中去
        return null;
    }
}

//FactoryBean就是用来说明这个myFactoryBean是将要交给Spring管理的一个外部java类
@MapperScan
class myFactoryBean implements FactoryBean{

    Class mapeprInterfaces;
    @Override
    public Object getObject() throws Exception {
        return SqlSession2.getMapper(mapeprInterfaces);
    }

    @Override
    public Class<?> getObjectType() {
        return mapeprInterfaces.getClass();
    }
}

class willRegistryClassNoAnnotation{

}

class myBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        //一个Bean注册成为beanDefinition
        BeanDefinitionBuilder beanDefinitionBuilder =
                BeanDefinitionBuilder.genericBeanDefinition(willRegistryClassNoAnnotation.class);
        AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
        MutablePropertyValues propertyValues = beanDefinition.getPropertyValues();
        //通过包名扫描类importingClassMetadata注解就是@MapperScan("com.xxx.xxx")
        for (){
            propertyValues.add("FactoryBean中声明的接收类的属性名","com.xxx的类名");
            //这里就在注册
            registry.registerBeanDefinition(beanDefinitionBuilder.toString(),beanDefinitionBuilder.getBeanDefinition());
        }
    }
}

@Import(myBeanDefinitionRegistrar.class)
class cataLogrun{
    public static void main(String[] args) {

    }
}