官网上写着

但是,这个其实是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代码.

 /**
* 删除
* @author liuyangos8888
*/
public class DeleteAll extends AbstractMethod { @Override
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
String sql;
MySqlMethod mySqlMethod = MySqlMethod.DELETE_ALL;
if (tableInfo.isLogicDelete()) {
sql = String.format(mySqlMethod.getSql(), tableInfo.getTableName(), tableInfo,
sqlWhereEntityWrapper(tableInfo));
} else {
mySqlMethod = MySqlMethod.DELETE_ALL;
sql = String.format(mySqlMethod.getSql(), tableInfo.getTableName(),
sqlWhereEntityWrapper(tableInfo));
}
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
return addUpdateMappedStatement(mapperClass, modelClass, mySqlMethod.getMethod(), sqlSource);
}
}
LogicDelete源码
 /**
* <p>
* 根据 queryWrapper 删除
* </p>
*
* @author hubin
* @since 2018-06-13
*/
public class LogicDelete extends AbstractLogicMethod { @Override
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
String sql;
SqlMethod sqlMethod = SqlMethod.LOGIC_DELETE;
if (tableInfo.isLogicDelete()) {
sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), sqlLogicSet(tableInfo),
sqlWhereEntityWrapper(tableInfo));
} else {
sqlMethod = SqlMethod.DELETE;
sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(),
sqlWhereEntityWrapper(tableInfo));
}
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
return addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
}
}

MySqlMethod代码

 package com.baidu.www.injector;

 /**
* 自定义全局删除方法
*/ public enum MySqlMethod { /**
* 删除全部
*/
DELETE_ALL("deleteAll", "根据 entity 条件删除记录", "<script>\nDELETE FROM %s %s\n</script>"); private final String method;
private final String desc;
private final String sql; MySqlMethod(String method, String desc, String sql) {
this.method = method;
this.desc = desc;
this.sql = sql;
} public String getMethod() {
return method;
} public String getDesc() {
return desc;
} public String getSql() {
return sql;
} }
SqlMethod源码
 package com.baidu.www.injector;

 /**
* 自定义全局删除方法
*/ public enum MySqlMethod { /**
* 删除全部
*/
DELETE_ALL("deleteAll", "根据 entity 条件删除记录", "<script>\nDELETE FROM %s %s\n</script>"); private final String method;
private final String desc;
private final String sql; MySqlMethod(String method, String desc, String sql) {
this.method = method;
this.desc = desc;
this.sql = sql;
} public String getMethod() {
return method;
} public String getDesc() {
return desc;
} public String getSql() {
return sql;
} }
MyInjector代码
 package com.baidu.www.injector;

 import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.AbstractSqlInjector; import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream; /**
* 自定义全局操作
*
* @author liuyangos8888
*/
public class MyInjector extends AbstractSqlInjector { @Override
public List<AbstractMethod> getMethodList() {
return Stream.of(
new DeleteAll()
).collect(Collectors.toList());
} }
LogicSqlInjector源码
 /**
* <p>
* SQL 逻辑删除注入器
* </p>
*
* @author hubin
* @since 2018-06-12
*/
public class LogicSqlInjector extends AbstractSqlInjector { @Override
public List<AbstractMethod> getMethodList() {
return Stream.of(
new Insert(),
new LogicDelete(),
new LogicDeleteByMap(),
new LogicDeleteById(),
new LogicDeleteBatchByIds(),
new LogicUpdate(),
new LogicUpdateById(),
new LogicSelectById(),
new LogicSelectBatchByIds(),
new LogicSelectByMap(),
new LogicSelectOne(),
new LogicSelectCount(),
new LogicSelectMaps(),
new LogicSelectMapsPage(),
new LogicSelectObjs(),
new LogicSelectList(),
new LogicSelectPage()
).collect(Collectors.toList());
}

最后修改其配置文件,加入到框架中,

