懒人查询
MybatisPlus setEntity()
由于我们公司代码生成的时候,查询列表统一都是使用了setEntity()
于是就开始折腾之旅。
懒人查询写法如下:
public List<BasReservoirArea> selectList(BasReservoirArea basReservoirArea) {
QueryWrapper<BasReservoirArea> where = new QueryWrapper<>();
where.setEntity(basReservoirArea);
return baseMapper.selectList(where);
}
前端有可能会传入空格的情况 !!!
setEntity()源码 并不过滤空格 执行sql的时候 会把空格作为参数去当做查询条件
public Children setEntity(T entity) {
this.entity = entity;
this.initEntityClass();
return this.typedThis;
}
protected void initEntityClass() {
if (this.entityClass == null && this.entity != null) {
this.entityClass = this.entity.getClass();
}
}
那我就想把空格转换为null就满足setEntity()方法了。开搞
暴力解决方案如下:
//1.对象转map
Map<Object, Object> map = MapUtil.beanToMap(test);
//2.移除空值
MapUtil.removeNullValue(map);
//3.map转回对象
Test entity = JSON.parseObject(JSON.toJSONString(map), Test.class);
工具类如下
/**
* 将对象属性转化为map结合
*/
public static <T> Map<Object, Object> beanToMap(T bean) {
Map<Object, Object> map = new HashMap<>();
if (bean != null) {
BeanMap beanMap = BeanMap.create(bean);
for (Object key : beanMap.keySet()) {
map.put(key, beanMap.get(key));
}
}
return map;
}
/**
* 移除map中的value空值
*
* @param map
* @return
*/
public static void removeNullValue(Map map) {
Set set = map.keySet();
for (Iterator iterator = set.iterator(); iterator.hasNext(); ) {
Object obj = (Object) iterator.next();
Object value = (Object) map.get(obj);
remove(value, iterator);
}
}
感觉还是不够懒呀…于是找了沙老大 搞了个配置
Get全局配置如下:
/**
* @Author 沙小卫
* @Description //TODO 适用于Get请求 处理参数为空值转换为null
* @Date 2021-01-12
* @Param
* @return
**/
@ControllerAdvice
public class GlobalControllerAdiviceController {
//WebDataBinder是用来绑定请求参数到指定的属性编辑器,可以继承WebBindingInitializer来实现一个全部controller共享的dataBiner Java代码
@InitBinder
public void dataBind(WebDataBinder binder) {
///給指定类型注册类型转换器操作
binder.registerCustomEditor(String.class, new StringEditor());
}
}
/**
* @Author 沙小卫
* @Description //TODO 适用于Get请求 处理参数为空值转换为null
* @Date 2021-01-12
* @Param
* @return
**/
public class StringEditor extends PropertyEditorSupport {
//setAsText完成字符串到具体对象类型的转换,
@Override
public void setAsText(String text) throws IllegalArgumentException {
if (text == null || "".equals(text.trim())) {
text = null;
}
setValue(text);
}
//getAsText完成具体对象类型到字符串的转换。
@Override
public String getAsText() {
if (getValue() != null) {
return getValue().toString();
}
return null;
}
}
Post类型的配置如下:
/**
* @Author 沙小卫
* @Description //TODO 解决前端Post传参为空值转换为null 结合 mybatisPlus where.setEntity()
* @Date 2021-01-13
* @Param
* @return
**/
public class StringDescrializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
String value = jsonParser.getValueAsString();
if (value == null || "".equals(value.trim())) {
return null;
}
return value;
}
@Bean
@Primary
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
//设置解析JSON工具类
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.getSerializerProvider().setNullValueSerializer(
new JsonSerializer<Object>() {
@Override
public void serialize(Object value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString("");
}
}
);
SimpleModule simpleModule = new SimpleModule();
simpleModule.addDeserializer(String.class, new StringDescrializer());
objectMapper.registerModule(simpleModule);
//忽略未知属性 防止解析报错
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
jsonConverter.setObjectMapper(objectMapper);
List<MediaType> list = new ArrayList<>();
list.add(MediaType.APPLICATION_JSON_UTF8);
jsonConverter.setSupportedMediaTypes(list);
return jsonConverter;
}
}