mybatisplus做SQL拦截添加自定义排序

文章介绍了如何在Mybatis项目中通过定义拦截器,处理前端传入的排序规则,确保排序优先级,同时保持SQL执行的安全性。作者提到该解决方案不依赖于字符串拼接,而是利用PreparedStatement进行防SQL注入的执行。

前言

工作中写的一段代码,备个份,以后兴许能直接用

功能描述:如果前端传入了排序规则,则优先按传入的字段进行排序,SQL原有的排序规则追加到末尾

注:我们项目里的分页查询,是基于XML的SQL执行的,没有直接使用mybatis-plus的 IPage

正文

定义拦截器

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.text.StrPool;
import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
import com.baomidou.mybatisplus.extension.parser.JsqlParserSupport;
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.select.FromItem;
import net.sf.jsqlparser.statement.select.OrderByElement;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import org.apache.ibatis.binding.MapperMethod;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.jetbrains.annotations.Nullable;
import org.springframework.util.ObjectUtils;

import java
MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只增强不改变,为简化开发、提高效率而生。使用 MyBatis-Plus 可以很容易地实现一些通用功能,比如拦截器(Interceptor)就是其中的一个功能模块。通过自定义拦截器,可以对 MyBatis 的操作进行拦截处理,比如我们可以拦截 SQL 语句并根据排序字段进行排序自定义一个 MyBatis-Plus 拦截器来根据排序字段排序通常涉及以下几个步骤: 1. 创建一个拦截器类,实现 `Interceptor` 接口。 2. 在该拦截器类中重写 `intercept` 方法。 3. 在 `intercept` 方法中,解析方法的参数,获取排序字段的参数值。 4. 根据获取到的排序字段参数,动态构建 SQL 语句,添加排序(ORDER BY)部分。 5. 将构建好的 SQL 语句应用到原本的 SQL 中,然后返回给 MyBatis 进行执行。 这里是一个简单的示例代码框架: ```java import com.baomidou.mybatisplus.core.MybatisParameterHandler; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.core.parser.SqlParserHelper; import com.baomidou.mybatisplus.core.toolkit.*; import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.plugin.*; import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.SystemMetaObject; import org.springframework.stereotype.Component; import java.util.Map; import java.util.Properties; @Component public class CustomInterceptor implements Interceptor, InnerInterceptor { @Override public Object intercept(Invocation invocation) throws Throwable { // 获取拦截的方法对象 StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); // 其他相关操作... // 这里省略获取排序参数和构建排序 SQL 的代码 // ... // 修改 SQL添加排序条件 String originalSql = statementHandler.getSql(); String newSql = originalSql + " ORDER BY custom_order_column ASC"; MetaObject metaObject = SystemMetaObject.forObject(statementHandler); // 修改 SQL metaObject.setValue("origSql", newSql); // 继续执行拦截链 return invocation.proceed(); } @Override public void setProperties(Properties properties) { // 获取 MyBatis 配置文件中定义的属性 } @Override public void beforeQuery(Executor executor,Invocation invocation,StatementHandler statementHandler) { // 可以在此处添加一些逻辑 } // 其他必要的方法... } ``` 请注意,上述代码只是一个基础的框架示例,具体的实现需要根据实际需求编写。在实际开发中,您还需要确保排序字段符合数据库的字段规范,避免 SQL 注入风险,并且考虑到性能优化等问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值