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 {
        @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和方法_第1张图片
数据已删除说明注入成功

MybatisPlus--SQL注入器进行自定义注入sql和方法_第2张图片

@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
然后
就可以

@Autowired
MyLogMapper myLogMapper;

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

你可能感兴趣的:(#)