mybatis-plus随机查询工具类

简介: mybatis-plus随机查询工具类

作为一个人,对父母要尊敬,对子女要慈爱,对穷亲戚要慷慨,对一切人要有礼貌。——(美国)罗素

都封装好了

/**
 * 随机取几条
 *
 * @param function 表名::列名
 * @return T
 * @author <achao1441470436@gmail.com>
 * @since 2021/5/17 0017 10:34
 */
@SuppressWarnings("unchecked")
public static <T, O> List<O> getAny(SFunction<O, T> function, Integer limit) {
    SerializedLambda lambda = Optional.ofNullable(function).map(LambdaUtils::resolve).orElseThrow(() -> ExceptionUtils.mpe("传入条件不能为空"));
    Class<O> entityClass = (Class<O>) lambda.getImplClass();
    TableInfo tableInfo = Optional.ofNullable(entityClass).map(TableInfoHelper::getTableInfo).orElseThrow(() -> ExceptionUtils.mpe("未找到该实体类对应BaseMapper,请注入对应mybatis-plus的BaseMapper"));
    String tableName = tableInfo.getTableName();
    String id = PropertyNamer.methodToProperty(lambda.getImplMethodName());
    List<HashMap<String, Object>> mapList = (List<HashMap<String, Object>>) USER_MAPPER.getAny(tableName, id, limit, entityClass);
    List<TableFieldInfo> fieldList = tableInfo.getFieldList();
    Reflector reflector = new Reflector(entityClass);
    Map<String, Invoker> columnSetterMap = fieldList.parallelStream().collect(Collectors.toMap(tbf -> Optional.ofNullable(tbf).map(TableFieldInfo::getField).map(field -> field.getAnnotation(TableField.class)).map(TableField::value).filter(StringUtils::isNotBlank).orElse(Objects.requireNonNull(tbf).getProperty()), f -> reflector.getSetInvoker(f.getProperty()), (v1, v2) -> v2));
    return mapList.stream().map(map -> {
        O bean = ClassUtils.newInstance(entityClass);
        map.forEach((key, value) -> Optional.ofNullable(key).map(columnSetterMap::get).ifPresent(i -> {
            try {
                i.invoke(bean, new Object[]{value});
            } catch (IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }
        }));
        return bean;
    }).collect(Collectors.toList());
}
/**
 * 随机取一条
 *
 * @param function 表名::列名
 * @return O 随便取的
 * @author <achao1441470436@gmail.com>
 * @since 2021/5/17 0017 12:29
 */
public static <O> O getAnyOne(SFunction<O, ?> function) {
    return getAny(function, 1).parallelStream().findAny().orElse(null);
}

这里的USER_MAPPER我们可以使用任意一个mapper,我这里使用的是静态注入的方式

private static final UserMapper USER_MAPPER = SpringContextHolder.getBean(UserMapper.class);

然后是mapper里的方法

/**
 * 随机取一条
 *
 * @param tableName  表名
 * @param columnName 列名
 * @param limit      取几条
 * @return O
 * @author <achao1441470436@gmail.com>
 * @since 2021/5/17 0017 10:47
 */
<O> List<O> getAny(@Param("table_name") String tableName, @Param("id") String columnName, @Param("limit") Integer limit, Class<O> type);

以及对应的xml

<!--  随机取一条  -->
<select id="getAny" resultType="java.util.Map">
    SELECT *
    FROM ${table_name} AS t1 JOIN (SELECT ROUND(RAND() *((SELECT MAX(${id}) FROM ${table_name}) - (SELECT MIN(${id}) FROM ${table_name})) +(SELECT MIN(${id}) FROM ${table_name})) AS tmp_id) AS t2
    WHERE t1.${id} >= t2.tmp_id
    ORDER BY t1.${id} LIMIT #{limit};
</select>

实际使用场景、方式

相关文章
|
3月前
|
Java 数据库连接 数据库
mybatis查询数据,返回的对象少了一个字段
mybatis查询数据,返回的对象少了一个字段
226 8
|
1月前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
23 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
2月前
|
SQL Java 数据库连接
mybatis如何仅仅查询某个表的几个字段
【10月更文挑战第19天】mybatis如何仅仅查询某个表的几个字段
60 1
|
3月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
5月前
|
Java 数据库连接 mybatis
Mybatis查询传递单个参数和传递多个参数用法
Mybatis查询传递单个参数和传递多个参数用法
76 11
MybatisPlus-标准CRUD制作,新增boolean save(T t),删除 ~ delete(int id),修改 ~ update(T t),根据id查询,T getById....
MybatisPlus-标准CRUD制作,新增boolean save(T t),删除 ~ delete(int id),修改 ~ update(T t),根据id查询,T getById....
MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程
MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程
MybatisPlus介绍新增用户,根据id查询,引入MybatisPlus的起步依赖,增删改查最简单的写法
MybatisPlus介绍新增用户,根据id查询,引入MybatisPlus的起步依赖,增删改查最简单的写法
|
6月前
|
Java 数据库连接 mybatis
Mybatis基于注解的一对一和一对多查询
Mybatis基于注解的一对一和一对多查询
|
7月前
|
SQL Java 数据库连接
MyBatis 查询数据库
MyBatis 查询数据库