문제

응용 프로그램에서 데이터 액세스 코드를 구현하려면 JDBC를 마무리하기 위해 일부 프레임 워크가 필요합니다 (ORM은 확장 성 때문에 선택이 아닙니다).

내가 작업했던 가장 멋진 프레임 워크는 IS입니다 Spring-JDBC. 그러나 회사의 정책은 외부 의존성, 특히 Spring, J2EE 등을 피하는 것입니다. 따라서 우리는 기능성과 유사한 스프링 JDBC : 행 매핑, 오류 처리, JAVA5의 지원 기능을 갖춘 자체 편리한 JDBC 프레임 워크를 작성하는 것에 대해 생각하고 있습니다. 그러나 거래 지원이 없습니다.

누구든지 JDBC 래퍼 프레임 워크를 작성한 경험이 있습니까? 다른 JDBC 래퍼 프레임 워크를 사용한 경험이 있다면 경험을 공유하십시오.

미리 감사드립니다.

도움이 되었습니까?

해결책

우리는 우리 자신의 포장지를 썼습니다. 이 주제는 논문에 합당하지만 글을 쓸 시간이있을 것 같아요. 여기 몇 가지 핵심 요점이 있습니다.

  • 우리는 SQL을 받아들이고 그것을 숨기려고 시도하지 않았습니다. 유일한 조정은 명명 된 매개 변수에 대한지지를 추가하는 것이 었습니다. 파라미터는 즉석 SQL을 사용하지 않기 때문에 (보안상의 이유로) 항상 준비된 상태를 사용하기 때문에 중요합니다.

  • 연결 관리를 위해 Apache DBCP를 사용했습니다. 이것은 당시 편리했지만 최신 JDBC 구현에 필요한 것이 얼마나 필요한지는 확실하지 않습니다 (이 물건의 문서는 부족합니다). DBCP는 또한 준비된 상태를 풀어줍니다.

  • 우리는 행 매핑에 신경 쓰지 않았습니다. 대신 (쿼리를 위해) 우리는 Apache dbutil의 결과에 틀러와 유사한 것을 사용했는데,이를 통해 결과를 "피드"로 설정하여 원하는 곳에 정보를 버릴 수 있습니다. 이것은 더 유연하며 실제로 행 매핑을위한 결과에 맨틀러를 구현하기는 어렵지 않습니다. 인서트/업데이트의 경우 일반 레코드 클래스 (기본적으로 추가 종과 휘파람이있는 해시 맵)를 만들었습니다. 행 매핑 (우리를 위해)의 가장 큰 문제는 다른 클래스에 매핑되는 필드가있을 수 있기 때문에 "흥미로운"쿼리를하자마자 갇혀 있다는 것입니다. 계층 적 클래스 구조가있을 수 있지만 평평한 결과 세트가있을 수 있기 때문입니다. 또는 매핑이 복잡하고 데이터에 따라 다르기 때문입니다.

  • 우리는 오류 로깅을 내장했습니다. 예외 처리의 경우 : 쿼리에서 우리는 트랩 및 로그를 작성하지만 업데이트를 위해서는 추적, 로그 및 재검토되지 않은 예외를 재검토합니다.

  • 우리는 래퍼 방식을 사용하여 트랜잭션 지원을 제공했습니다. 발신자는 트랜잭션을 수행하는 코드를 제공하며 트랜잭션을 완료하는 것을 잊지 않고 롤백 및 오류 처리가 내장되어있는 트랜잭션이 올바르게 관리되는지 확인합니다.

  • 나중에, 우리는 단일 업데이트/인서트가 레코드 및 모든 종속성에 적용 할 수있는 매우 단순한 관계 체계를 추가했습니다. 물건을 간단하게 유지하기 위해 쿼리에 이것을 사용하지 않았으며, 캐스케이드 삭제를 사용하는 것이 더 신뢰할 수 있기 때문에 삭제로 이것을 지원하지 않기로 결정했습니다.

이 래퍼는 현재까지 두 프로젝트에서 성공적으로 사용되었습니다. 물론 가볍지 만 요즘 모든 사람들은 코드가 가볍다고 말합니다. 더 중요한 것은 프로그래머 생산성을 증가시키고 버그 수를 줄이고 (문제를 추적하기가 더 쉬워지고) 아름다운 아키텍처를 제공하기 위해 많은 레이어를 추가하는 것을 믿지 않기 때문에 필요한 경우 상대적으로 쉽게 추적하기가 쉽습니다.

다른 팁

Spring-JDBC는 환상적입니다. Spring과 같은 오픈 소스 프로젝트의 경우 외부 의존성의 다운 측면이 최소화된다고 생각하십시오. JDBC 추상화 요구 사항을 충족시키는 가장 안정적인 스프링 버전을 채택 할 수 있으며 외부 당사자에 따라 문제가 발생하지 않으면 소스 코드를 직접 수정할 수 있다는 것을 알고 있습니다. 또한 외부 당사자가 작성한 코드로 조직이 가질 수있는 보안 문제에 대한 구현을 조사 할 수도 있습니다.

내가 선호하는 것 : Dalesbred. MIT 라이센스가 부여되었습니다.

사용자 정의 클래스 (부서)에 대한 모든 행을 얻는 간단한 예.

List<Department> departments = db.findAll(Department.class,
    "select id, name from department");

사용자 정의 클래스가 다음과 같이 정의 된 경우

public final class Department {
    private final int id;
    private final String name;

    public Department(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

면책 조항 : 제가 일하는 회사입니다.

이것은 매우 짧은 시력 결정처럼 들립니다. 이러한 프레임 워크를 개발/유지하는 비용을 고려하십시오. 특히 얻을 수있을 때 소스 코드를 무료로 제공하십시오. 개발을 직접 수행 할 필요가 없을뿐만 아니라 필요한 경우 의지를 수정할 수 있습니다.

즉, 당신이 실제로 복제하는 데 필요한 것은 jdbctemplate의 개념이며 콜백 (preadstatementcreator, preadstatementcallback) 및 RowMapper/RowCallbackHandler입니다. 이와 같은 글을 쓰도록 과도하게 복잡해서는 안됩니다 (특히 거래 관리를 할 필요가 없다는 점을 고려할 때).

내가 말했듯이, 무료로 무료로 얻을 수 있고 소스 코드를 수정할 수있을 때 왜 글을 쓰는가?

노력하다 JdbcSession ~에서 JCabi-JDBC. 예를 들어 jdbc만큼 간단합니다.

String name = new JdbcSession(source)
  .sql("SELECT name FROM foo WHERE id = ?")
  .set(123)
  .select(new SingleOutcome<String>(String.class));

그게 다야.

MJDBC : https://mjdbc.github.io/

나는 그것을 몇 년 동안 사용하고 매우 유용하다는 것을 알았습니다.

JDBI 라이브러리에서 영감을 얻지 못하지만 종속성이 없으며 트랜잭션 지원을 추가하며 성능 카운터를 제공하며 실제로 필요한 경우 Java (Old Plain JDBC API)에서 가능한 최저 SQL 레벨로 쉽게 전환 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top