mybatis-plus的sql注入器实现自定义全局sql操作原理解析

自定义自己的通用方法可以实现接口ISqlInjector,也可以继承抽象类 AbstractSqlInjector。注入通用方法 SQL 语句,然后继承 BaseMappe添加自定义方法,全局配置sqlInjector 注入 MP会自动将类所有方法注入到 mybatis 容器中。

比如说我想在全局添加一个逻辑删除方法,我不希望给每个Mapper添加这个方法,而是希望像BaseMapper这样,给每一个Mapper自动添加一个,怎么做呢?

这样就可以将之前需要在每个mapper xml中配置的sql语句,现在通过扩展ISqlInjector在spring启动时,加载mybatis-plus时就注入了

其流程就是在我们之前的spring启动时mybatis-plus注入sql源码解析中的GlobalConfig中默认加载的AbstractSqlInjector是DefaultSqlInjector,我们现在在applicationContext.xml中配置GlobalConfig,指定加载的SqlInjector为我们自定义的MySqlInjector



    

    
......









    

配置参考文档:

https://mp.baomidou.com/config/

mybatis-plus的sql注入器实现自定义全局sql操作原理解析_第1张图片

在这个过程中,由于使用了我们的MySqlInjector

public class MySqlInjector extends DefaultSqlInjector {

    @Override

    public List getMethodList() {

        List methodList = super.getMethodList();

        // 添加自定义方法

        methodList.add(new DeleteAll());

        return methodList;

    }

}

在getMethodList的时候,就添加了我们自定义的全局sql

在后面一个一个injectMappedStatement的时候,就会到我们的DeleteAll()方法中

public class DeleteAll extends AbstractMethod {

    @Override

    public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) {

        /* 执行 SQL ,动态 SQL 参考类 SqlMethod */

        String sql = "delete from " + tableInfo.getTableName();

        /* mapper 接口方法名一致 */

        String method = "deleteAll";

        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);

        return this.addDeleteMappedStatement(mapperClass, method, sqlSource);

    }

}

后面的流程是一样的,于是就加入到了mybatis Configuration中的MappedStatements中

 

自定义全局操作里面有一个应用,就是逻辑删除

源码参考:https://gitee.com/constfafa/mybatis-plus-spring-demo

你可能感兴趣的:(mybatis,阅读源码,源码解析)