Spring笔记(07) Mybatis Mapper为什么要在Spring配置文件中注册

在使用 Mybatis 时,Mapper 的配置文件一定要在全局配置文件中注册,否则Mybatis 无法完成 Mapper 接口的实现。不管是用何种方式注册,可以单独一个个

  <!-- 注册 UserRepository.xml -->
    <mappers>
        <mapper resource="com/southwind/repository/UserRepository.xml"/>
    </mappers>

也能扫描整个包的方式。

但为什么要做这样注册呢?

其实是为了jdk代理时,根据目标对象(接口),获取对应的 mapper.xml 。

比如 UserDao.java 获取对应的 UserDao.xml ,获取原理如下:

    public static String getMapperXml(String className){
        String xml = "";
        SAXReader reader = new SAXReader();
        Document document;
        try {
            document = reader.read("src/config.xml");
            Element root = document.getRootElement();
            Iterator iter = root.elementIterator();
            while(iter.hasNext()){
                Element mappersElement = (Element) iter.next();
                if("mappers".equals(mappersElement.getName())){
                    Iterator iter2 = mappersElement.elementIterator();
                    while(iter2.hasNext()){
                        Element mapperElement = (Element) iter2.next();
                        //com.southwin.dao.UserDAO . 替换 #
                        className = className.replace(".", "#");
                        //获取接口结尾名
                        String classNameEnd = className.split("#")[className.split("#").length-1];
                        String resourceName = mapperElement.attributeValue("resource");
                        //获取resource结尾名
                        String resourceName2 = resourceName.split("/")[resourceName.split("/").length-1];
                        //UserDAO.xml . 替换 #
                        resourceName2 = resourceName2.replace(".", "#");
                        String resourceNameEnd = resourceName2.split("#")[0];
                        if(classNameEnd.equals(resourceNameEnd)){
                            xml="src/"+resourceName;
                        }
                    }
                }
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return xml;
    }

因为 split 不能传「.」作为参数,所以将「.」替换成「#」

简单来说就是,循环遍历所有注册的Mapper.xml,然后将传入的接口名和 Mapper 名比较,如果一致就返回对应的 Mapper.xml 地址。

以上代码笔记内容来自付费专栏:案例上手 Spring 全家桶

PS:并没有透露关键内容,纯粹是零碎笔记。如果侵犯版权,请联系我。

 

本文由老郭种树原创,转载请注明:https://guozh.net/spring-mybatis-mapper/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注