日常开发用MyBatis Plus的lambda表达式查询,不用手写column列名,不易出错且便于改动,如下:
LambdaQueryWrapper<LanguageIntercept> lambdaQueryWrapper = new LambdaQueryWrapper();
lambdaQueryWrapper.eq(LanguageIntercept::getServiceTableName, tableName);
lambdaQueryWrapper.eq(LanguageIntercept::getDataType, TABLE.getType());
在封装一些通用的代码时,也想通过Lambda的形式获取列名,因此通过MyBatis Plus自身的工具类+Hutool可以完成这个功能,代码如下:
import cn.hutool.core.lang.func.Func1;
import cn.hutool.core.lang.func.LambdaUtil;
import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
import com.baomidou.mybatisplus.core.toolkit.support.ColumnCache;
import java.util.Map;
public class TableInfoUtils {
public static <T> String getColumn(Func1<T, ?> func, Class clazz) {
//获取实体所有对应的列
Map<String, ColumnCache> columnMap = LambdaUtils.getColumnMap(clazz);
if (columnMap == null) {
return null;
}
//获取实体属性名称
String fieldName = LambdaUtil.getFieldName(func);
if (StringUtils.isTrimBlank(fieldName)) {
return null;
}
//通过属性名获取对应的列名
String column = columnMap.get(LambdaUtils.formatKey(fieldName)).getColumn();
return column;
}
}
使用代码:
String productIdColumn = TableInfoUtils.getColumn(MPProject::getProductId, MPProject.class);
这样就可以获取到 MPProject 的 productId 属性对应的列名了,但是这里有个问题,这个代码一定要在Mybatis plus 初始化完毕后执行,否则的话,因为table info还没有注册进去,
调用 LambdaUtils.getColumnMap(clazz);
这里返回的就是空,因此我在代码里是继承了 CommandLineRunner
接口,在spring容器完全启动后,再做操作,如下:
@Override
public void run(String... args) {
String productIdColumn = TableInfoUtils.getColumn(MPProject::getProductId, MPProject.class);
if (productIdColumn != null) {
handlerMap.put(productIdColumn, this::buildProductName);
}
}
这里参考了这位仁兄的博客:https://blog.csdn.net/u011974797/article/details/130616631