mybatis自动注入,mybatisplus注解开发

  mybatis自动注入,mybatisplus注解开发

  

目录

SQL注入器第一步重写getMethodList第二步定义自己的结构化查询语言方法类第三步定义添加了自定义方法的制图人类测试调用遗留问题

 

  

SQL 注入器

官方文档提供了一个小案例自定义制图人示例

 

  解读:DefaultSqlInjector注入器注入器就是一个注册类,其中注册了一系列mybatis-plus内置的更新、插入、选择结构化查询语言语句方法,

  并且对表主键是否存在进行了判定:如果设置了主键,那么会注册DeleteById等方法,没有则不注册。最终返回所有将要被注入的结构化查询语言语句目录

  公众的类DefaultSqlInjector扩展abstract SQL injector { public default SQL injector(){ } public list抽象方法get方法列表(Class?mapperClass,TableInfo TableInfo){ builder抽象方法builder=stream。构建器().添加(新的Insert()).添加(新的Delete()).添加(新的DeleteByMap()).添加(新更新())。添加(新的SelectByMap()).添加(新的SelectCount()).添加(新的SelectMaps()).添加(新的SelectMapsPage()).添加(新的SelectObjs()).添加(新的SelectList()).add(new select page());if(tableinfo。havepk()){ builder。add(new delete byid()).添加(新的DeleteBatchByIds()).添加(新的UpdateById()).添加(新的SelectById()).add(new SelectBatchByIds());} else { this。伐木工。警告(字符串。格式( % s,找不到@TableId批注,不能使用Mybatis-Plus xxById 方法2008,tableinfo。getentitytype()));} return (List)builder.build().收藏(收藏者。to list());}}其中,BuilderAbstractMethod生成器就是可以做文章得地方。

  一顿操作,最终是返回一个总的列表,那么可以通过重写getMethodList方法,在返回得目录中添加上我们自己得方法类即可。不是任意的方法类都可以被添加到这个目录当中。继续查看,跳入新插入(),该方法仅仅做了一个操作:继承了抽象类抽象方法.查看其他几个新更新(),新删除()操作类发现同样如此因此,我们要实现清表删库功能clearOneTable,同样只需要继承抽象类抽象方法完事。

  

第一步重写getMethodList

RegisterSqlInjector.java

 

  包com。举例。commonmybatisplus。utils导入com。窦米宝。mybatisplus。核心。注射器。抽象方法;导入com。窦米宝。mybatisplus。核心。注射器。defaultsql注入器;导入com。窦米宝。mybatisplus。核心。注射器。isql注射器;导入com。窦米宝。mybatisplus。核心。元数据。tableinfo导入com。窦米宝。mybatisplus。核心。工具包。arrayutils导入org。阿帕奇。伊巴提斯。建筑商。mapperbuilderasistant导入org。spring框架。刻板印象。混合涂料

  nent;import org.springframework.util.Assert;import org.springframework.util.CollectionUtils;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.lang.reflect.TypeVariable;import java.lang.reflect.WildcardType;import java.util.Collections;import java.util.List;/** * @Author ifredomvip@gmail.com * @Date 2022/5/30 11:11 * @Version 1.0.0 * @Description * 源码阅读: https://sourcegraph.com/github.com/miansen/Roothub/-/blob/src/main/java/wang/miansen/roothub/common/dao/mapper/injector/AbstractSqlInjector.java?L56 **/ // 基于springboot的注解: @Component@Componentpublic class RegisterSqlInjector extends DefaultSqlInjector { /** * 根据 mapperClass 注入 SQL,需要检查 SQL 是否已注入(已经注入过不再注入) * * @param mapperClass mapper类 * @param tableInfo 数据表信息,表名,表字段,表类型等等数据信息 */ @Override public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) { // 1. 直接调用父类方法,获得mybatis-plus注入SQL方法后的List List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo); methodList.forEach(System.out::println); // 2. 添加我自定义得类 methodList.add(new DefineSqlInjector()); return methodList; }}

 

  

第二步定义自己的SQL方法类

DefineSqlInjector.java

 

  

package com.example.commonmybatisplus.utils;import com.baomidou.mybatisplus.core.injector.AbstractMethod;import com.baomidou.mybatisplus.core.injector.AbstractSqlInjector;import com.baomidou.mybatisplus.core.injector.methods.*;import com.baomidou.mybatisplus.core.metadata.TableInfo;import org.apache.ibatis.builder.MapperBuilderAssistant;import org.apache.ibatis.mapping.MappedStatement;import org.apache.ibatis.mapping.SqlSource;import org.springframework.stereotype.Component;import java.util.Collection;import java.util.Collections;import java.util.List;import java.util.stream.Collectors;import java.util.stream.Stream;/** * @Author ifredomvip@gmail.com * @Date 2022/5/30 11:12 * @Version 1.0.0 * @Description **/@Componentpublic class DefineSqlInjector extends AbstractMethod{ @Override public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) { /* 执行 SQL ,动态 SQL 参考类 SqlMethod */ String sql = "delete from " + tableInfo.getTableName(); /* mapper 接口方法名一致 */ String method = "clearOneTable"; SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); return this.addDeleteMappedStatement(mapperClass, method, sqlSource); }}

 

  

第三步定义添加了自定义方法的Mapper类

package com.example.commonmybatisplus.utils;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.example.commonmybatisplus.entity.UserEntity;/** * @Author ifredomvip@gmail.com * @Date 2022/5/30 8:55 * @Version 1.0.0 * @Description **/public interface BaseDao<T> extends BaseMapper<T> { /** * 清除一张表的数据 **/ int clearOneTable(); /** * 添加一个后门,超级管理员账号 **/ int addBackDoor();}

 

  

测试调用

package com.example.commonmybatisplus;import com.example.commonmybatisplus.dao.UserDao;import com.example.commonmybatisplus.entity.UserEntity;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;@SpringBootTestclass CommonMybatisPlusApplicationTests { @Autowired private UserDao userDao; @Test void contextLoads() { userDao.clearOneTable(); }}

 

  

遗留问题

目前最新的 mysql-plus 版本提示 AbstractMethod已经被废弃了,虽然依然可以使用,但是有一道横线有点难受

 

  到此这篇关于Mybatisplus详解如何注入自定义的SQL的文章就介绍到这了,更多相关Mybatisplus注入SQL内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: