Mybatis-Plus SQL注入器

今天看Mybatis-plus官网发现了这个SQL注入器,感觉以后有机会用上,记录一手。

重要的话说前面:MP的官网确实不友好,但是他们将示例代码都放在了gitee上:https://gitee.com/baomidou/mybatis-plus-samples/tree/master/mybatis-plus-sample-deluxe.

里面基本都有示例代码,可拉取下来找些博客对着看

两篇不错的博客:

参考:Mybatis-Plus的应用场景及注入SQL原理分析.

参考:Mybatis-Plus入门系列(11)- MybatisPlus之Sql注入器及源码分析.

SQL注入器是什么?

官网其实等于没说,这对我们这种小白来说非常不友好。大概就是MP的官方文档槽点如此多的原因。

说回正题,从字面意思理解:把SQL注入到某个地方。

SQL注入器的作用就是:你可以在Mapper层自定义方法,然后将SQL模板注入到MP中

注意,注入器和我们自定义方法+自己写sql.xml的区别:
使用SQL注入器,通常是使用自定义Mapper(MyBaseMapper)接口继承BaseMapper接口,我们自定义的方法就写在MyBaseMapper里。然后我们业务相关的Mapper继承MyBaseMapper就都可以使用该方法。这一切只需要我们自定义一个SQL模板,注入到MP即可,而不是换一个表就得重写一个xml

如何实现SQL注入器?

  1. 写一个方法类(就是你要定义的方法要有一个对应类,mp封装的每一个方法都要定义一个对应的类),在类中写SQL模板,需继承AbstractMethod类
  2. 写一个SQL注入类,将你定义的方法注入MP
  3. 写一个用于被继承的Mapper接口(比如MyBaseMapper),该接口需继承BaseMapper接口
  4. 写一个配置类,把我们写的注入类装进Spring容器
  5. 写你的业务Mapper层,继承自定义的MyBaseMapper

环境准备

利用springboot快速初始化项目,需要用到Mysql driver、spring web

plus依赖如下:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version>
</dependency>

配置文件:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/demo_xp?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
//打印执行的sql
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

如果嫌构建项目结构繁琐,可以看看这篇plus代码生成器的使用:https://blog.csdn.net/qq_42682745/article/details/120626012

实现SQL注入器

在此说明,为了简单起见(我也不太会),我定义的方法名叫testxp(),功能是查询所有

1.写一个方法类,在类中写SQL模板,需继承AbstractMethod

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;public class Testxp extends AbstractMethod {@Overridepublic MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {/* 执行 SQL ,动态 SQL 参考类 SqlMethod */String sql = "select * from " + tableInfo.getTableName();/* mapper 接口方法名一致 */String method = "testxp";SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);// 查询方法对应addSelectMappedStatementForTablereturn addSelectMappedStatementForTable(mapperClass, method, sqlSource, tableInfo);}
}

其中SQL模板,官方示例的通过id查找是这样的:

String sql = "select * from " + tableInfo.getTableName()+ " where " + tableInfo.getKeyColumn() + "=#{" + tableInfo.getKeyProperty() + "}";

所以SQL模板大概就是这样写的。


然后,就是你的返回类型了,定义的查询方法就找select的,删除方法就返回delete的

2.写一个SQL注入类,将你定义的方法注入MP,继承DefaultSqlInjector就好了

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.extension.injector.methods.AlwaysUpdateSomeColumnById;
import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;
import com.baomidou.mybatisplus.extension.injector.methods.LogicDeleteByIdWithFill;import java.util.List;public class MySqlInjector extends DefaultSqlInjector {@Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);//增加自定义方法methodList.add(new Testxp());/*** 以下 3 个为内置选装件* 头 2 个支持字段筛选函数*/// 例: 不要指定了 update 填充的字段methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));methodList.add(new AlwaysUpdateSomeColumnById());methodList.add(new LogicDeleteByIdWithFill());return methodList;}
}

在我们的MySqlInjector类里面,我们只需要改

把第一步自定义的方法类放进去就好了,

至于下面的内置选装件,意思就是MP给你提供的”组件“类,你可以用也可以不用。看情况,这里我们就全都加上

3.写一个用于被继承的Mapper接口(比如MyBaseMapper)

public interface MyBaseMapper<T> extends BaseMapper<T> {List<Bucket> testxp();
}

需继承BaseMapper(当然测试阶段可以不继承BaseMapper,不继承意味着我们无法使用MP封装的方法),在接口中添加你自定义的方法,我这里就是testxp()

4.写一个配置类,把我们写的SQL注入类装进Spring容器

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MybatisPlusConfig {@Beanpublic MySqlInjector sqlInjector() {return new MySqlInjector();}}

5.写你的业务Mapper层,继承自定义的MyBaseMapper

