Java - Ibatis - 역할 기반 동적 쿼리가 포함된 mySQL
-
19-08-2019 - |
문제
저는 프런트 엔드에서 Flex/Flash와 함께 Java - Ibatis 및 mySQL을 사용하고 있습니다.사용자 역할에 따라 쿼리에 크리테리아와 테이블을 동적으로 추가할 수 있어야 한다는 요구 사항이 하나 있습니다.여기에 예가 있습니다
동일한 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를 만드는 것보다 조금 간단하지만 여전히 모든 매개 변수 맵에 역할을 포함하지 않고 다른 조인 또는 다른 위치 절 요소를 추가 할 수있는 유연성을 제공합니다.
다른 팁
쿼리 내에서 역할을 사용할 때의 문제점은 가능한 모든 쿼리에 대해 쿼리에 대한 인수로 역할을 제공해야 한다는 것입니다.쿼리에 인수를 제공해야 하면 어떻게 되나요?해당 매개변수 클래스/맵에도 역할을 추가해야 합니다.모든 것이 조금 지저분합니다.
저는 한발 물러서서 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를 사용 중일 수도 있습니다. 이 경우 다음을 사용하는 것이 좋습니다. BlazeDS와 Spring 통합, 옵션으로 종속성 주입이 열립니다.
또는 간단한 팩토리 메소드(역할 기반)를 사용하여 올바른 DAO를 얻을 수 있습니다.
구성에 따라 이를 연결하는 다른 방법은 의심할 여지가 없습니다.나는 위의 내용이 당신이 제안한 것보다 훨씬 깨끗하다고 생각합니다.