在这种情况下,你可以利用 MyBatis-Plus 的一些高级特性来实现更通用的动态查询,而不依赖于具体的实体类。以下是一种改进的方法:
请注意:
这样,你就可以更灵活地动态查询不同表的数据,而不需要为每个表都创建特定的实体类。
- 首先,定义一个通用的查询服务接口:
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; } }
在上述代码中:
DynamicQueryServiceImpl
实现了DynamicQueryService
接口,提供了根据表名和查询条件动态查询数据并将结果转换为Map<String, Object>
列表的功能。getBaseMapper
方法通过反射获取与表名对应的 Mapper,以便执行查询操作。entityToMap
方法通过反射将实体对象转换为键值对形式的Map
。- 上述代码中的
com.example.mapper
包路径需要根据你的实际项目结构进行修改。 - 代码中的异常处理相对简单,在实际应用中可以根据需要进一步完善。
- 这种方式通过反射来获取 Mapper 和处理实体对象,可能会有一定的性能开销,在高并发等场景下需要谨慎考虑。