 <!--定义mybatisplus全局配置-->
<bean id="globalConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig"> <property name="dbConfig">
<bean class="com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig">
<!-- 全局的主键策略 -->
<property name="idType" value="AUTO"/>
<!-- 全局的表前缀策略配置 -->
<property name="tablePrefix" value="tbl_"/> <!--逻辑删除全局配值-->
<property name="logicDeleteValue" value="0"/>
<property name="logicNotDeleteValue" value="1"/> </bean>
</property> <!--&lt;!&ndash;注入自定义全局操作&ndash;&gt;-->
<property name="sqlInjector" ref="mySqlInjector"/> <!--<property name="sqlInjector" ref="logicSqlInjector"/>--> </bean> <!--自定义注入器--> <bean id="mySqlInjector" class="com.baidu.www.injector.MyInjector"/>

全部

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring
http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<!-- 数据源 -->
<context:property-placeholder location="classpath:db.properties"/> <bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean> <!-- 事务管理器 -->
<bean id="dataSourceTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean> <!-- 基于注解的事务管理 -->
<tx:annotation-driven
transaction-manager="dataSourceTransactionManager"/> <!--&lt;!&ndash;修改为MybatisPlus配置&ndash;&gt;-->
<bean id="sqlSessionFactoryBean" class=" com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean "> <!-- 数据源 -->
<property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:mybatis-config.xml"/> <!-- 别名处理 -->
<property name="typeAliasesPackage" value="com.baidu.www.bean"/> <!--注入全局MP策略配置-->
<property name="globalConfig" ref="globalConfig"/> <!--插件配置--> <property name="plugins">
<list> <!--注册分页插件-->
<bean class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"/> <!--注册执行分析插件,生产环境不建议使用-->
<!--<bean class="com.baomidou.mybatisplus.extension.plugins.SqlExplainInterceptor"/>-->
<!--&lt;!&ndash;<property name="properties" ref="">&ndash;&gt;--> <!--&lt;!&ndash;</property>&ndash;&gt;-->
<!--</bean>--> <!-- SQL 执行性能分析,开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长 -->
<bean class="com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor">
<property name="maxTime" value="100"/>
<!--SQL是否格式化 默认false-->
<property name="format" value="true"/>
</bean> <!--乐观锁插件-->
<bean class="com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor"/> </list>
</property> </bean> <!--定义mybatisplus全局配置-->
<bean id="globalConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig"> <property name="dbConfig">
<bean class="com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig">
<!-- 全局的主键策略 -->
<property name="idType" value="AUTO"/>
<!-- 全局的表前缀策略配置 -->
<property name="tablePrefix" value="tbl_"/> <!--逻辑删除全局配值-->
<property name="logicDeleteValue" value="0"/>
<property name="logicNotDeleteValue" value="1"/> </bean>
</property> <!--&lt;!&ndash;注入自定义全局操作&ndash;&gt;-->
<property name="sqlInjector" ref="mySqlInjector"/> <!--<property name="sqlInjector" ref="logicSqlInjector"/>--> </bean> <!--自定义注入器--> <bean id="mySqlInjector" class="com.baidu.www.injector.MyInjector"/> <!--逻辑删除-->
<!--<bean id="logicSqlInjector" class="com.baomidou.mybatisplus.extension.injector.LogicSqlInjector"/>--> <!--配置 mybatis 扫描 mapper 接口的路径 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage"
value="com.baidu.www.mapper"> </property>
</bean>
</beans>

添加到mapper.

 package com.baidu.www.mapper;

 import com.baidu.www.bean.Employee;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; /**
* <p>
* Mapper 接口
* </p>
*
* @author Mr.Liu
* @since 2018-10-04
*/
public interface EmployeeMapper extends BaseMapper<Employee> { Integer deleteAll(); }

测试

 public class TestGenerator {

     private ApplicationContext iocContext = new ClassPathXmlApplicationContext("applicationContext.xml");

     EmployeeMapper employeeMapper = iocContext.getBean("employeeMapper", EmployeeMapper.class);

     private Logger logger = LoggerFactory.getLogger(TestGenerator.class);

     Gson gson = new Gson();

     /**
* 测试分页插件
*
* @throws SQLException
*/
@Test
public void testInterceptor() throws SQLException { Integer result = employeeMapper.deleteAll(); if (result > 0) { logger.info("删除成功:" + result); } }
}

找了很多资料都没有3.0.3的答案,我就自己看源码,看到懂了,就改了这个,希望对你有帮助,源码如下:

https://github.com/liushaoye/mplus005

 

MyBatis-Plus 3.0.3 Sql注入器添加,即全局配置Sql注入器,sqlInjector改写的更多相关文章

  1. mappers:将sql映射注册到全局配置中

    <!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 --> <!-- 6.mappers: ...

  2. 4、mybatis动态sql+struts2(通配符+全局配置+分页)

