Panduan Objek Objek Java

1. Gambaran keseluruhan

Objek Data Java adalah API yang dirancang untuk mempertahankan data berorientasi objek ke dalam pangkalan data mana pun dan menyediakan bahasa pertanyaan yang ramah pengguna menggunakan sintaks Java.

Dalam artikel ini, kita akan melihat bagaimana menggunakan API JDO untuk mempertahankan objek kita dalam pangkalan data.

2. Ketergantungan dan Penyediaan Maven

Kami akan menggunakan API DataNucleus JDO yang terkini dan menawarkan sokongan penuh untuk JDO 3.2 API.

Mari tambahkan kebergantungan berikut ke fail pom.xml kami :

 org.datanucleus javax.jdo 3.2.0-m6   org.datanucleus datanucleus-core 5.1.0-m2   org.datanucleus datanucleus-api-jdo 5.1.0-m2   org.datanucleus datanucleus-rdbms 5.1.0-m2   org.datanucleus datanucleus-xml 5.0.0-release  

Versi ketergantungan terkini boleh didapati di sini: javax.jdo, datanucleus-core, datanucleus-api-jdo, datanucleus-rdbms dan datanucleus-xml.

3. Model

Kami akan menyimpan data kami dalam pangkalan data, dan sebelum dapat melakukannya, kami perlu membuat kelas yang akan digunakan oleh JDO untuk menyimpan data kami.

Untuk melakukan itu, kita perlu membuat kelas dengan beberapa sifat dan memberi komen dengan @PersistentCapable:

@PersistenceCapable public class Product { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.INCREMENT) long id; String name; Double price = 0.0; // standard constructors, getters, setters }

Kami juga memberi penjelasan mengenai kunci utama kami dan strategi yang dipilih.

Sebaik sahaja kita membuat objek kita, kita perlu menjalankan penambah untuk menghasilkan bytecode yang diperlukan oleh JDO. Dengan menggunakan Maven, kita dapat menjalankan perintah ini:

mvn datanucleus:enhance

Langkah ini wajib dilakukan. Jika tidak, kami mendapat ralat masa kompilasi bahawa kelas tidak dipertingkatkan.

Sudah tentu, boleh dilakukan secara automatik semasa pembuatan Maven:

 org.datanucleus datanucleus-maven-plugin 5.0.2  JDO ${basedir}/datanucleus.properties ${basedir}/log4j.properties true    process-classes  enhance    

Versi terkini plugin boleh didapati di sini: datanucleus-maven-plugin

4. Objek Berterusan

Kami mendapat akses ke pangkalan data menggunakan kilang JDO yang memberi kami pengurus transaksi yang bertugas melakukan transaksi:

PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumd, null); PersistenceManager pm = pmf.getPersistenceManager(); 

Transaksi digunakan untuk membolehkan kemunduran sekiranya berlaku kesalahan:

Transaction tx = pm.currentTransaction();

Kami membuat urus niaga kami dalam blok cubaan / tangkapan :

Product product = new Product("Tablet", 80.0); pm.makePersistent(product);

Pada blok akhirnya , kami menentukan operasi ini harus dilakukan sekiranya berlaku kegagalan.

Sekiranya atas sebab apa pun transaksi tidak dapat diselesaikan, kami membuat pemulangan, dan kami juga menutup sambungan ke pangkalan data dengan pm.close () :

finally { if (tx.isActive()) { tx.rollback(); } pm.close(); }

Untuk menghubungkan program kami ke pangkalan data, kami perlu membuat unit ketekunan pada waktu berjalan untuk menentukan kelas berterusan, jenis pangkalan data, dan parameter sambungan:

PersistenceUnitMetaData pumd = new PersistenceUnitMetaData( "dynamic-unit", "RESOURCE_LOCAL", null); pumd.addClassName("com.baeldung.jdo.Product"); pumd.setExcludeUnlistedClasses(); pumd.addProperty("javax.jdo.option.ConnectionDriverName", "org.h2.Driver"); pumd .addProperty("javax.jdo.option.ConnectionURL", "jdbc:h2:mem:mypersistence"); pumd.addProperty("javax.jdo.option.ConnectionUserName", "sa"); pumd.addProperty("javax.jdo.option.ConnectionPassword", ""); pumd.addProperty("datanucleus.autoCreateSchema", "true");

