​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 {
@Override
public 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.springframework.stereotype.Component;

import java.util.List;

@Component
public class MyDefinedSqlInjector extends DefaultSqlInjector {

@Override
public 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
@Mapper
public interface UserMapper extends BaseMapper<User> {
int deleteAll();
}

测试代码

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

@Autowired
UserMapper userMapper;

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

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

数据已删除说明注入成功

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

与​​@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
@Mapper
public 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>​

然后

就可以

@Autowired
MyLogMapper myLogMapper;

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