基于角色动态查询的Java-Ibatis-mySQL

基于角色动态查询的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 = '

我在前端使用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 = '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,一个超级一个有限,这似乎是很多代码。。。有什么想法吗?