在写程序的时候遇到一个问题,用户发布广告的时候需要审核一下,还有其他的一些功能需要审核。 我就在想能不能只用一个表就把所有的事件存储起来。在表中存储,发布事件的表的名字,以及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;
}
最后也是成功的把数据返回给了前端