Accessing Oracle NoSQL Database Using Spring Data Framework
Learn to access Oracle NoSQL Database from Spring using Oracle NoSQL Database SDK for Spring Data.
Using the Spring Data Framework, you can set up a connection with Oracle NoSQL Database nonsecure store, insert a row in a table, and then retrieve the data from the table.
Example 2-1 Accessing NoSQL Database using Spring Data Framework
AppConfigclassStudentclassStudentRepositoryinterfaceAppclass
After that, you will run the Spring application to get the required output. The following steps discuss this in detail.
- Setting up a Maven project:
Set up a Maven project with the required POM file dependencies. For details, see About the Oracle NoSQL Database SDK for Spring Data.
- Setting up an Appconfig class:
Set up the
AppConfigclass that extends theAbstractNosqlConfigurationclass to provide aNosqlDbConfigSpring bean. TheNosqlDbConfigSpring bean describes how to connect to the Oracle NoSQL Database.import oracle.nosql.driver.kv.StoreAccessTokenProvider; import com.oracle.nosql.spring.data.config.AbstractNosqlConfiguration; import com.oracle.nosql.spring.data.config.NosqlDbConfig; import com.oracle.nosql.spring.data.repository.config.EnableNosqlRepositories; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /* The @Configuration annotation specifies that this class can be used by the Spring Data Framework as a source of bean definitions.*/ @Configuration /* annotation to enable NoSQL repositories.*/ @EnableNosqlRepositories public class AppConfig extends AbstractNosqlConfiguration { public static NosqlDbConfig nosqlDBConfig = new NosqlDbConfig("hostname:port", new StoreAccessTokenProvider()); /* The @Bean annotation tells the Spring Data Framework that the returned object must be registered as a bean in the Spring application.*/ @Bean public NosqlDbConfig nosqlDbConfig() { return nosqlDBConfig; } }Note:
See Setting up the Connection section to know more about connecting to an Oracle NoSQL Database secure store. - Defining an entity class:
Create a new package and add the following
Studententity class to persist. This entity class represents a table in the Oracle NoSQL Database and an instance of this entity corresponds to a row in that table.Supply the
@NosqlIdannotation to indicate that theidfield will act as the ID and be the primary key of the underlying storage table andgenerated=trueattribute to specify that this ID will be autogenerated by a sequence.If the ID field type is a String, a UUID will be used. If the ID field type is integer or long, a "GENERATED ALWAYS as IDENTITY (NO CYCLE)" sequence is used.
For details on all the Spring Data classes, methods, interfaces, and examples see SDK for Spring Data API Reference.
import com.oracle.nosql.spring.data.core.mapping.NosqlId; import com.oracle.nosql.spring.data.core.mapping.NosqlTable; /* The @NosqlTable annotation specifies that this class will be mapped to an Oracle NoSQL Database table.*/ @NosqlTable public class Student { /* The @NosqlId annotation specifies that this field will act as the ID field. And the generated=true attribute specifies that this ID will be autogenerated by a sequence.*/ @NosqlId(generated = true) long id; String firstName; String lastName; /* public or package protected constructor required when retrieving from database */ public Student() { } /* This method overrides the toString() method, and then concatenates id, firstname, and lastname, and then returns a String*/ @Override public String toString() { return "Student{" + "id=" + id + ", " + "firstName=" + firstName + ", " + "lastName=" + lastName + '}'; } }When a table is created through the Spring Data application, a schema is created automatically, which includes two columns - the primary key column (types String, integer, long, or timestamp) and a JSON column called
kv_json_.If a table exists already, it must comply with the generated schema.
Note:
- You can set the table level TTL by supplying the
ttl()andttlUnit()parameters in the@NosqlTableannotation of the entity class. For more details, see Setting TTL values. - You can set the default
TableLimitsfor Oracle NoSQL Database Cloud Service tables in the@NosqlDbConfiginstance usingNosqlDbConfig.getDefaultCapacityMode(),NosqlDbConfig.getDefaultStorageGB(),NosqlDbConfig.getDefaultReadUnits(), andNosqlDbConfig.getDefaultWriteUnits()methods. TheTableLimitscan also be specified per table if the@NosqlTableannotation is used, throughcapacityMode,readUnits,writeUnits, andstorageGBfields as shown in the following code sample./* Set the TableLimits and TTL values. */ @NosqlTable(readUnits = 50, writeUnits = 50, storageGB = 25)
- You can set the table level TTL by supplying the
- Declaring a repository that extends NosqlRepository:
Create the following
StudentRepositoryinterface. This interface must extend theNosqlRepositoryinterface and provide the entity class and the data type of the primary key in that class as parameterized types to theNosqlRepositoryinterface. ThisNosqlRepositoryinterface provides methods that can be used to retrieve data from the database.import com.oracle.nosql.spring.data.repository.NosqlRepository; /* The Student is the entity class, and Long is the data type of the primary key in the Student class. This interface implements a derived query findByLastName and returns an iterable instance of the Student class.*/ public interface StudentRepository extends NosqlRepository<Student, Long> { /* The Student table is searched by lastname and returns an iterable instance of the Student class.*/ Iterable<Student> findByLastName(String lastname); } - Creating an application class:
Code the functionality as required by implementing any of the various interfaces provided by the Spring Data Framework. This example uses the
In Spring data applications, the tables are automatically created at the beginning of the application when the entities are initialized unlessCommandLineRunnerinterface to show the application code that implements the run method and has the main method. For more information about setting up a Spring boot application, see Spring Boot.@NosqlTable.autoCreateTableis set tofalse.You can create the application code to insert data to the table, read the rows from the table, and also run the queries as follows:
- Adding and deleting data: Use one of these methods to add rows to the table -
NosqlRepository.save(entity_object),saveAll(Iterable<T> iterable), orNosqlTemplate.insert(entity). To delete any exisiting rows from the table, you can use one of these methods -NosqlRepository.deleteById(),delete(),deleteAll(Iterable<? extends T> entities),deleteAll()or useNosqlTemplate.delete(),deleteAll(),deleteById(),deleteInShard().In the following code sample, you first delete the rows from the
Studenttable using theNosqlRepository.deleteAll()method. This ensures the deletion of all the rows from the table if the table already preexists in the database. You then use theNosqlRepository.save(entity_object)method to add the rows to the table. You create and save two student entities.import com.oracle.nosql.spring.data.core.NosqlTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; /* The @SpringBootApplication annotation helps you to build an application using Spring Data Framework rapidly.*/ @SpringBootApplication public class App implements CommandLineRunner { /* The annotation enables Spring Data Framework to look up the configuration file for a matching bean.*/ @Autowired private StudentRepository repo; public static void main( String[] args ) { ConfigurableApplicationContext ctx = SpringApplication.run(App.class, args); SpringApplication.exit(ctx, () -> 0); ctx.close(); System.exit(0); } @Override public void run(String... args) throws Exception { /* Delete all the existing rows of data, if any, in the Student table.*/ repo.deleteAll(); /* Create a new Student instance and load values into it.*/ Student s1 = new Student(); s1.firstName = "John"; s1.lastName = "Doe"; /* Save the Student instance.*/ repo.save(s1); /* Create a new Student instance and load values into it.*/ Student s2 = new Student(); s2.firstName = "John"; s2.lastName = "Smith"; /* Save the Student instance.*/ repo.save(s2); } }The
@NosqlIdannotation in theStudententity class specifies that theidfield will act as the ID and be the primary key of the underlying storage table. The rest of the entity fields, that is, thefirstNameandlastNamefields are stored in the JSON column. - Reading data: Use one of these methods to read the data from the table -
NosqlRepository.findById(),findAllById(),findAll()or usingNosqlTemplate.find(),findAll(),findAllById().In the following code sample, you use the
NosqlRepository.findAll()method to read all the rows from the table. You select all the rows from theStudenttable and supply them to an iterable instance. Print the values to the output from the iterable object.System.out.println("\nfindAll:"); /* Selects all the rows in the Student table and load it into an iterable instance.*/ Iterable<Student> students = repo.findAll(); /* Print the values to the output from the iterable object.*/ for (Student s : students) { System.out.println(" Student: " + s); } - Using queries: Use one of these methods to run your query - The
NosqlRepositoryderived queries, native queries, or usingNosqlTemplate.runQuery(),runQueryJavaParams(),runQueryNosqlParams().In following code sample, you use the derived queries to select a row from the
Studenttable with the required last name and print the values to the output from the object. For more details on the derived queries, see Derived Queries.System.out.println("\nfindByLastName: Smith"); /* The Student table is searched by lastname and an iterable instance of the Student class is returned.*/ students = repo.findByLastName("Smith"); /* Print the values to the output from the iterable instance.*/ for (Student s : students) { System.out.println(" Student: " + s); }
- Adding and deleting data: Use one of these methods to add rows to the table -
- Running the program: Execute the application code samples from step 5. The Spring Data Framework adds rows to the
Studenttable, searches for all the rows and prints the results to the output. It also fetches an individual row from the table.findAll: Student: Student{id=5, firstName=John, lastName=Doe} Student: Student{id=6, firstName=John, lastName=Smith} findByLastName: Smith Student: Student{id=6, firstName=John, lastName=Smith}
NosqlTemplate.runTableRequest() method.
Note:
While the Oracle NoSQL Database SDK for Spring Data provides an option to modify the tables, it is not recommended to alter the schemas as the Spring Data Framework expects tables to comply with the default schema (two columns - the primary key column of types string, integer, long, or timestamp and a JSON column called kv_json_).