使用mybatisPlus动态查询不同表字段和数据

在这种情况下,你可以利用 MyBatis-Plus 的一些高级特性来实现更通用的动态查询,而不依赖于具体的实体类。以下是一种改进的方法:

请注意:

这样,你就可以更灵活地动态查询不同表的数据,而不需要为每个表都创建特定的实体类。

  1. 首先,定义一个通用的查询服务接口:
    import com.baomidou.mybatisplus.core.conditions.Wrapper;
    import java.util.List;
    import java.util.Map;
    
    public interface DynamicQueryService {
        List<Map<String, Object>> queryTableData(String tableName, Wrapper<?> queryWrapper);
    }

    2.

    import com.baomidou.mybatisplus.core.conditions.Wrapper;
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.baomidou.mybatisplus.core.metadata.IPage;
    import com.baomidou.mybatisplus.core.toolkit.Constants;
    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;
    
    @Service
    public class DynamicQueryServiceImpl extends ServiceImpl<BaseMapper<?>, Object> implements DynamicQueryService {
        @Autowired
        private MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean;
    
        @Override
        public List<Map<String, Object>> queryTableData(String tableName, Wrapper<?> queryWrapper) {
            try {
                // 获取与表名对应的 Mapper
                BaseMapper baseMapper = getBaseMapper(tableName);
                List<?> entityList = baseMapper.selectList(queryWrapper);
                List<Map<String, Object>> resultList = entityList.stream()
                       .map(this::entityToMap)
                       .collect(Collectors.toList());
                return resultList;
            } catch (Exception e) {
                e.printStackTrace();
                return new ArrayList<>();
            }
        }
    
        private BaseMapper getBaseMapper(String tableName) {
            // 使用 MyBatis 的 SqlSessionFactory 获取与表名对应的 Mapper
            SqlSessionFactory sqlSessionFactory = mybatisSqlSessionFactoryBean.getObject();
            SqlSession sqlSession = sqlSessionFactory.openSession();
            return sqlSession.getMapper(Class.forName("com.example.mapper." + tableName + "Mapper"));
        }
    
        private Map<String, Object> entityToMap(Object entity) {
            Map<String, Object> map = new HashMap<>();
            // 这里假设你的实体类都遵循 JavaBean 规范,可以通过反射获取属性值
            try {
                for (java.lang.reflect.Field field : entity.getClass().getDeclaredFields()) {
                    field.setAccessible(true);
                    map.put(field.getName(), field.get(entity));
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            return map;
        }
    }

    在上述代码中:

  2. DynamicQueryServiceImpl实现了DynamicQueryService接口,提供了根据表名和查询条件动态查询数据并将结果转换为Map<String, Object>列表的功能。
  3. getBaseMapper方法通过反射获取与表名对应的 Mapper,以便执行查询操作。
  4. entityToMap方法通过反射将实体对象转换为键值对形式的Map
  5. 上述代码中的com.example.mapper包路径需要根据你的实际项目结构进行修改。
  6. 代码中的异常处理相对简单,在实际应用中可以根据需要进一步完善。
  7. 这种方式通过反射来获取 Mapper 和处理实体对象,可能会有一定的性能开销,在高并发等场景下需要谨慎考虑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值