爪哇 - ibatis的 - MySQL的使用动态查询基于角色
-
19-08-2019 - |
题
在前端ibatis的和MySQL使用Flex /闪存 -
我使用Java。我有一个要求,那就是能够动态地creterias和表添加到根据用户角色的查询。这里是一个例子
相同的对象调用基于角色相同SQL但不同的结果
角色1:完全访问雇员
SELECT *
FROM Employee A
角色2:员工有限的访问
SELECT *
FROM Employee A
, SECURE_LIST B
WHERE B.EmployeeID = A.EmployeeID
AND B.ROLE_ID = 'ROLE'
我可以使用动态SQL
SELECT *
FROM Employee A
<isNotEmpty property="ROLE" >
, SECURE_LIST B
WHERE B.EmployeeID = A.EmployeeID
AND B.ROLE_ID = #ROLE#
</isNotEmpty>
其他想法?
解决方案
SELECT *
FROM Employee A
<isNotEmpty property="ROLE" >
inner join SECURE_LIST B on B.EmployeeID = A.EmployeeID
</isNotEmpty>
<dynamic prepend="WHERE">
<isNotEmpty property="ROLE" prepend="AND">
B.ROLE_ID = #ROLE#
</isNotEmpty>
</dynamic>
比创建的DAO,但仍然提供可以灵活地添加其他连接或稍微简单一些其它where子句元件,而不必在包括每一个参数映射的作用
其他提示
用在查询中的作用的问题是,你必须再提供其作为参数传递给查询可能每个查询。当您需要提供参数查询,会发生什么?您需要将角色添加到这些参数类/映射过。这一切都有点混乱。
我退一步并定义DAO:
public interface MyDAO {
List<Employee> getEmployees();
...
}
和再创建两个实现:
public class MyDAOSuper implements MyDAO {
public List<Employee> getEmployees() {
// call a query using your first SQL
}
}
public class MyDAOLimited implements MyDAO {
public List<Employee> getEmployees() {
// limited version
}
}
该方法的一个优点是,如果某些方法不应由一个特定的角色来使用你抛出一些安全违反异常的选项。
现在你怎么插在你的应用程序的其余部分是我没有足够的细节发表评论。你可能会使用BlazeDS的在这种情况下,我建议使用 Spring集成使用BlazeDS ,该将开辟依赖注入作为一种选择。
另外,您可以使用一个简单的工厂方法(基于角色),以获得正确的DAO。
有毫无疑问其他方式取决于您的配置,以堵塞这一点。我觉得上面比你尽管提出什么更清洁了许多。
不隶属于 StackOverflow