600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > MybatisPlus--SQL注入器进行自定义注入sql和方法

MybatisPlus--SQL注入器进行自定义注入sql和方法

时间:2020-12-31 01:02:55

相关推荐

MybatisPlus--SQL注入器进行自定义注入sql和方法

SQL注入器的官方文档

三步完成

第一步、创建一个类,主要目的将方法和sql做映射

需要自定义sql,如下定义了一个sql语句:

myDefineSql ="delete from "+tableInfo.getTableName();//构造一条delete from user,待注入的sql预编译语句

methodName:方法名,也就是用来映射方法名和执行的sql

通过继承AbstractMethod重写方法讲预编译sql和方法名进行绑定,返回MappedStatement对象

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 MyDefinedMethod extends AbstractMethod {@Overridepublic MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {String myDefineSql="delete from "+tableInfo.getTableName();//构造一条delete from 表,待注入的sql预编译语句String methodName="deleteAll";//方法名 -->这个就是在UserMapper中需要添加的方法名SqlSource sqlSource = languageDriver.createSqlSource(configuration, myDefineSql, modelClass);// 进行预编译得到sqlSource对象//添加到delete操作的Statement中也就是相当于将预编译sql和其它的delete相关的编译后的sql存在一起return addDeleteMappedStatement(mapperClass,methodName,sqlSource);}}

第二步、创建注入器,将第一步的sql与方法绑定的实例通过@Componenet注解交给Spring来管理

import com.baomidou.mybatisplus.core.injector.AbstractMethod;import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;import org.ponent;import java.util.List;@Componentpublic class MyDefinedSqlInjector extends DefaultSqlInjector {@Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass) {List<AbstractMethod> methodList = super.getMethodList(mapperClass);//将原来的保持methodList.add(new MyDefinedMethod());//将自定义的方法传入,这里用的是上面创建对象return methodList;}}

第三步、将方法注入到Mapper中

将第一步中定义方法名添加到继承了BaseMapper的UserMapper

如下:添加一个int

import com.baomidou.mybatisplus.core.mapper.BaseMapper;import org.apache.ibatis.annotations.Mapper;import org.springframework.stereotype.Repository;import top.huashengshu.demo.entity.User;@Repository@Mapperpublic interface UserMapper extends BaseMapper<User> {int deleteAll();}

测试代码

需要考虑外键约束,这里只是示例,因此我之间删除了外键,只想测试一下这样能否执行成功!

@AutowiredUserMapper userMapper;@Testpublic void deleteTest() {int rows = userMapper.deleteAll();System.out.println("影响行数:" + rows);}

数据已删除说明注入成功

@Update相比注解这种方式有什么好处呢?

好处如下:

原先我们是直接创建一个UserMapper继承BaseMapper

现在呢,我可以这样做在UserMapper和BaseMapper接口之间再加一个接口

我们可以使用自定义的MyDefinedBaseMapper继承BaseMapper

interface MyDefinedBaseMapper extends BaseMapper

interface UserMapper extends MyDefinedBaseMapper

为什么要这样做呢?下面揭晓

原先的UserMapper extends BaseMapper变成如下

import org.apache.ibatis.annotations.Mapper;import org.springframework.stereotype.Repository;import top.huashengshu.demo.dao.method.MyBaseMapper;import top.huashengshu.demo.entity.User;@Repository@Mapperpublic interface UserMapper extends MyBaseMapper<User> {}

然后呢我们可以在MyBaseMapper接口中将之前定义的deleteAll方法放在这个接口中

import com.baomidou.mybatisplus.core.mapper.BaseMapper;public abstract interface MyBaseMapper<T> extends BaseMapper<T> {int deleteAll();}

那么好处就显现出来了,对于任何想要有delete from 表的dao操作都可以改继承这个自定义的接口

然后都可以通过这个方法操作

换而言之,比如有个用来记日志的表,然后想要批量删除

就可以搞个MyLogMapper extends MyBaseMapper<MyLog>

然后

就可以

@AutowiredMyLogMapper myLogMapper;@Testpublic void deleteTest() {int rows = myLogMapper.deleteAll();System.out.println("影响行数:" + rows);}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。