Springboot2.0中利用自定义属性动态设置SQL语句

起因

看到标题可能很多朋友会懵,这什么意思,什么是利用自定义属性动态设置SQL语句,这么做图什么呢?
其实这个标题要结合着目前的大框架来看,由于将权限框架封装成了Maven项目,从而在使用权限的过程中只要在Pom.xml中引入我上传在Maven私服的权限框架就可以了,但是之前的权限框架由于之考虑了最基本的情况,也就是原来的权限框架对应的数据库表单主要有:用户表,角色表,权限表,菜单表和资源表,现在由于业务的增加,导致了我们加入了审批权限表,该表是和角色表相关联的,但是这里就面临一个问题,那就是,不是每个项目都有审批权限的而且这么改权限框架会导致权限框架臃肿且业务侵入性很强,那么有没有什么解决方案呢?

思路

遇到这个问题,其实我们主要就是找到问题的核心,这个问题的核心点就是子MAVEN项目的业务是根据主业务项目的变化而变化的,我们能做到灵活应对吗?
答案当然是:能!
这里需要了解几个关键知识点:

JDBC,Springboot引入外部配置文件,自定义属性

只要知道这三个知识点,基本上就能够解决我们的问题了,具体方法很简单,看下面的代码即可。

方案

第一步:引入Jdbc的POM(权限管理模块内)

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>

引入这个依赖就可以使用JdbcTemplate了,这样就可以使用原生的Sql语句了。

第二步:编写数据的查询类(权限管理模块内)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
**
* @Author:贾真
* @Description:
* @Date:创建于上午 09:52 2018/8/24
* @Modified:为了保证权限查询的灵活性,且由于本次项目中的权限表加入了审批权限,关于权限查询的SQL就必须要更改,如果这里写死的话,就会造成业务的无法扩展
* 我们目前的解决方案是,灵活的SQL使用JDBC的方式来查询,SQL语句可以通过子项目的自定义属性进行设置即可。
*/

@Repository
public class JdbcOperation {

@Autowired
private JdbcTemplate jdbcTemplate;

/**
* 自定义的SQL语句属性
*/

@Value("${security.find.auth.by.id.sql}")
private String findAuthByIdSQL;
/**
* 默认的SQL语句
*/

private String default_findAuthByIdSQL = "SELECT" +
" sa.*" +
" FROM" +
" sys_authorities sa" +
" LEFT JOIN sys_role_auth sra ON sra.auth_id = sa.auth_id" +
" LEFT JOIN sys_user_role sur ON sur.role_id = sra.role_id" +
" LEFT JOIN sys_user su ON su.user_id = sur.user_id" +
" WHERE su.user_id=?";

/**
* 根据ID获取用户权限
*
* @return
* @throws Exception
*/

@Transactional(readOnly = true)
public List<SysAuth> findAuthById(final Long id) throws Exception {
if (("").equals(findAuthByIdSQL) || findAuthByIdSQL.length() == 0) {
findAuthByIdSQL = default_findAuthByIdSQL;
}
return jdbcTemplate.query(findAuthByIdSQL, new Object[]{id,id,id}, new SysAuthRowMapper());
}


/**
* 行映射
* 映射的必须是数据库的字段名
*/

class SysAuthRowMapper implements RowMapper<SysAuth> {

@Override
public SysAuth mapRow(ResultSet resultSet, int i) throws SQLException {
SysAuth sysAuth = new SysAuth();
sysAuth.setAuthId(resultSet.getLong("auth_id"));
sysAuth.setAuthName(resultSet.getString("auth_name"));
sysAuth.setAuthDesc(resultSet.getString("auth_desc"));
sysAuth.setEnable(resultSet.getShort("enable"));
sysAuth.setIsSys(resultSet.getShort("is_sys"));
return sysAuth;
}

}

}

这里要注意一下,首先通过@Value(“${security.find.auth.by.id.sql}”)来自定义属性,属性的Key是security.find.auth.by.id.sql,然后要注意的是Jdbc的行映射必须映射的是数据库的字段名,至于逻辑就是如果有自定义属性就执行自定义属性中的Sql语句,如果没有则执行默认的Sql语句。

第三步:在配置文件中加入业务Sql(主业务项目)

1
2
spring.profiles.active=ss_cas
#security.find.atuth.by.id.sq=SELECT a.* FROM `sys_authorities` a

OK,就这三步,主业务系统就可以灵活的定义对应的权限系统中的SQL语句了,当然以后有什么其他的灵活性业务也可以这么做,不过一定要写好文档和注释,以免时间过长忘记这里的思路。

热评文章