功能需求
(为了印象深刻,在这里我把使用的语境也写出来了,如果各位不想了解语境,直接跳到文末获取方法)现有一张附件表main_tablea_ttachfile、一张房间表room。
现在的需求是:每一个房间都要有附件上传共能(支持多张上传)。
需求分析
附件表整个系统都在引用,所以不能轻易乱动,能动的就是room表。那么满足这个需求的解决方案有两个:第一个方案是创建一个关联表,用来关联room表的id和main_tablea_ttachfile表的id,查询的时候作关联查询;第二个方案就是:room表新增一个字段,用来保存main_tablea_ttachfile的id,这些id之间用指定的符号隔开(,/+./*等等)。现在我采用的是第二种方案,id之间用逗号(、)隔开。
问题现象
以下是控制器里面的一个方法:
@RequestMapping("room-view")
public String view(@RequestParam(value = "id", required = false) Long id, Model model) throws BadSqlGrammarException {
logger.info("****-room-view.do,参数id:" + id);
if (id != null) {
Room room = roomManager.get(id);
model.addAttribute("model", room);
//查询出改房间下的附件
String filesId = room.getMultipartFilesId();
List<Map<String, Object>> multipartFiles = new ArrayList<>();
if (filesId != null) {
if (filesId.length() > 0) {
Util util = new Util();
//去掉首尾的 ","
filesId = util.trimBothEndsChars(filesId, ",");
String sql = "SELECT ID,CONF_ID,PATH,ATTACH_SHOW_NAME,ATTACH_SIZE,ATTACH_FILE_NAME FROM main_tablea_ttachfile WHERE delete_flag = '1' AND id IN(" + filesId + ")";
logger.info("sql:" + sql);
multipartFiles = jdbcTemplate.queryForList(sql);
logger.info("multipartFiles:" + multipartFiles.toString());
}
}
model.addAttribute("multipartFiles", multipartFiles);
}
return "roompage/room/room-view";
}
正如上所示,我的SQL查询语句的条件是:in,条件来源是room的属性。
现在的问题就是,如果在某个时候我删除了room的MultipartFilesId这个属性里面的首位id或者末位id那么就会造成这个属性值如下情况:,a,b,c/a,b,c, 换言之就是首位/末位有逗号,所以我们在进行查询的时候先得把首位逗号去掉。如何实现呢?
具体实现
/**
* 去掉首尾指定字符串
* @param srcStr
* @param splitter
* @return
*/
public String trimBothEndsChars(String srcStr, String splitter) {
String regex = "^" + splitter + "*|" + splitter + "*$";
return srcStr.replaceAll(regex, "");
}