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

时间:2009-01-20 21:53:36

标签: java ibatis dynamic-sql

我在前端使用Java - Ibatis和mySQL与Flex / Flash。我有一个要求是能够根据用户角色动态地将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>

其他想法?

2 个答案:

答案 0 :(得分:2)

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子句元素,而不必在每个参数映射中包含角色

答案 1 :(得分:0)

在查询中使用角色的问题是,您必须将其作为查询的参数提供给可能的每个查询。当您需要为查询提供参数时会发生什么?您还需要为这些参数类/映射添加角色。这有点乱。

我退后一步,定义你的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 integration with BlazeDS,这将打开依赖注入作为选项。

或者,您可以使用简单的工厂方法(基于角色)来获取正确的DAO。

根据您的配置,毫无疑问有其他方法可以插入此功能。我认为上述内容比你提议的要清晰得多。