java动态查询表,动态查询mysql中的表的数据

在写程序的时候遇到一个问题,用户发布广告的时候需要审核一下,还有其他的一些功能需要审核。 我就在想能不能只用一个表就把所有的事件存储起来。在表中存储,发布事件的表的名字,以及id(主键),然后动态的查询表,把表的数据返回给前端。

第一步添加Mapper接口

刚刚开始想了非常久,因为常规的List集合无法接收查询出来的数据。还是找了非常多的帖子才想到用这样的泛型形式来接收(本人只是工作了两个月的菜鸟)



import com.wuye.common.utils.SqlProvider;
import org.apache.ibatis.annotations.SelectProvider;
import org.springframework.stereotype.Repository;


import java.util.List;
import java.util.Map;

@Repository
public interface DynamicQueryMapper {

    @SelectProvider(type = SqlProvider.class,method = "getSql")
    List<Map<String,Object>> dynamicQuery(String id, String name);

}

第二步编写动态sql语句(要下班了这里还留了个坑,如果自动判断表前缀生成sql语句更加完美)

public class SqlProvider {

    public String getSql(String id,String name){

        String str = name.toLowerCase();

        String sql = "select * from "+"t_"+str;

        if (id!=null){
            sql += " where id in("+id+")";
        }

        return sql;
    }

}

第三步 动态的查询表中数据,然后拼接到事件表中(重点部分)

    @Autowired
    private DynamicQueryMapper dynamicQueryMapper;

    /**
     * 查询事件队列列表
     * 
     * @param incidentQueue 事件队列
     * @return 事件队列
     */
    @Override
    public List<IncidentQueueVo> selectIncidentQueueList(IncidentQueue incidentQueue)
    {
        List<IncidentQueueVo> incidentQueueList = incidentQueueMapper.selectIncidentQueueList(incidentQueue);

        Map<String,String> map = new HashMap<>();

        for (IncidentQueueVo item : incidentQueueList) {
            //如果有该类名就添加,表id
            if (map.containsKey(item.getListName())){
                String s = map.get(item.getListName());
                s += ","+item.getListId();
                map.put(item.getListName(),s);
            }else {
                map.put(item.getListName(),item.getListId()+"");
            }
        }

        Set<Map.Entry<String, String>> entries = map.entrySet();
        Iterator<Map.Entry<String, String>> iterator = entries.iterator();

        while (iterator.hasNext()){
        //迭代集合中的类型进行查询
            Map.Entry<String, String> next = iterator.next();
            //key是表名 value是表id
            List<Map<String, Object>> maps = dynamicQueryMapper.dynamicQuery(next.getValue(), next.getKey());

            for (Map<String, Object> stringObjectMap : maps) {

                for (IncidentQueueVo incidentQueueVo : incidentQueueList) {
            //如果 表名 和id相同 就保存到map集合中
                        if ( next.getKey().equalsIgnoreCase(incidentQueueVo.getListName()) && incidentQueueVo.getListId() == Long.parseLong(stringObjectMap.get("id").toString())){
                            incidentQueueVo.setListObject(stringObjectMap);
                        }

                }

            }

        }


        return incidentQueueList;

补充一下事件表的字段以及接收数据的类

@TableName("t_incident_queue")
public class IncidentQueue extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** $column.columnComment */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /** 事件表的id */
    @Excel(name = "事件表的id")
    private Long listId;

    /** 事件表的名字 */
    @Excel(name = "事件表的名字")
    private String listName;

    /** 事件类型 */
    @Excel(name = "事件类型")
    private Long incidentType;

    /** 用户id */
    @Excel(name = "用户id")
    private Long userId;

    /** 用户名 */
    @Excel(name = "用户名")
    private String userName;

    /** 1系统用户 */
    @Excel(name = "1系统用户")
    private Long userType;

    /** 请求路径 */
    @Excel(name = "请求路径")
    private String url;

    /** 用户等级 */
    @Excel(name = "用户等级")
    private Long userClass;

    /** 处理状态0为处理1已处理 */
    @Excel(name = "处理状态0为处理1已处理")
    private Long state;

    /** 事件等级 */
    @Excel(name = "事件等级")
    private Long incidentClass;


import java.util.Map;

@Data
public class IncidentQueueVo extends IncidentQueue {

    private Map<String,Object> listObject;

}

 最后也是成功的把数据返回给了前端

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值