mybatis-plus的sql注入器实现自定义全局sql操作原理解析
自定义自己的通用方法可以实现接口ISqlInjector,也可以继承抽象类 AbstractSqlInjector。注入通用方法 SQL 语句,然后继承 BaseMappe添加自定义方法,全局配置sqlInjector 注入 MP会自动将类所有方法注入到 mybatis 容器中。比如说我想在全局添加一个逻辑删除方法,我不希望给每个Mapper添加这个方法,而是希望像BaseMapper这样...
自定义自己的通用方法可以实现接口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
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="globalConfig" ref="globalConfig"/>
......
<!-- 定义自定义注入器 -->
<bean id="mySqlInjector" class="com.hfi.injector.MySqlInjector"></bean>
<bean id="globalConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
<property name="sqlInjector" ref="mySqlInjector"/>
</bean>
配置参考文档:
https://mp.baomidou.com/config/
在这个过程中,由于使用了我们的MySqlInjector
public class MySqlInjector extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList() {
List<AbstractMethod> 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中
自定义全局操作里面有一个应用,就是逻辑删除
更多推荐
所有评论(0)