Mybatis使用对象构造HashMap作为入参

  Mybatis可以使用对象传参,也可以使用Map作为入参,我们也可以将对象转换成Map,作为一个通用的入参。以下为示例案例


import cn.hutool.core.util.ReflectUtil;
import com.test.ft.common.exception.CommonException;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

public class QueryParam extends HashMap<Object, Object> {

    private static final long serialVersionUID = 1101074895437012210L;

    /**
     * 构建查询参数对象。
     * 该方法通过反射,从传入的value对象中获取所有字段值,并根据一定条件过滤后,添加到QueryParam对象中。
     *
     * @param value 要构建查询参数的对象。该对象的字段会被反射读取并添加到查询参数中。
     * @param filterNull 是否过滤掉值为null或者空字符串的字段。
     * @param numberIsBiggerThanZero 是否过滤掉数值类型字段且值不大于0的字段。
     * @param filterMap 是否过滤掉字段类型为Map的字段。
     * @return QueryParam 查询参数对象,包含了从value对象中反射获取并经过过滤的字段及其值。
     */
    public static QueryParam build(Object value, boolean filterNull, boolean numberIsBiggerThanZero, boolean filterMap) {
        QueryParam param = new QueryParam();
        Field[] fields = ReflectUtil.getFields(value.getClass());
        try {
            for (Field field : fields) {
                field.setAccessible(true);
                Object o = field.get(value);
                // 过滤掉null值
                if (filterNull && (Objects.isNull(o) || StringUtils.isBlank(o.toString()))) {
                    continue;
                }
                // 过滤掉静态字段
                if (Modifier.isStatic(field.getModifiers())) {
                    continue;
                }
                if (numberIsBiggerThanZero && o instanceof Number && !isNotNullAndBigZero((Number) o)) {
                    continue;
                }
                if (Map.class.isAssignableFrom(field.getType())) {
                    if (filterMap) {
                        continue;
                    }
                    param.putAll((Map<?, ?>) o);
                    continue;
                }
                param.put(field.getName(), o);

            }
        } catch (IllegalAccessException e) {
            throw new CommonException("Accessing field values failed", e);
        }
        return param;
    }
    /**
     * 构建一个QueryParam对象,专门处理值为null的情况。
     *
     * @param value 拟作为QueryParam对象属性的值,此方法中该值将被忽略,因为专门处理null值。
     * @return 返回一个QueryParam实例,其内部状态根据此方法的特定逻辑配置。
     */
    public static QueryParam buildWithNull(Object value) {
        return build(value, false, false, false);
    }

    public static QueryParam buildNonNull(Object value) {
        return build(value, true, false, false);
    }
    /**
     * 构建一个非空且大于零的查询参数。
     *
     * @param value 参数的值,该值将被用于构建查询参数,必须是非空且大于零的数值。
     * @return 返回一个配置好的查询参数对象,确保了参数的非空性和数值大于零的条件。
     */
    public static QueryParam buildNonNullAndBiggerThanZero(Object value) {
        return build(value, true, true, false);
    }

    public static QueryParam buildNonNullAndFilterMap(Object value) {
        return build(value, true, true, true);
    }

    public static boolean isNotNullAndBigZero(Number number) {
        return (number != null && isBigThanZero(number));
    }

    private static boolean isBigThanZero(Number number) {
        if (number instanceof Integer) {
            return (Integer) number > 0;
        } else if (number instanceof Long) {
            return (Long) number > 0L;
        } else if (number instanceof Short) {
            return (Short) number > 0;
        } else if (number instanceof Byte) {
            return (Byte) number > 0;
        } else if (number instanceof BigInteger) {
            return ((BigInteger) number).compareTo(BigInteger.ZERO) > 0;
        } else if (number instanceof Double) {
            double value = (Double) number;
            return value >= 1e-6 && Math.abs(value) >= 1e-6; // 考虑到小数点后位数可能有限制,使用近似值进行比较
        } else if (number instanceof Float) {
            float value = (Float) number;
            return value >= 1e-5f && Math.abs(value) >= 1e-5f; // 浮点数也需要考虑小数点后位数的影响
        } else if (number instanceof BigDecimal) {
            return ((BigDecimal) number).compareTo(BigDecimal.ZERO) > 0;
        } else {
            throw new IllegalArgumentException("Unsupported type of number");
        }
    }


}

在Mapper中的使用:

public interface BOrderMapper {
    
    List<TestVo> getBOrderList(@Param("param") QueryParam  param);

}

在xml里面的使用示例:

    <select id="getBOrderList" resultType="com.test.ft.common.vo.TestVo">
        select  distinct
            (case
                 when bo.resume_type = 1 then '在线'
                 when bo.resume_type = 2 then '线下'
                 else '未知'
                end
                ) as resumeTypeName
        from
            b_order bo
        where
           bo.id &gt;= #{param.id} <!-- 查询id时使用传入的参数 -->
    </select>

以上为使用对象构造Mybatis通用入参的简单使用

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis-Plus 提供了多种方式进行全表查询,以下是其中的几种方式: 1. 使用 selectList() 方法查询所有数据 ```java List<User> userList = userMapper.selectList(null); ``` 这里的 `null` 表示没有任何查询条件,即查询所有数据。 2. 使用 selectPage() 方法进行分页查询 ```java Page<User> page = new Page<>(1, 10); IPage<User> userPage = userMapper.selectPage(page, null); List<User> userList = userPage.getRecords(); ``` 这里的 `Page` 是 MyBatis-Plus 提供的分页对象,其中构造函数的第一个参数表示当前页码,第二个参数表示每页显示的数据量。`selectPage()` 方法会返回一个 `IPage` 对象,其中包含了当前页码、每页显示的数据量、总数据量等信息,可以通过 `getRecords()` 方法获取当前页的数据列表。 3. 使用 selectBatchIds() 方法根据 ID 批量查询数据 ```java List<Long> idList = Arrays.asList(1L, 2L, 3L); List<User> userList = userMapper.selectBatchIds(idList); ``` 这里的 `idList` 是一个包含了多个 ID 的列表,`selectBatchIds()` 方法会根据这些 ID 查询对应的数据。 4. 使用 selectByMap() 方法根据字段值查询数据 ```java Map<String, Object> columnMap = new HashMap<>(); columnMap.put("age", 20); List<User> userList = userMapper.selectByMap(columnMap); ``` 这里的 `columnMap` 是一个包含了多个字段和对应值的 Map,`selectByMap()` 方法会根据这些字段和值查询对应的数据。 注意,全表查询可能会对数据库性能造成较大影响,尽量避免无条件的全表查询。如果需要查询大量数据,应当采用分页查询方式获取部分数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值