2016-10-26 5 views
1

소개모델이없는 테이블에서 데이터를 가져 오는 방법은 무엇입니까?

내가 프로젝트를 진행하고 있는데 어쩌면 ActiveJDBC이 의미하지 않는 이상 사용 사례를 직면이 프로젝트에 많은 것을 내 통제하지 않기 때문에, 나는 인내 서약 :

나는 10 ~ 15 개의 중소 규모 데이터베이스 (각각 ~ 30 개의 테이블, 최대 40000 개의 레코드)를 가지고 있으며 대부분이 15 개의 테이블로 구성된 "핵심"스키마를 공유하지만 동시에 각 데이터베이스에 대해 고유 한 특정 테이블을 가지고 있습니다. 모두 내가 액세스 할 수없는 레거시 시스템에 의해 유지 관리됩니다.

목표

우리 (나와 일부 conrades)는 "convolunted 데이터웨어 하우스"의 종류의 데이터를 중앙 집중화해야합니다. 불행하게도 더 높은 이유 때문에 ActiveJDBC 이외의 기술은 사용할 수 없으며 그 이외의 모든 기술은 우리가 작성해야합니다 (MongoDB 및/또는 Liquibase로 더 잘 처리 될 수 있음을 알고 있습니다)

우리는 이미 연결을 처리했습니다 데이터베이스 사이에 있으며 프로젝트 자체가 대부분 잘 진행되고 있습니다. 모든 데이터베이스가 공유하는 핵심 스키마를 처리하는 프로그램 부분은 이미 "작동 중"이지만 고유 한 테이블에 문제가 있습니다.

런타임에서 작성된 쿼리의 데이터베이스에서 모든 테이블 이름을 가져옵니다 (선택 사항이 아님). 우리는 바람직

마지막으로 내

가 나는 일반/동적 모델 만들 수 질문 또는 이와 유사한, 즉 런타임에 쿼리에서 데이터를 저장할 수있는 최소 클래스의 수를 유지해야합니까? 뭔가 같은 :

Model a = Base.findall("select * from ?", TableName) 

또는

Model a = Model.fromTable(Tablename) 

나는 모델 방법을 사용하는 것이 이상한 알고 있지만, 우리는 테이블 데이터 그런 식으로 얻을 수 있다면 그것은 순전히 우리의 삶을 단순화하는 것이다.

우리는이 종류의 모델을 주로 사용하여 테이블에서 원시 데이터를 얻고 인터페이스를 만족시키기 때문에 각 테이블 관계에 대해 지금 염려 할 필요가 없습니다.

덕분에 @Edit

사전

에서 :이 멋진 도구를 당신에게 이고르 감사합니다!

우리는 거의 (거의) 해냈습니다! 고맙습니다. 우리는 "핵심 스키마"에 대해 비슷한 접근법을 사용하고 있었지만, 우리는 좀 더 빛을 보였습니다. 내가

을 주석으로 :

우리는 그것이 가능한 것,()은 모델이었다처럼 Base.findall의 결과를 사용할 필요가

?

답변

1

치료를 받고 있습니다. ActiveJDBC에 대한 귀하의 참조에서 이것이 귀하의 선택이 아니라고 느끼고 있습니다 만, 당신은 그 유연성에 놀랄 것입니다. 먼저 MongoDB는 관계 데이터베이스가 아니며 Liquibase는 DB 마이그레이션 시스템입니다. JavaLite는 훨씬 더 간단합니다. DB-Migrator.

지금, 대답의 고기에. 아시다시피, ActiveJDBC는 실제로 스테로이드지도입니다. 이것은 당신이이 작업을 수행 할 수 있다는 것을 의미합니다 :

Person p = new Person(); 
p.fromMap(aMap); 

참조는 방법 Model#fromMap(Map)이 모델 '속성의 이름을만큼 그들은 대응으로지도의 속성을 읽고지도의 값으로 그 값을 덮어 씁니다.

몇 가지 코드를 작성할 수 있습니다 :

예를 들어

,이 테이블 첫 번째 데이터베이스에라는 사람들이며,을의 사용자 "기타"데이터베이스하도록 : 당신이 볼 수 있듯이

create table USERS(first_name VARCHAR(56)); 
create table PEOPLE(firstname VARCHAR(56)); 

의 "

: 이름 "열 다른 이름 그래서

를 모두 데이터베이스/테이블에 존재하지만,이, 사용자의 읽기 및 사람들에 저장하는 코드를 작성할 수 있습니다

// define model 
public class Person extends Model {} 

... 

Base.open(...) // open default database 
DB otherDB = new DB("other_database"); 
otherDB.open(...); // open other database 

// read users from "other" database 
List<Map> users = db.findAll("select first_name \"firstname\" from users"); 

// save people into default database 
for(Map user: users){ 
    Person p = new Person(); 
    p.fromMap(user); 
    p.saveIt; 
} 

Base.close(); 
otherDb.close(); 

이 문제가 해결되기를 바랍니다.

+0

추가 질문 : "where(). limit(). offset()"을 base.findall과 함께 사용할 수 있습니까? 나는 그것들을 쿼리에 직접 전달할 수 있다는 것을 알고 있지만 findAll()이 원시 SQL 쿼리를 취하는 것처럼 결과를 – LouizFC

+1

데이터베이스 내에서 처리하는 것이 가장 좋은 방법이다. db.findAll (" first_name "first_name"을 (를) first_name limit 10 offset 50 ")' – ipolevoy

+1

에 의해 사용자 주문에서 선택하십시오. @LouizFC, 좋은 단어를 주셔서 감사합니다! 다른 질문 : "우리는 Model.findall()의 결과를 사용할 필요가 있을까요?" 'Base # find' 메쏘드의 결과는 맵 또는 맵 목록입니다. 키는 데이터베이스에서 선택한 항목이며 값은 JDBC 드라이버가 데이터베이스와 Java 유형의 매핑에 따라 리턴하는 값입니다. 따라서 Base의 결과는 모델이 아닙니다. 그러나, 내가 보여줬 듯이, 당신은 그 결과를 쉽게 모델로 변환 할 수 있습니다. – ipolevoy

관련 문제