    1.创建userinfo.sql数据库脚本 create table USERINFO ( id NUMBER not null, uname ), password ), age NUMBER ) ...

  3. SQL语句添加删除修改字段[sql server 2000/2005]

    用SQL语句添加删除修改字段1.增加字段     alter table docdsp    add dspcodechar(200)2.删除字段     ALTER TABLE table_NAME ...

  4. sql server2008添加登录账户配置权限 && 登录时18456错误

    1.如何为SQL Server2008添加登录账户并配置权限 2.SQLSERVER2008 18456错误 http://blog.csdn.net/goodshot/article/details ...

  5. SQL Server 添加登录账户配置权限

    一.新建登录名 1. 在登录名右侧的文本框中输入新建的管理员账号名称:2. 一对单选按钮组中,选择Sql Server 身份验证,并输入登录密码:3. 勾选强制实施密码策略复选框:(密码策略一般是指加 ...

  6. mysql删除sql表添加别名及删除sql的注意事项

    本文为博主原创,未经允许不得转载: 根据平常的习惯,个人会将操作的表后面添加一个别名,无论是使用还是不使用的时候,均是为了 修改还是扩展sql的时候更加安全,方便,快捷. 今天在写删除的sql时,对表 ...

  7. Mybatis --- 创建方法、全局配置

    总体介绍:MyBatis实际上是Ibatis3.0版本以后的持久化层框架[也就是和数据库打交道的框架]!     和数据库打交道的技术有:      原生的JDBC技术--->Spring的Jd ...

  8. Sql批量添加,批量查询,批量删除,批量修改。mybatis都有对应标签

    Sql批量添加,批量查询,批量删除,批量修改.mybatis都有对应标签

  9. Java Persistence with MyBatis 3(中文版) 第三章 使用XML配置SQL映射器

    关系型数据库和SQL是经受时间考验和验证的数据存储机制.和其他的ORM 框架如Hibernate不同,MyBatis鼓励开发者可以直接使用数据库,而不是将其对开发者隐藏,因为这样可以充分发挥数据库服务 ...

随机推荐

  1. 前端页面JS和CSS以及图片加载nginx报错:net::ERR_CONTENT_LENGTH_MISMATCH的解决与检查

    首先检查nginx权限 具体可参考地址https://www.cnblogs.com/hooly/p/9951748.html 或者百度其他方法 还有种情况,之前是可以用的,突然出现这种加载报错的情况 ...

  2. Res-Family: From ResNet to SE-ResNeXt

    Res-Family: From ResNet to SE-ResNeXt 姚伟峰 http://www.cnblogs.com/Matrix_Yao/ Res-Family: From ResNet ...

  3. C# 小算法1

    //判断 第一条的 ‘叶子2’ 在 第二条 数据中的 索引 //任河特大桥,右幅,叶子2,桩基混凝土, //任河特大桥,,,,,右幅,,,叶子2,桥墩, string str1 = "任河特 ...

  4. Django 缓存

    官方文档 缓存的出现就是为了减轻对数据库的压力和加快内存访问的速度.我们的访问请求最终都是返回一个大的字符串,缓存就是将这段字符串直接存储起来,下次你来了,不用经过view去数据库或者内存拿到数据再渲 ...

  5. Collections与Collection

    Collection是集合体系的最顶层,包含了集合体系的共性 Collections是一个工具类,方法都是用用Collection Collections方法: //static int binary ...

  6. pyautogui 文档(四):消息框功能

    消息框功能 PyAutoGUI利用PyMsgBox中的消息框函数提供跨平台的纯Python方式来显示JavaScript样式的消息框.提供了四个消息框功能: alert()函数 >>> ...

  7. yum与rpm常用命令

    1  yum常用命令 2  rpm常用命令 1  yum常用命令 (1)列出所有可更新的软件清单命令:yum check-update (2)更新所有软件命令:yum update (4)仅安装指定的 ...

  8. java使用ffmpeg实现上传视频的转码,提取视频的截图等功能

    ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用. 1.能支持的格式 ff ...

  9. Vue.$nextTick

    `Vue.nextTick(callback)`,当数据发生变化,更新后执行回调. `Vue.$nextTick(callback)`,当dom发生变化,更新后执行的回调

  10. element-ui

    配合vue的前端样式组建   element-ui 1,基础布局 <el-row> <el-col :span="8"></el-col> &l ...