什么是自定义全局操作
根据MybatisPlus的AutoSqlInjector可以自定义各种你想要的sql注入到全局中。相当于
定义MyBatisPlus自动注入的方法。
之前需要在xml中进行配置的sql语句,现在通过扩展AutoSqlInjector在加载mybatis环境时就注入。
实现
1.在Mapper接口中定义相关的方法
package com.badao.mapper;
import com.badao.beans.Employee;
import com.baomidou.mybatisplus.mapper.BaseMapper;
/***
* 泛型指定就是当前mapper接口所操作的实体类类型
* @author Administrator
* @Description:
* @Time:2019年4月18日 下午8:36:59
*/
public interface EmployeeMapper extends BaseMapper<Employee> {
/**
* 自定义注入方法
*/
int deleteAll();
}
2.扩展AutoSqlInjector的inject方法
项目下新建injector包,包下新建MySqlInjector
代码:
package com.badao.injector;
import org.apache.ibatis.builder.MapperBuilderAssistant;
import org.apache.ibatis.mapping.SqlSource;
import org.apache.ibatis.session.Configuration;
import com.baomidou.mybatisplus.entity.TableInfo;
import com.baomidou.mybatisplus.mapper.AutoSqlInjector;
/***
* 自定义全局操作
* @author Administrator
* @Description:
* @Time:2019年4月27日 下午12:18:42
*/
public class MySqlInjector extends AutoSqlInjector {
/***
* 扩展inject方法,完成自定义全局操作
*/
@Override
public void inject(Configuration configuration, MapperBuilderAssistant builderAssistant, Class<?> mapperClass,
Class<?> modelClass, TableInfo table) {
// 将EmployeeMapper中定义的deleteAll,处理成对应的MappedStatement对象,加入到configuration对象中
/* 执行 SQL ,动态 SQL 参考类 SqlMethod */
String sql = "delete from " + table.getTableName();
/* mapper 接口方法名一致 */
String method = "deleteAll";
//构建SqlSource对象
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
//构造一个删除的MapperedStastement
this.addDeleteMappedStatement(mapperClass, method, sqlSource);
}
}
3.在MP的全局策略配置中,配置自定义注入器
定义自定义注入器
打开项目的applicationContext.xml
<!-- 定义自定义注入器 -->
<bean id="mySqlInjector" class="com.badao.injector.MySqlInjector"></bean>
注入自定义全局操作
找到MP的全局策略配置的地方。
<!-- 定义MybatisPlus的全局策略配置-->
<bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!-- 在2.3版本以后,dbColumnUnderline 默认值就是true 开启下划线到驼峰命名支持-->
<property name="dbColumnUnderline" value="true"></property>
<!-- 全局的主键策略 全局使用主键自增的方式 value为 0-->
<property name="idType" value="0"></property>
<!-- 全局的表前缀策略配置 -->
<!-- <property name="tablePrefix" value="tbl_"></property> -->
<!-- 注入自定义全局操作 -->
<property name="sqlInjector" ref="mySqlInjector"></property>
</bean>
4.进行测试
编写测试方法
/***
* 自定义全局配置
*/
@Test
public void testdeleteAll() {
int result = employeeMapper.deleteAll();
System.out.println("一共删除了"+result);
}
进行测试 前要注意是否注册性能分析插件,如果使用了则不能删除全表。
MyBatisPlus插件扩展_SqlExplainInterceptor执行分析插件的使用:
运行测试