1. 业务问题大致描述
表A需要在原产品上增加查询权限(可配置),权限字段为AUTH,权限与用户的关系存储在表AUTH_USER中
显示与之前做过的大致相同,读取AUTH的启用状态,传到sql中判断是否加上AUTH_USER的查询、传到页面中判断前台是否显示筛选框和字段列
表A表B表C的导入、导出,原产品使用了xml配置的方式
此时的问题在于,不光字段,连sql都是写在配置xml里的……导出启了一个新的线程,没有使用spring-mvc,因此无法直接获取AuthService进行各种判断
2. 解决方法
round 1
在配置xml中加入AUTH字段和AUTH的sql语句
问题:AUTH要求是可配置的,根据数据库中记录决定开启与否、用and或or连接,必须在java中传值
round 2
java中获取权限数据传值
问题:配置xml无法动态拼接sql,必须得在java中拼接
round 3
java中使用authService获取权限数据,拼接出querySql
问题:service注入失败
round 4
使用jdbcTemplate自带的queryForList获取map形式的权限数据
问题:报了各种奇怪的sql错误,原条件语句无法直接拼接需要各种拆分
round5
修正上述问题,成功!
3. 总结
1)在配置xml中加入AUTH字段(由于数据库已变化,加字段也不影响不启用时的读取)
2)在获取xml中sql时进行判断:sql中是否包含AUTH字符串
3)若包含,代表该表A可能需要权限控制,使用jdbcTemplate自带的queryForList获取map形式的权限数据
4)根据查找结果拼接sql
4. 代码
if (querySql.contains("AUTH")){ // querySql : 原查询语句
// 去数据库获取现有权限列表
String querySqlAuth = "权限查询语句";
List<Map<String, Object>> authList = jdbcTemplate.queryForList(querySqlAuth);
StringBuffer addSql = new StringBuffer("");
addSql.append("WHERE (原条件语句");
if (authList != null && !authList.isEmpty()){
for (Map<String, Object> authMap : authList){
if ("1".equals(authMap.get("需要的属性"))){
addSql.append("and" + "拼来拼去");
}
}
}
addSql.append(")");
if (authList != null && !authList.isEmpty()){
for (Map<String, Object> authMap : authList){
if ("2".equals(authMap.get("需要的属性"))){
addSql.append("or" + "拼来拼去");
}
}
}
querySql = querySql.subString(0, querySql.lastIndexOf("WHERE")) + addSql
+ querySql.subString(querySql.lastIndexOf("标志" + 2), querySql.length());
}