[180716]记录工作中的一个问题及解决方法

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());
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值