MyBatis-Plus 3.0.3 Sql注入器添加,即全局配置Sql注入器,sqlInjector改写
官网上写着
但是,这个其实是2.0系列的写法,由于引用了最新的3.0.3这个功能基本不好使.
3.0.3版本的写法
也就是中间加了一层,原来是AutoSqlInjector,现在改为AbstractSqlInjector.
源码如图:
写出自己的方法,命名为MyInjector,继承AbstractInjector.有个必须继承实现的方法getMethodList();如上图,继承后如下
然后,就是模仿写法,这里我是模仿的LogicSqlInjector,源码如图,也是继承AbstractSqlInjector,实现了getMethodList();
上图就是Logic 的写法,我们要关注大块,就是返回一个Stream.of(new DeleteAll()).collect(Collectors.toList()),Stream.of()中间加了一个对象,然后打开这个对象,就可以看到对象的写法.
结构如上图,就是继承了AbstractLogicMethod,打开一看这个方法是其自己自定义的一个方法,我们根本用不到(暂时),所以我们继承其公有父类AbstractMethod
现在结构就是很清晰了,MyInjector继承了AbstractInjector类,实现了其getMethod方法,getMethod方法返回一个Stream.of( ).collect(Collectors.toList()),Dream.of()中封装一个对象,是实际的Sql注入方法的写法.
这个写法需要继承AbstractMethod实现其injectMappedStatement方法,所以也不用记什么,滤清逻辑改写就可以了.结构
创建DeleteAll类,继承AbstractMethod,实现其方法,将Logic的injectMappedStatement中的内容复制下来,改写成自己的,在Logic中的SqlMethod是个枚举类型,所以建立一个MySqlMethod,查看Sqlmethod,对其源码进行复制改写.
DeleteAll代码.
1 /** 2 * 删除 3 * @author liuyangos8888 4 */ 5 public class DeleteAll extends AbstractMethod { 6 7 @Override 8 public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) { 9 String sql; 10 MySqlMethod mySqlMethod = MySqlMethod.DELETE_ALL; 11 if (tableInfo.isLogicDelete()) { 12 sql = String.format(mySqlMethod.getSql(), tableInfo.getTableName(), tableInfo, 13 sqlWhereEntityWrapper(tableInfo)); 14 } else { 15 mySqlMethod = MySqlMethod.DELETE_ALL; 16 sql = String.format(mySqlMethod.getSql(), tableInfo.getTableName(), 17 sqlWhereEntityWrapper(tableInfo)); 18 } 19 SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); 20 return addUpdateMappedStatement(mapperClass, modelClass, mySqlMethod.getMethod(), sqlSource); 21 } 22 }
LogicDelete源码
1 /** 2 * <p> 3 * 根据 queryWrapper 删除 4 * </p> 5 * 6 * @author hubin 7 * @since 2018-06-13 8 */ 9 public class LogicDelete extends AbstractLogicMethod { 10 11 @Override 12 public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) { 13 String sql; 14 SqlMethod sqlMethod = SqlMethod.LOGIC_DELETE; 15 if (tableInfo.isLogicDelete()) { 16 sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), sqlLogicSet(tableInfo), 17 sqlWhereEntityWrapper(tableInfo)); 18 } else { 19 sqlMethod = SqlMethod.DELETE; 20 sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), 21 sqlWhereEntityWrapper(tableInfo)); 22 } 23 SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); 24 return addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource); 25 } 26 }