使用反射完成mybatis-plus自动装配查询条件

先上DO代码:

@Data
@TableName("dict")
public class DictDo {
	@TableId(type=IdType.AUTO)
	private String id;
	@TableField("`key`")
	private String key;
	private String value;
	private String memo;
}

此处使用了lombok,自动生成对象方法(此处是否与我们的思想有异曲同工之妙呢)!
使用原生的查询条件拼装:

public List<DictDo> selectListEq(DictDo one) {
		QueryWrapper<DictDo> wrapper = new QueryWrapper<>();
		if (null != one.getId()) {
			wrapper.eq("id", one.getId());
		}
		if (null != one.getKey() && !"".equals(one.getKey())) {
			wrapper.eq("`key`", one.getKey());
		}
		if (null != one.getValue() && !"".equals(one.getValue())) {
			wrapper.eq("value", one.getValue());
		}
		if (null != one.getMemo() && !"".equals(one.getMemo())) {
			wrapper.eq("memo", one.getMemo());
		}
		return dictDao.selectList(wrapper);
	}

如上所示,每个对象如果只有几条属性还好说,但是如果有几十条属性呢?
我们应该想到所有重复的劳动都是低价值的、可以被替代的!
工具代码:

public static QueryWrapper parseQuery(Object service) throws Exception {
		QueryWrapper<Object> wrapper = new QueryWrapper<>();
		Class<? extends Object> doClass = service.getClass();
		Method[] methods = doClass.getDeclaredMethods();
		Field[] fields = doClass.getDeclaredFields();
		for (Field field : fields) {
			for (Method method : methods) {
				if (method.getName().equalsIgnoreCase("get" + field.getName())) {
					String value = doClass.getDeclaredMethod(method.getName()).invoke(service) == null ? ""
							: (String) doClass.getDeclaredMethod(method.getName()).invoke(service);
					if (null != value && !"".equals(value)) {
						wrapper.eq("`"+field.getName()+"`", doClass.getDeclaredMethod(method.getName()).invoke(service));
						break;
					}
				}
			}
		}
		return wrapper;
	}

Service进行调用:

    /**
	 * 按对象属性匹配
	 * @throws Exception 
	 */
	public List<DictDo> selectListEq(DictDo one) throws Exception {
		QueryWrapper<DictDo> wrapper = ParamSettingUtil.parseQuery(one);
		return dictDao.selectList(wrapper);
	}

进行测试:

@SuppressWarnings("unchecked")
	@Test
	public void testSelect() {
		System.out.println("## testSelect");
		DictDo dictDo=new DictDo();
		dictDo.setKey("233");
		QueryWrapper<DictDo> wrapper;
			try {
				wrapper = ParamSettingUtil.parseQuery(dictDo);
				List<DictDo> dictDos= dictDao.selectList(wrapper);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
	}

测试结果:
在这里插入图片描述
如上图看到,我们新加进去的条件已经生效了!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值