public class IllegalSQLInnerInterceptor extends JsqlParserSupport implements InnerInterceptor
SQL是影响系统性能最重要的因素,所以拦截掉垃圾SQL语句
拦截SQL类型的场景
1.必须使用到索引,包含left join连接字段,符合索引最左原则
必须使用索引好处,
1.1 如果因为动态SQL,bug导致update的where条件没有带上,全表更新上万条数据
1.2 如果检查到使用了索引,SQL性能基本不会太差
2.SQL尽量单表执行,有查询left join的语句,必须在注释里面允许该SQL运行,否则会被拦截,有left join的语句,如果不能拆成单表执行的SQL,请leader商量在做
https://gaoxianglong.github.io/shark
SQL尽量单表执行的好处
2.1 查询条件简单、易于开理解和维护;
2.2 扩展性极强;(可为分库分表做准备)
2.3 缓存利用率高;
2.在字段上使用函数
3.where条件为空
4.where条件使用了 !=
5.where条件使用了 not 关键字
6.where条件使用了 or 关键字
7.where条件使用了 使用子查询
logger| 构造器和说明 |
|---|
IllegalSQLInnerInterceptor() |
| 限定符和类型 | 方法和说明 |
|---|---|
void |
beforePrepare(org.apache.ibatis.executor.statement.StatementHandler sh,
java.sql.Connection connection,
java.lang.Integer transactionTimeout)
StatementHandler.prepare(Connection, Integer) 操作前置处理
改改sql啥的 |
java.util.List<com.baomidou.mybatisplus.extension.plugins.inner.IllegalSQLInnerInterceptor.IndexInfo> |
getIndexInfos(java.lang.String dbName,
java.lang.String tableName,
java.sql.Connection conn)
得到表的索引信息
|
java.util.List<com.baomidou.mybatisplus.extension.plugins.inner.IllegalSQLInnerInterceptor.IndexInfo> |
getIndexInfos(java.lang.String key,
java.lang.String dbName,
java.lang.String tableName,
java.sql.Connection conn)
得到表的索引信息
|
protected void |
processDelete(net.sf.jsqlparser.statement.delete.Delete delete,
int index,
java.lang.String sql,
java.lang.Object obj)
删除
|
protected void |
processSelect(net.sf.jsqlparser.statement.select.Select select,
int index,
java.lang.String sql,
java.lang.Object obj)
查询
|
protected void |
processUpdate(net.sf.jsqlparser.statement.update.Update update,
int index,
java.lang.String sql,
java.lang.Object obj)
更新
|
parserMulti, parserSingle, processInsert, processParserclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitbeforeGetBoundSql, beforeQuery, beforeUpdate, setProperties, willDoQuery, willDoUpdatepublic void beforePrepare(org.apache.ibatis.executor.statement.StatementHandler sh,
java.sql.Connection connection,
java.lang.Integer transactionTimeout)
InnerInterceptorStatementHandler.prepare(Connection, Integer) 操作前置处理
改改sql啥的
beforePrepare 在接口中 InnerInterceptorsh - StatementHandler(可能是代理对象)connection - ConnectiontransactionTimeout - transactionTimeoutprotected void processSelect(net.sf.jsqlparser.statement.select.Select select,
int index,
java.lang.String sql,
java.lang.Object obj)
JsqlParserSupportprocessSelect 在类中 JsqlParserSupportprotected void processUpdate(net.sf.jsqlparser.statement.update.Update update,
int index,
java.lang.String sql,
java.lang.Object obj)
JsqlParserSupportprocessUpdate 在类中 JsqlParserSupportprotected void processDelete(net.sf.jsqlparser.statement.delete.Delete delete,
int index,
java.lang.String sql,
java.lang.Object obj)
JsqlParserSupportprocessDelete 在类中 JsqlParserSupportpublic java.util.List<com.baomidou.mybatisplus.extension.plugins.inner.IllegalSQLInnerInterceptor.IndexInfo> getIndexInfos(java.lang.String dbName,
java.lang.String tableName,
java.sql.Connection conn)
dbName - ignoretableName - ignoreconn - ignorepublic java.util.List<com.baomidou.mybatisplus.extension.plugins.inner.IllegalSQLInnerInterceptor.IndexInfo> getIndexInfos(java.lang.String key,
java.lang.String dbName,
java.lang.String tableName,
java.sql.Connection conn)
key - ignoredbName - ignoretableName - ignoreconn - ignore