基于角色动态查询的Java-Ibatis-mySQL
我在前端使用Java-Ibatis和mySQL以及Flex/Flash。我有一个要求,就是能够根据用户角色动态地向查询添加creterias和table。这里有一个例子 相同的对象调用相同的SQL,但基于角色的结果不同 角色1:完全接触员工基于角色动态查询的Java-Ibatis-mySQL,java,ibatis,dynamic-sql,Java,Ibatis,Dynamic Sql,我在前端使用Java-Ibatis和mySQL以及Flex/Flash。我有一个要求,就是能够根据用户角色动态地向查询添加creterias和table。这里有一个例子 相同的对象调用相同的SQL,但基于角色的结果不同 角色1:完全接触员工 SELECT * FROM Employee A SELECT * FROM Employee A , SECURE_LIST B WHERE B.EmployeeID = A.EmployeeID AND B.ROLE_ID = '
SELECT *
FROM Employee A
SELECT *
FROM Employee A
, SECURE_LIST B
WHERE B.EmployeeID = A.EmployeeID
AND B.ROLE_ID = 'ROLE'
角色2:有限的员工访问权限
SELECT *
FROM Employee A
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>
其他想法?在查询中使用role的问题是,您必须将它作为参数提供给查询,可能是每个查询。当需要为查询提供参数时会发生什么情况?您还需要将角色添加到这些参数类/映射中。一切都有点乱 我会退一步定义您的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,在这种情况下,我建议使用,这将打开依赖项注入作为一个选项
或者,您可以使用基于角色的简单工厂方法来获得正确的DAO
毫无疑问,根据您的配置,还有其他方法可以插入此功能。不过,我认为上述内容比你的建议要干净得多
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都受该安全列表子查询的约束,因此我必须为大多数对象创建2个DAO,一个超级一个有限,这似乎是很多代码。。。有什么想法吗?