[MyBatis]Condition注解

405 阅读1分钟

可以在domain类的属性上利用Condition这个注解,来快捷定义查询时使用的比较符号。
例如可以写

@Column
@Condition(operator = LIKE)
private String roleCode;

使用默认查询时让这个属性使用模糊查询

我们来看下Condition类:


  • 这里的operator不做限制,具体条件会变成 “字段名 operator 给定的值”,例如> = <,默认=,也可以设置成“like”,配合autoWrap进行模糊查询。
  • autoWrap是布尔类型,如果设置成true会使用%将给定的值包起来,false则不会,也就是“字段名 like ‘%给定的值%’”和“字段名 like ‘给定的值’”的区别。
  • exclude如果为false,则不会放入条件中。

具体的调用链为:
1、

BaseSelectProvider

sql.append(SqlHelper.whereAllIfColumns(entityClass, this.isNotEmpty()));

2、

SqlHelper

Condition condition = column.getCondition();
if(condition == null) {
    sql.append(getIfNotNull(column, " AND " + column.getColumnEqualsHolder(), empty));
} else if(!condition.exclude()) {
    sql.append(getIfNotNull(column, " AND " + column.getColumnHolderWithOperator(condition.operator(), condition.autoWrap()), empty));
}

3、

EntityColumn

public String getColumnHolderWithOperator(String operator, boolean autoWrap) {
    if("LIKE".equalsIgnoreCase(operator)) {
        return autoWrap?this.column + " LIKE concat(\'%\',concat(" + this.getColumnHolder((String)null) + ",\'%\'))":this.column + " LIKE " + this.getColumnHolder((String)null);
    } else {
        operator = operator.replace(">", "&gt;").replace("<", "&lt;");
        return this.column + operator + this.getColumnHolder((String)null);
    }
}