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);
}
数据已删除说明注入成功
与@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);
}