public class Person { private String name; private String address; private String ssn; private String email; private String homePhone; private String workPhone; // -- allows us to create a Person via the constructor public Person(String name, String address, String ssn, String email, String homePhone, String workPhone) { this.name = name; this.address = address; this.ssn = ssn; this.email = email; this.homePhone = homePhone; this.workPhone = workPhone; } // -- accessors public String getName() { return name; } public String getAddress() { return address; } public String getSsn() { return ssn; } public String getEmail() { return email; } public String getHomePhone() { return homePhone; } public String getWorkPhone() { return workPhone; } // -- mutators public void setName(String name) { this.name = name; } public void setAddress(String address) { this.address = address; } public void setSsn(String ssn) { this.ssn = ssn; } public void setEmail(String email) { this.email = email; } public void setHomePhone(String homePhone) { this.homePhone = homePhone; } public void setWorkPhone(String workPhone) { this.workPhone = workPhone; } }저장: 저장을 담당할 PersonPersist객체를 만든다
package addressbook; import java.util.*; import javax.jdo.*; import com.prismt.j2ee.connector.jdbc.ManagedConnectionFactoryImpl; public class PersonPersist { private final static int SIZE = 3; private PersistenceManagerFactory pmf = null; private PersistenceManager pm = null; private Transaction transaction = null; // Array of people to persist private Person[] people; // Vector of current object identifiers private Vector id = new Vector(SIZE); public PersonPersist() { try { Properties props = new Properties(); props.setProperty("javax.jdo.PersistenceManagerFactoryClass", "com.prismt.j2ee.jdo.PersistenceManagerFactoryImpl"); pmf = JDOHelper.getPersistenceManagerFactory(props); pmf.setConnectionFactory( createConnectionFactory() ); } catch(Exception ex) { ex.printStackTrace(); System.exit(1); } }Connection Factory는 static 메소드인 CreateConnectionFactory()를 사용하여 얻어낸다. 이 Factory는 JDBC URL, JDBC 드라이버, 사용자이름, 비밀번호가 필요하다. OpenFusion JDO는 사용할 데이터베이스의 드라이버, URL, 사용자 이름, 비밀번호 등 관련 정보를 파일에서 읽어오는 방식도 제공한다.
public static Object createConnectionFactory() { ManagedConnectionFactoryImpl mcfi = new ManagedConnectionFactoryImpl(); Object connectionFactory = null; try { mcfi.setUserName("scott"); mcfi.setPassword("tiger"); mcfi.setConnectionURL( "jdbc:oracle:thin:@localhost:1521:thedb"); mcfi.setDBDriver("oracle.jdbc.driver.OracleDriver"); connectionFactory = mcfi.createConnectionFactory(); } catch(Exception e) { e.printStackTrace(); System.exit(1); } return connectionFactory; }
자바 프로그래밍 실전 테크닉 300 | ||
public void persistPeople() { // create an array of Person"s people = new Person[SIZE]; // create three people people[0] = new Person("Gary Segal", "123 Foobar Lane", "123-123-1234", "gary@segal.com", "(608) 294-0192", "(608) 029-4059"); people[1] = new Person("Michael Owen", "222 Bazza Lane, Liverpool, MN", "111-222-3333", "michael@owen.com", "(720) 111-2222", "(303) 222-3333"); people[2] = new Person("Roy Keane", "222 Trafford Ave, Manchester, MN", "234-235-3830", "roy@keane.com", "(720) 940-9049", "(303) 309-7599)"); // persist the array of people pm = pmf.getPersistenceManager(); transaction = pm.currentTransaction(); pm.makePersistentAll(people); transaction.commit(); // retrieve the object ids for the persisted objects for(int i = 0; i < people.length; i++) { id.add(pm.getObjectId(people[i])); } // close current persistence manager to ensure that // objects are read from the db not the persistence // manager"s memory cache. pm.close(); }Persistence Manager가 호출할 수 있는 몇 가지 메소드들이 있다. 이러한 메소드는 아래와 같이 세 가지로 분류할 수 있다.
객체를 저장하는 메소드
|
저장된 객체를 삭제하는 메소드
|
객체와 저장소간의 연결을 끊는 메소드
|
makePersistent(Object o) | deletePersistent(Object o) | makeTransient(Object o) |
makePersistentAll(Object[] os) | deletePersistentAll(Object[] os) | makeTransientAll(Object[] os) |
makePersistentAll(Collection os) | deletePersistentAll(Collection os) | makeTransientAll(Collection os) |
public void display(int end) { Person person; int max = end <= SIZE ? end : SIZE; // get a new persistence manager pm = pmf.getPersistenceManager(); // retrieve objects from datastore and display for(int i = 0; i < max; i++) { person = (Person) pm.getObjectById(id.elementAt(i), false); System.out.println("Name : " + person.getName()); System.out.println("Address : " + person.getAddress()); System.out.println("SSN : " + person.getSsn()); System.out.println("Email : " + person.getEmail()); System.out.println("Home Phone: " + person.getHomePhone()); System.out.println("Work Phone: " + person.getWorkPhone()); } pm.close(); }단계 4: 저장된 Person 객체의 이름을 변경
public void change() { Person person; // retrieve objects from datastore pm = pmf.getPersistenceManager(); transaction = pm.currentTransaction(); // change DataString field of the second persisted object person = (Person) pm.getObjectById(id.elementAt(1), false); person.setName("Steve Gerrard"); // commit the change and close the persistence manager transaction.commit(); pm.close(); }단계 5: Person 객체의 삭제
public void delete() { // retrieve objects from datastore pm = pmf.getPersistenceManager(); transaction = pm.currentTransaction(); // delete the 2nd persisted object from the datastore and // its id from Vector id. pm.deletePersistent(pm.getObjectById(id.remove(1), false)); // commit the change and close the persistence manager transaction.commit(); pm.close(); }단계 6: main() 메소드에서 이전 단계에서 정의한 메소드를 호출한다.
public static void main(String[] args) { System.out.println("Create PersonPersist"); PersonPersist personPersist = new PersonPersist(); System.out.println("Setup and persist a group of people"); personPersist.persistPeople(); System.out.println("Display the persisted people"); personPersist.display(SIZE); System.out.println("Change a name "); personPersist.change(); personPersist.display(SIZE); System.out.println("Delete a person "); personPersist.delete(); personPersist.display(SIZE - 1); }JDOEnhancer: JDOEnhancer를 위한 JDO Descriptor를 만든다
이것은 어쨌든 간에 우리가 필요한 부분은 충족하고 있으므로 비교적 기본적(간단한) 파일이라고 볼 수 있다. 더욱 복잡한 매핑도 할 수 있는데 더 자세한 사항을 알고 샆더묜 JDO 스팩 Section18 : XML Metadata을 참조하는 것이 좋을 것이다. OpenFusion 예제에서 제공하는 약간 더 복잡한 파일 예제도 있다.
이제 자바 파일과 JDO Descriptor가 완성되었으니, 이것을 사용하여 시스템 구축하는 법을 살펴보자.
% set OPENFUSION_DIR=D:\Apps\OpenFusionJDO % set CLASSPATH=%OPENFUSION_DIR%\lib\connector.jar;%OPENFUSION_DIR%\ lib\jndi.jar;%OPENFUSION_DIR%\lib\log4j.jar;%OPENFUSION_DIR%\l ib\xerces.jar;%OPENFUSION_DIR%\lib\classes12.zip;%OPENFUSION_D IR%\lib\jdo.jar;%OPENFUSION_DIR%\lib\jta- spec1_0_1.jar;%OPENFUSION_DIR%\lib\ofjdo.jar;. % javac -d . Person*.java단계 2 : JDOEnhancer를 실행
java com.prismt.j2ee.jdo.enhancer.JDOEnhancer Mandatory Options: -cp base directory to begin searching for classes to be enhanced. This is not the CLASSPATH, just where our compiled persistent classes are -oc directory to place the enhanced classes -pd JDO descriptor file(s) Optional: -db specific target database [oracle, sybase, etc] -od directory to generate SQL scripts to우리가 작성한 애플리케이션을 위한 JDOEnhancer의 실행 예제는 아래와 같다.
% java com.prismt.j2ee.jdo.enhancer.JDOEnhancer -oc . -pd person.jdo -db oracle -od db -cp .단계 3 : JDOEnhancer에서의 결과를 위한 데이터베이스 설정
CREATE SEQUENCE instid_seq INCREMENT BY 1 ; CREATE TABLE JDO_addressbook_Person_SCO ( inst_id INTEGER NOT NULL, class INTEGER NOT NULL, JDO_address VARCHAR2(255), JDO_email VARCHAR2(255), JDO_homePhone VARCHAR2(255), JDO_name VARCHAR2(255), JDO_ssn VARCHAR2(255), JDO_workPhone VARCHAR2(255) ) ; CREATE TABLE JDO_addressbook_Person ( inst_id INTEGER NOT NULL, class INTEGER NOT NULL, JDO_address VARCHAR2(255), JDO_email VARCHAR2(255), JDO_homePhone VARCHAR2(255), JDO_name VARCHAR2(255), JDO_ssn VARCHAR2(255), JDO_workPhone VARCHAR2(255) ) ; CREATE TABLE prismjdoProp ( name VARCHAR2(255) PRIMARY KEY, value VARCHAR2(255) ) ; CREATE TABLE prismjdoExtents ( class_id NUMBER(38,0) PRIMARY KEY, class_name VARCHAR2(255) UNIQUE, app_key VARCHAR2(255) ) ; ALTER TABLE JDO_addressbook_Person_SCO ADD PRIMARY KEY (inst_id, class) ; ALTER TABLE JDO_addressbook_Person ADD PRIMARY KEY (inst_id, class) ; INSERT INTO prismjdoExtents VALUES(0, "addressbook.Person", "com.prismt.j2ee.jdo.spi.DBKey") ; COMMIT WORK ; INSERT INTO prismjdoProp VALUES("USE.RDBMS.TRIGGERS", "true") ; COMMIT WORK ;단계 4: 애플리케이션의 실행
% java addressbook.PersonPersist프로그램 소스를 복사하여 직접 시도해 보자!
이전 글 : 유닉스에서 find 기능 이용하기
다음 글 : 더욱 개선된 PyKDE2
최신 콘텐츠