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);}