1. Sql 注入器
Mybatis-Plus:SQL注入的原理,在Mybatis-Plus
中,通过AbstractSqlInjector
将BaseMapper
中的方法注入到了Mybatis
容器,这样这些方法才可以正常执行。
那么,如果我们需要扩充BaseMapper
中的方法,又该如何实现呢?下面我们以扩展findAll
方法为例进行学习。
1.1 编写MyBaseMapper
MyBaseMapper.java
package com.tian.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
public interface MyBaseMapper<T> extends BaseMapper<T> {
List<T> findAll();
// 扩展其他的方法
}
其他的Mapper
都可以继承该MyBaseMapper
,这样实现了统一的扩展。
如:
1.2 编写MySqlInjector 和 FindAll
如果直接继承AbstractSqlInjector
的话,原有的BaseMapper
中的方法将失效,所以我们选择继承DefaultSqlInjector
进行扩展。
MySqlInjector :
MySqlInjector.java
package com.tian.injectors;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import java.util.ArrayList;
import java.util.List;
public class MySqlInjector extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList() {
List<AbstractMethod> list = new ArrayList<>();
// 获取父类中的集合
list.addAll(super.getMethodList());
// 再扩充自定义的方法
list.add(new FindAll());
return list;
}
}
FindAll:
FindAll.java
package com.tian.injectors;
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 FindAll extends AbstractMethod {
@Override
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
String sql = "select * from " + tableInfo.getTableName();
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
return this.addSelectMappedStatement(mapperClass, "findAll", sqlSource, modelClass, tableInfo);
}
}
1.3 注册到Spring容器
MybatisPlusConfig.java
/*** 自定义SQL注入器 */
@Bean
public MySqlInjector mySqlInjector() {
return new MySqlInjector();
}
1.4 测试
SpringbootMybatisplusApplicationTests.java
package com.tian.springbootmybatisplus;
import com.tian.mapper.UserMapper;
import com.tian.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class SpringbootMybatisplusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testFindAll() {
List<User> users = this.userMapper.findAll();
for (User user : users) {
System.out.println(user);
}
}
}
运行结果:
生成的sql
为:select * from tb_user
本文含有隐藏内容,请 开通VIP 后查看