五、扩展通用接口
项目中提供了大量现成的方法,这些方法可以作为扩展时的参考。
例如 selectAll 方法。
首先定义接口:
@RegisterMapperpublic interface SelectAllMapper<T> {/*** 查询全部结果** @return*/@SelectProvider(type = MySelectProvider.class, method = "dynamicSQL")List<T> selectAll();}
其中 MySelectProvider 是你要实现的一个类,该类需要继承 MapperTemplate。
@RegisterMapper 注解可以避免 mappers 参数配置,通用 Mapper 检测到该接口被继承时,会自动注册。
import org.apache.ibatis.mapping.MappedStatement;import tk.mybatis.mapper.mapperhelper.MapperHelper;import tk.mybatis.mapper.mapperhelper.MapperTemplate;import tk.mybatis.mapper.mapperhelper.SqlHelper;public class MySelectProvider extends MapperTemplate {public BaseSelectProvider(Class<?> mapperClass, MapperHelper mapperHelper) {super(mapperClass, mapperHelper);}/*** 查询全部结果** @param ms* @return*/public String selectAll(MappedStatement ms) {final Class<?> entityClass = getEntityClass(ms);//修改返回值类型为实体类型setResultType(ms, entityClass);StringBuilder sql = new StringBuilder();sql.append(SqlHelper.selectAllColumns(entityClass));sql.append(SqlHelper.fromTable(entityClass, tableName(entityClass)));sql.append(SqlHelper.orderByDefault(entityClass));return sql.toString();}}
其中 selectAll 方法名要和接口中定义的方法名一致。其次就是该方法的参数为 MappedStatement 类型。
在 selectAll 方法中,首先是获取了当前接口的实体类型:
final Class<?> entityClass = getEntityClass(ms);
因为接口返回值类型为 List<T>,MyBatis 会认为返回值类型为 List<Object>,这和我们想要的实体类型不一样,所以下一行代码就是设置返回值类型:
setResultType(ms, entityClass);
注意,只有返回 T 或者 List 时需要设置,返回 int 类型时不需要设置。
接下来就是纯粹的拼接 XML 形式的 SQL 了。
//select col1,col2...sql.append(SqlHelper.selectAllColumns(entityClass));//from tablename - 支持动态表名sql.append(SqlHelper.fromTable(entityClass, tableName(entityClass)));//order by xxxsql.append(SqlHelper.orderByDefault(entityClass));
这是其中最简单的一个方法实现。当你想要实现某种方法时,可以从已有的例子中找一个最接近的方法,在此基础上进行修改。