@Mapper
@Repository
public interface BucketMapper extends MyBaseMapper<Bucket> {}

6.写测试类或测试接口

@SpringBootTest
class BucketApplicationTests {@Autowiredprivate BucketMapper bucketMapper;@Testvoid contextLoads() {List<Bucket> testxp = bucketMapper.testxp();for (Bucket bucket : testxp) {System.out.println(bucket);}}}

大功告成!

谈谈它的优缺点:(仅学习过程的看法)

优点:不用重复写格式相同的sql,将方法注册到MP内部可直接调用

缺点:个人觉得,对于MP而言,基本的CRUD已经内置了,我们需要动手写SQL的地方往往是多表查询、条件分页,除此之外的情况并且还要经常用的很少见,可见SQL注入器的使用范围很小,感觉地位很低啊。因为配置SQL注入器还是挺麻烦的,封装的方法如果使用不多还是别搞

Mybatis-Plus SQL注入器的使用相关推荐

  1. mybatis plus SQL注入器 及 InsertBatchSomeColumn LogicDeleteByIdWithFill AlwaysUpdateSomeColumnById装载器

    github地址https://github.com/heng1234/mybatis_plus 基于https://blog.csdn.net/qq_39313596/article/details ...

  2. Mybatis Plus 自定义SqlInjector sql注入器

    1.自定义sql注入器GeneralMybatisPlusSqlInjector package com.javasgj.springboot.mybatisplus.config;import ja ...

  3. MybatisPlus 之 Sql 注入器

    我们已经知道,在MP中,通过AbstractSqlInjector将BaseMapper中的方法注入到了Mybatis容器,这样这些方法才可以正常执行. 那么,如果我们需要扩充BaseMapper中的 ...

  4. 记一次mybatis-plus自定义sql注入器不起作用的问题

    之前自己写过一个关于mybatis-plus多表联查的组件,原理是用到了mybatis-plus扩展的口(sql注入),即继承DefaultSqlInjector /** @author chenga ...

  5. MyBatis动态SQL之 set 和 trim标记的使用示例

    2019独角兽企业重金招聘Python工程师标准>>> 和之前的where一样,set和trim也是智能标记 在之前的user.xml中添加 <update id=" ...

  6. MyBatis动态SQL(认真看看, 以后写SQL就爽多了)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:cnblogs.com/homejim/p/9909657. ...

  7. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦 ...

  8. 认真看看, 以后写 SQL 就爽多了:MyBatis 动态 SQL:

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 阿进的写字台 来源 | cnblogs.com ...

  9. MyBatis动态SQL,写SQL更爽

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客: ...

  10. 认真看看, 以后写 SQL 就爽多了:MyBatis 动态 SQL

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 整理 ...

最新文章

  1. 这么详细的Python matplotlib底层原理浅析
  2. Servlet3.0之二:异步特性
  3. 交叉路口红绿灯控制程序linux,PLC十字路口的交通灯控制编程实例!
  4. cpu百分比linux,Linux:cpu使用百分比的计算
  5. Eigen与Matlab语法及语义辞典
  6. matlab 安装jdbc.jar
  7. java只修改变的字段_java注解之运行时修改字段的注解值操作
  8. linux 网络块存储,网络存储集群
  9. 线上分享|云和恩墨大讲堂201902:MySQL基础之体系结构
  10. 对double变量进行四舍五入并保留两位小数
  11. php 小米路由器_云水日记-捣鼓小米路由器开发版本
  12. 【优化算法】鸽群优化算法(PIO)【含Matlab源码 1077期】
  13. 回顾安全多方计算-SMPC(MPC)
  14. python批量将word转换成pdf_python批量实现Word文件转换为PDF文件
  15. Excel的序列号转换的算法
  16. 计算机组成原理学习笔记第1章计算机系统概论 1.1——冯 · 诺依曼结构计算机工作原理及层次结构分析
  17. 交互设计理论之格式塔理论与四大法则
  18. Docker容器获取宿主机信息
  19. 学习笔记(2):A110测试-测试课程申请1888
  20. 块、内联、内联块都有哪些及其特点

热门文章

  1. VC中如何重命名一个文件
  2. QQ大盗 - 巧用clientkey
  3. matlab gui制作,MATLAB GUI制作教程
  4. 武汉年会签到,抽奖,摇一摇,微信上墙,互动大屏
  5. plc仿真实训软件_博途STEP7仿真软件与真实PLC的区别
  6. php取名字第一个字,php 获取姓名拼音首字母
  7. 微信android支持版本,兼容安卓4.2.2版本安装哪个版本微信!微信支持版本是什么版本吗...
  8. HDU——5053 the Sum of Cube
  9. sublime 快捷键不能使用
  10. Everything使用攻略和技巧