5. Objek Membaca

Untuk membaca data dari pangkalan data kami di dalam blok transaksi kami, kami membuat pertanyaan. Kemudian, kami menyimpan barang-barang ini ke dalam koleksi Daftar Java , yang akan menyimpan salinan maklumat dalam memori dari penyimpanan berterusan.

Pengurus kegigihan memberi kita akses ke antara muka pertanyaan yang membolehkan kita berinteraksi dengan pangkalan data:

Query q = pm.newQuery( "SELECT FROM " + Product.class.getName() + " WHERE price < 1"); List products = (List) q.execute(); Iterator iter = products.iterator(); while (iter.hasNext()) { Product p = iter.next(); // show the product information } 

6. Mengemas kini Objek

Untuk mengemas kini objek dalam pangkalan data, kita perlu mencari objek yang ingin kita kemas kini menggunakan pertanyaan, kemudian kita mengemas kini hasil pertanyaan dan melakukan transaksi:

Query query = pm.newQuery(Product.class, "name == \"Phone\""); Collection result = (Collection) query.execute(); Product product = (Product) result.iterator().next(); product.setName("Android Phone"); 

7. Memadam Objek

Sama seperti prosedur kemas kini, kami mencari objek terlebih dahulu dan kemudian menghapusnya menggunakan pengurus kegigihan. Dalam situasi tersebut, JDO mengemas kini storan berterusan:

Query query = pm.newQuery(Product.class, "name == \"Android Phone\""); Collection result = (Collection) query.execute(); Product product = (Product) result.iterator().next(); pm.deletePersistent(product); 

8. Pangkalan Data XML

Dengan menggunakan plugin XML, kita dapat menggunakan fail XML untuk mengekalkan data kita.

Kami menentukan ConnectionURL kami yang menunjukkan bahawa itu adalah fail XML dan menentukan nama fail:

pumdXML.addProperty("javax.jdo.option.ConnectionURL", "xml:file:myPersistence.xml");

Datastore XML tidak menyokong harta penambahan automatik, jadi kami perlu membuat kelas lain:

@PersistenceCapable() public class ProductXML { @XmlAttribute private long productNumber = 0; @PrimaryKey private String name = null; private Double price = 0.0; // standard getters and setters

The @XmlAttribute annotation denotes that this will appear in the XML file as an attribute of the element.

Let's create and persist our product:

ProductXML productXML = new ProductXML(0,"Tablet", 80.0); pm.makePersistent(productXML);

We get the product stored in the XML file:

 Tablet 80.0 

8.1. Recover Objects from the XML Datastore

We can recover our objects from the XML file using a query:

Query q = pm.newQuery("SELECT FROM " + ProductXML.class.getName()); List products = (List) q.execute();

And then we use the iterator to interact with each object.

9. JDO Queries

JDOQL is an object-based query language designed to perform queries using Java objects.

9.1. Declarative JDOQL

Using the declarative query, we declare the parameters and set them using Java, this ensures type safety:

Query qDJDOQL = pm.newQuery(Product.class); qDJDOQL.setFilter("name == 'Tablet' && price == price_value"); qDJDOQL.declareParameters("double price_value"); List resultsqDJDOQL = qDJDOQL.setParameters(80.0).executeList();

9.2. SQL

JDO provides a mechanism for executing standard SQL queries:

Query query = pm.newQuery("javax.jdo.query.SQL", "SELECT * FROM PRODUCT"); query.setClass(Product.class); List results = query.executeList();

We use javax.jdo.query.SQL as one parameter for the query object and the second parameter is the SQL itself.

9.3. JPQL

JDO provides a mechanism for executing JPA queries as well. We can use the full syntax of the JPA query language:

Query q = pm.newQuery("JPQL", "SELECT p FROM " + Product.class.getName() + " p WHERE p.name = 'Laptop'"); List results = (List) q.execute();

10. Summary

In this tutorial, we:

  • created a simple CRUD application that uses JDO
  • saved and retrieved our data as XML
  • examined common query mechanisms

As always, you can find the code from the article over on Github.