Presentación de Spring Data JDBC

En el próximo lanzamiento de Spring Data, con nombre en código Lovelace, vamos a incluir un nuevo módulo: Spring Data JDBC .


La idea detrás de Spring Data JDBC es proporcionar acceso a bases de datos relacionales sin utilizar toda la complejidad de JPA .


JPA ofrece características como carga lenta, almacenamiento en caché y seguimiento de cambios (seguimiento sucio). A pesar del hecho de que estas características son muy interesantes, si realmente las necesita, por supuesto, pueden complicar en gran medida la comprensión de la lógica del acceso a los datos.


El mecanismo de carga diferida puede ejecutar repentinamente solicitudes de uso intensivo de recursos, o incluso fallar con una excepción. El almacenamiento en caché puede interponerse en su camino cuando decida comparar dos versiones de una entidad, y junto con los cambios de seguimiento hace que sea más difícil de entender: ¿en qué punto se completarán realmente todas las operaciones de la base de datos?


Spring Data JDBC se enfoca en un modelo mucho más simple . No habrá almacenamiento en caché, seguimiento de cambios o carga diferida. En cambio, las consultas SQL se ejecutarán si y solo si llama al método del repositorio. El resultado devuelto se cargará completamente en la memoria después de ejecutar el método. No habrá mecanismos de "sesión" u objetos proxy para las entidades. Y todo esto debería hacer que Spring Data JDBC sea una herramienta más simple e intuitiva para acceder a los datos.


Por supuesto, un enfoque tan simplificado se traduce en una serie de limitaciones, que discutiremos en las próximas publicaciones. El próximo lanzamiento es la primera versión de la biblioteca, tenemos muchos planes e ideas que queremos implementar, pero tenemos que posponerlos para darle la oportunidad de comenzar a usar Spring Data JDBC lo antes posible.


Ejemplo


Para comenzar, necesitamos definir entidad:


class Customer { @Id Long id; String firstName; LocalDate dob; } 

Tenga en cuenta que no definimos getters ni setters. Por supuesto, puede agregarlos si lo desea. En esencia, el único requisito para una entidad es anotar el campo con una anotación de Id (pero a saber, org.springframework.data.annotation.Id , no javax.persistence one ).

A continuación, debe definir el repositorio. La forma más fácil de hacer esto es extender la interfaz CrudRepository .


 interface CustomerRepository extends CrudRepository<Customer, Long> {} 

Finalmente, debe configurar ApplicationContext para que la implementación de esta interfaz se cree automáticamente:


 @Configuration @EnableJdbcRepositories (1) public class CustomerConfig extends JdbcConfiguration { (2) @Bean NamedParameterJdbcOperations operations() { (3) return new NamedParameterJdbcTemplate(dataSource()); } @Bean PlatformTransactionManager transactionManager() { (4) return new DataSourceTransactionManager(dataSource()); } @Bean DataSource dataSource(){ (5) return new EmbeddedDatabaseBuilder() .generateUniqueName(true) .setType(EmbeddedDatabaseType.HSQL) .addScript("create-customer-schema.sql") .build(); } } 

Analicemos la configuración con más detalle.


  1. EnableJdbcRepositories la creación automática de repositorios. Para que esto funcione, debe proporcionar varios beans adicionales, que requerirán el resto de nuestra clase de configuración.
  2. Porque la clase de configuración extiende JdbcConfiguration , se JdbcConfiguration varios beans al contexto automáticamente. También puede superponerlos si necesita cambiar el comportamiento de Spring Data JDBC. Pero en este ejemplo, dejaremos el comportamiento predeterminado.
  3. Un componente muy importante es NamedParameterJdbcOperations , que se utiliza para realizar consultas en la base de datos.
  4. No se requiere un administrador de transacciones, estrictamente hablando. Pero sin él, no habrá soporte de transacciones, y a pocos les gustará, ¿verdad?
  5. Spring Data JDBC no usa DataSource directamente, pero TransactionManager y NamedParameterJdbcOperation requieren su presencia en el contexto, por lo que determinamos el bean deseado.

Eso es todo lo que se necesita para comenzar con Spring Data JDBC. Ahora escribe una prueba para ver cómo funciona todo:


 @RunWith(SpringRunner.class) @Transactional @ContextConfiguration(classes = CustomerConfig.class) public class CustomerRepositoryTest { @Autowired CustomerRepository customerRepo; @Test public void createSimpleCustomer() { Customer customer = new Customer(); customer.dob = LocalDate.of(1904, 5, 14); customer.firstName = "Albert"; Customer saved = customerRepo.save(customer); assertThat(saved.id).isNotNull(); saved.firstName = "Hans Albert"; customerRepo.save(saved); Optional<Customer> reloaded = customerRepo.findById(saved.id); assertThat(reloaded).isNotEmpty(); assertThat(reloaded.get().firstName).isEqualTo("Hans Albert"); } } 

@Query


Solo con los métodos CRUD estándar puede alejarse del repositorio de la clase CrudRepository . Deliberadamente decidimos posponer la generación automática de consultas, una característica popular de Spring Data, cuando se generan consultas SQL basadas en el nombre del método, para futuras versiones. Y por ahora, simplemente puede usar la familiar anotación @Query para especificar exactamente qué consulta SQL debe ejecutarse.


 @Query("select id, first_name, dob from customer where upper(first_name) like '%' || upper(:name) || '%' ") List<Customer> findByName(@Param("name") String name); 

Si desea modificar o eliminar datos en la solicitud, puede agregar la anotación @Modifying al método.


Escribamos una prueba para ver cómo funciona nuestro nuevo método.


 @Test public void findByName() { Customer customer = new Customer(); customer.dob = LocalDate.of(1904, 5, 14); customer.firstName = "Albert"; Customer saved = customerRepo.save(customer); assertThat(saved.id).isNotNull(); customer.id= null; (1) customer.firstName = "Bertram"; customerRepo.save(customer); customer.id= null; customer.firstName = "Beth"; customerRepo.save(customer); assertThat(customerRepo.findByName("bert")).hasSize(2); (2) } 

  1. Porque Dado que la conexión entre los objetos Java y el registro en la base de datos es solo por el campo Id y el tipo, establecer Id en null y guardar este objeto creará un nuevo registro.
  2. En la solicitud, utilizamos mayúsculas y minúsculas y, por lo tanto, encontramos "Albert" y "Bertram", pero no "Beth".

En conclusión


Por supuesto, se puede decir mucho más sobre Spring Data JDBC, y ciertamente lo contaremos en futuros artículos.


Mientras tanto, puede estudiar el código de muestra , la documentación y, por supuesto, el código fuente . Si tiene alguna pregunta, no dude en hacerla en StackOverflow . Y si encuentra un error o desea solicitar una nueva función, cree un ticket .

Source: https://habr.com/ru/post/es423697/


All Articles