まず 、ObjectDBは商用DBMSであり
物理的な制限:
- 最大128 TVのファイルサイズ
- ファイルあたり最大9,223,372,036,854,775,808個のオブジェクト
- ファイルあたり最大2,147,483,648クラス
気持ちのいいものについて:
主な機能と主な機能:
- 100%純粋なJava
- 標準Java API(JPA 2 / JDO 2)によって管理されます
- 非常に高速( さまざまなベンチマークで1位 )
- クライアントサーバー( SSLを含む )またはプラグ可能なライブラリとして機能します
- 外部依存関係のない単一の.jarファイルとして配信
名前が示すように、ObjectDBはオブジェクトを処理します。つまり、テーブル自体ではなく、Javaオブジェクト全体、データベース内のオブジェクトに対するアクションは、おなじみのCRUD操作によって実行されます。 ストレージに使用できるオブジェクトのタイプの完全なリストは、公式Webサイトで見つけることができます。
仕組み:
ユーザーデータを格納するための非常に単純なデータベースの例として、DBMSの使用を検討してください。
動作させるには、ユーザーを表すクラスとその上で操作を実行するクラスの2つのクラスを作成する必要があります。
クラスuser.java
このクラスはデータベースに保存されます。 package db; import java.io.Serializable; import javax.jdo.annotations.Unique; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class User { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; public User() { } public User(String name, String pass) { this.name = name; this.pass = pass; } public Long getId() { return id; } @Unique private String name; private String pass; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } }
package db; import java.io.Serializable; import javax.jdo.annotations.Unique; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class User { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; public User() { } public User(String name, String pass) { this.name = name; this.pass = pass; } public Long getId() { return id; } @Unique private String name; private String pass; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } }
このクラスは、データベース要素として実際に使用できるようにするいくつかの注釈を除いて、非常によく知られているJava Beanです。
@Entity
@Entityアノテーションは、クラスがデータベース内のデータストレージ要素として使用されることを示します。
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Idアノテーションはid要素を主キーとしてマークし、@ GeneratedValue(strategy = GenerationType.AUTO)はその値を生成する方法を定義します。 GenerationType.AUTOは、キー値が明示的に指定されていない場合、自動的に作成されることも意味します。
@Unique private String name;
アノテーション@Uniqueは、一意の値を持たなければならないフィールドをマークします;このアノテーションでマークされたフィールドの値が以前に記録されたオブジェクトと一致するオブジェクトをデータベースに書き込もうとすると、DBMSは例外をスローします。 したがって、複数のユーザーを同じ名前で登録することはできません。
クラスUserDBAdapter.java
このクラスは、ユーザーデータベースで操作を実行します。 package db; import javax.persistence.*; public class UserDBAdapter { EntityManagerFactory emf; EntityManager em; public UserDBAdapter() { emf = Persistence.createEntityManagerFactory("$objectdb/db/usr.odb"); em = emf.createEntityManager(); } @Override protected void finalize(){ em.close(); emf.close(); } public boolean persistUser(User u) { try { em.getTransaction().begin(); em.persist(u); em.getTransaction().commit(); em.clear(); return true; } catch(PersistenceException e){ System.out.println(e.getMessage()); em.clear(); em.close(); emf.close(); return false; } } public User getUserById(long id) { User u1 = em.find(User.class, id); return u1; } public User getUserByName(String name) { TypedQuery q = em.createQuery("SELECT u FROM User u WHERE u.name = :name", User.class); User u1 = (User) q.setParameter("name", name).getSingleResult(); return u1; } public boolean autentificate(String name, String pass) throws PersistenceException{ TypedQuery q = em.createQuery("SELECT u FROM User u WHERE u.name = :name AND u.pass = :pass", User.class); try { User u1 = (User)q.setParameter("name", name).setParameter("pass", pass).getSingleResult(); return true; } catch(PersistenceException e) { em.clear(); em.close(); emf.close(); throw new PersistenceException("username not found or password is invalid"); } } }
package db; import javax.persistence.*; public class UserDBAdapter { EntityManagerFactory emf; EntityManager em; public UserDBAdapter() { emf = Persistence.createEntityManagerFactory("$objectdb/db/usr.odb"); em = emf.createEntityManager(); } @Override protected void finalize(){ em.close(); emf.close(); } public boolean persistUser(User u) { try { em.getTransaction().begin(); em.persist(u); em.getTransaction().commit(); em.clear(); return true; } catch(PersistenceException e){ System.out.println(e.getMessage()); em.clear(); em.close(); emf.close(); return false; } } public User getUserById(long id) { User u1 = em.find(User.class, id); return u1; } public User getUserByName(String name) { TypedQuery q = em.createQuery("SELECT u FROM User u WHERE u.name = :name", User.class); User u1 = (User) q.setParameter("name", name).getSingleResult(); return u1; } public boolean autentificate(String name, String pass) throws PersistenceException{ TypedQuery q = em.createQuery("SELECT u FROM User u WHERE u.name = :name AND u.pass = :pass", User.class); try { User u1 = (User)q.setParameter("name", name).setParameter("pass", pass).getSingleResult(); return true; } catch(PersistenceException e) { em.clear(); em.close(); emf.close(); throw new PersistenceException("username not found or password is invalid"); } } }
データベースへの接続はクラスコンストラクターで作成されます( データベースファイルが見つからない場合は作成されます )。
public boolean persistUser(User u)
メソッドは、データベースに新しいユーザーを追加するために使用されます。 データベース内のオブジェクトの状態を変更する操作(新しいオブジェクトの追加など
em.getTransaction().begin()
は、
em.getTransaction().begin()
メソッドで
em.getTransaction().commit()
、
em.getTransaction().commit()
メソッドで閉じるトランザクション内で実行する必要があります
em.getTransaction().commit()
オブジェクトが物理的に保存されるときデータベース内 )。
データベースからの読み取り操作など、データベースの状態を変更しないメソッドは、アクティブなトランザクションを必要としません。
データベースからオブジェクトを取得するために、SQLのようなJPQLが使用されています。
public User getUserByName(String name)
および
public boolean autentificate(String name, String pass)
または、EntityManagerクラスの組み込みメソッド
em.find(User.class, id)
など)。これにより、ここでそのプライマリキー(id)によってUserクラスのオブジェクトを検索できます。
これはObjectDBを使用する非常に単純な例であり、そのすべての機能を反映しているわけではありませんが、このDBMSを初めて知っている人には役立つと思います。
詳細情報とチュートリアルは、プロジェクトの公式Webサイトで入手できます。