mybatis-plus:自定义sql注入器
虽然mybats-plus的BaseMapper提供了非常好用,非常多的方法,但是如果我们需要扩充BaseMapper中的方法又该如何实现呢
以findAll方法为例
新建一个spring-boot项目 引入mybatis-plus依赖
在com.mp.Mapper包中新建MyBaseMapper接口
/***创建自己的BaseMapper,指定泛型;添加一个findAll方法;*/public interface MyBaseMapper<T> extends BaseMapper<T> {List<T> findAll();}
新建一个AutoMapper接口继承MyBaseMapper接口
/*** Mapper接口*/@Mapperpublic interface AutoMapper extends MyBaseMapper<Car> {}
该接口作为mapper接口与Controller交互
新建sqlInjector包编写自定义的sql注入器:MySqlInjector
/*** 继承DefaultSqlInjector类,可以获取到BaseMapper原有的方法;* 重写getMethodList方法;添加自己的方法;*/public class MySqlInjector extends DefaultSqlInjector {@Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass) {List<AbstractMethod> methodList = super.getMethodList(mapperClass);//把自己的方法实例添加到集合;// 需要是参照MP的方法写FindAll类(sql语句封装为MappedStatement);methodList.add(new FindAll());return methodList;}}
在sqlInjector包下创建FindAll类(参考SelectList类来写)
*** 自定义findAll查询方法的封装类;* 参照MP的方法写FindAll类(sql语句封装为MappedStatement);*/public class FindAll extends AbstractMethod {@Overridepublic MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {String sqlMethod = "findAll";//方法名String sql = "select * from " + tableInfo.getTableName();//sql语句SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);return this.addSelectMappedStatementForTable(mapperClass, sqlMethod, sqlSource, tableInfo);}}
在spring-boot启动类中注册到spring容器
/*** 自定义sql注入器* @return*/@Beanpublic MySqlInjector mySqlInjector(){return new MySqlInjector();}
在测试类中测试
//测试自己定义的findAll方法@Testvoid testFindAll(){List<Car> all = autoMapper.findAll();all.forEach(System.out::println);}