mybatis xml 中调用java 方法

本文探讨了在实际应用中如何通过XML调用静态Java方法,实现复杂的SQL语句生成,包括连表操作、分页和根据多种条件(包括范围条件)进行查询。BaseRangeSearch类展示了如何处理范围搜索,并给出了相关实体和方法的详细示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实际应用场景中遇到个需要连表并分页的功能

还需要各种字段进行条件查询(还有部分范围条件)

好像框架并没有什么好的方式去做(老老实实手写语句拼装吧)

xml调用java方法

注意: 需要是静态的方法

其实调用java 方法很简单

格式就是这样

${@包路径@方法名()}

进阶一点

需要传参数的可以直接在后面的()中加上参数

如:

${@包路径@方法名(传参1, 参数2)}

举个例子

实现的 java 方法
	/** 静态sql生产方法, 给xml里面调用 */
	public static String sql(String columnName, BaseRangeSearch brs){
		if (gt.equals(brs.relation)) {
			return columnName + gt + brs.value.toString();
		} else if (ge.equals(brs.relation)) {
			return columnName + ge + brs.value.toString();
		} else if (lt.equals(brs.relation)) {
			return columnName + lt + brs.value.toString();
		} else if (le.equals(brs.relation)) {
			return columnName + le + brs.value.toString();
		} else {
			throw new SmartLifeException("未正确匹配范围条件: " + brs.relation);
		}
	}
xml 中的写法

我这里的data.searchRange是个list

 <if test="data.searchRange != null">
   <foreach collection="data.searchRange" item="item" index="index" open="and" close=""
            separator="and">
     ${@com.sy.erp.common.BaseRangeSearch@sql("create_time", item)}
   </foreach>
   AND sci.id like #{data.zhaoSi}
</if>
自定义的 BaseRangeSearch 实体
public class BaseRangeSearch {

	static final String gt = ">";
	static final String ge = ">=";
	static final String lt = "<";
	static final String le = "<=";

	@ApiModelProperty(value = "查询条件的值")
	private Object value;

	@ApiModelProperty(value = "查询条件的关系('>' '>=' '<' '<=' 4种)")
	private String relation;

	@Override
	public String toString() {
		return "关系: " + relation + " 值: " + value.toString();
	}

	public void pottingRangeSearch(@NotNull String columnName,
										   @NotNull QueryWrapper<?> queryWrapper) {
		if (!checkValid()) return;
		if (JudgeUtil.hasAnyNull(columnName, queryWrapper)) return;

		if (this.getRelation() != null
				&& this.getValue() != null) {
			String relation = this.getRelation();
			if (gt.equals(this.relation)) {
				queryWrapper.gt(columnName, this.getValue());
			} else if (ge.equals(this.relation)) {
				queryWrapper.ge(columnName, this.getValue());
			} else if (lt.equals(this.relation)) {
				queryWrapper.lt(columnName, this.getValue());
			} else if (le.equals(this.relation)) {
				queryWrapper.le(columnName, this.getValue());
			} else {
				throw new SmartLifeException("未正确匹配范围条件: " + relation);
			}
		}
	}

	/** 静态sql生产方法, 给xml里面调用 */
	public static String sql(String columnName, BaseRangeSearch brs){
		if (gt.equals(brs.relation)) {
			return columnName + gt + brs.value.toString();
		} else if (ge.equals(brs.relation)) {
			return columnName + ge + brs.value.toString();
		} else if (lt.equals(brs.relation)) {
			return columnName + lt + brs.value.toString();
		} else if (le.equals(brs.relation)) {
			return columnName + le + brs.value.toString();
		} else {
			throw new SmartLifeException("未正确匹配范围条件: " + brs.relation);
		}
	}

	public boolean checkValid() {
		return JudgeUtil.isALlPresent(value, relation);
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值