初めてのActiveObjects
公式ドキュメントのソースの写経です。
利用したライブラリ
- activeobjects-0.8.2.jar
- mysql-connector-java-5.1.13-bin.jar
Person.java
package sample; import java.sql.Types; import net.java.ao.Entity; import net.java.ao.ManyToMany; import net.java.ao.schema.SQLType; public interface Person extends Entity{ public String getName(); public void setName(String name); public int getAge(); public void setAge(int age); public String getEmail(); public void setEmail(String email); @SQLType(Types.CLOB) public String getComment(); @SQLType(Types.CLOB) public void setComment(String comment); public Family getFamily(); public void setFamily(Family family); @ManyToMany(PersonToPerson.class) public Person[] getPeople(); }
Family.java
package sample; import net.java.ao.Entity; import net.java.ao.OneToMany; public interface Family extends Entity{ public String getName(); public void setName(String name); @OneToMany public Person[] getPeople(); }
PersonToPerson.java
package sample; import net.java.ao.Entity; public interface PersonToPerson extends Entity { public Person getPersonA(); public void setPersonA(Person person); public Person getPersonB(); public void setPersonB(Person person); }
Main.java
package sample; import java.sql.SQLException; import net.java.ao.EntityManager; public class Main { public static void main(String[] args) throws SQLException { EntityManager manager = new EntityManager("jdbc:mysql://localhost/sample", "root", "root"); manager.migrate(Person.class); manager.migrate(Family.class); manager.migrate(PersonToPerson.class); Family family = manager.create(Family.class); family.setName("Spiewak"); family.save(); Person me = manager.create(Person.class); me.setName("Daniel Spiewak"); me.setAge(27); me.setComment("I love databasing"); me.setFamily(family); me.save(); Person you = manager.create(Person.class); you.setName("Joe Blow"); you.setAge(23); you.setComment("Guess who?"); you.setFamily(family); you.save(); PersonToPerson relation = manager.create(PersonToPerson.class); relation.setPersonA(me); relation.setPersonB(you); relation.save(); family.getPeople(); // ...returns new Person[] {you, me} you.getPeople(); // ...returns new Person[] {me} /* * SQLを使用する最初の例 */ Family[] families = manager.findWithSQL(Family.class, "familyID", "SELECT DISTINCT familyID FROM person"); // ageが18以上のすべてのpersonを返す。 Person[] overAge = manager.find(Person.class, "age >= ?", 18); /* * 可変長パラメータと、ID値を意識しない、エンティティインスタンスの直接的な使用 */ Person[] inFamilyOver21 = manager.find(Person.class, "age >= ? AND familyID = ?", 21, family); } }
myBatis、Hibernateと違ってxml書かないのはとても楽。SQLも書けるみたいだし。これでいこう。
でもテーブル追加しようとして
Sample.java
package sample; import net.java.ao.Entity; public interface Sample extends Entity{ public String getHoge(); public void setHoge(String hoge); }
これ追加して
Main.javaを
public static void main(String[] args) throws SQLException { EntityManager manager = new EntityManager("jdbc:mysql://localhost/sample", "root", "root"); manager.migrate(Sample.class); Family[] families = manager.findWithSQL(Family.class, "familyID", "SELECT DISTINCT familyID FROM person"); Person[] overAge = manager.find(Person.class, "age >= ?", 18); Person[] inFamilyOver21 = manager.find(Person.class, "age >= ?", 21); for(Person person : inFamilyOver21){ System.out.println(person.getName()); } }
で書き換えて実行したらPerson,Family,PersonToPersonのテーブルが全部消えた。なんでだろう