<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Matheus Guimarães</title>
    <description>The latest articles on DEV Community by Matheus Guimarães (@matheusgamasg).</description>
    <link>https://dev.to/matheusgamasg</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F882259%2Fcebda45f-3d9e-46f6-8277-b072fadd6230.jpeg</url>
      <title>DEV Community: Matheus Guimarães</title>
      <link>https://dev.to/matheusgamasg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matheusgamasg"/>
    <language>en</language>
    <item>
      <title>Spring Data Repositories - Pra que servem e como funcionam por baixo dos panos?</title>
      <dc:creator>Matheus Guimarães</dc:creator>
      <pubDate>Fri, 24 Jun 2022 18:14:59 +0000</pubDate>
      <link>https://dev.to/matheusgamasg/spring-data-repositories-pra-que-servem-e-como-funcionam-por-baixo-dos-panos-1oac</link>
      <guid>https://dev.to/matheusgamasg/spring-data-repositories-pra-que-servem-e-como-funcionam-por-baixo-dos-panos-1oac</guid>
      <description>&lt;p&gt;A manipulação de entidades no Spring é facilitada pela criação de uma interface chamada Repository. Isso facilita muito para o gerenciamento das entidades sem precisar de usar o EntityManager, de forma mais trabalhosa. Embora usemos essa interface usando Spring Data, nem sempre sabemos o que está acontecendo por baixo dos panos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ok, Matheus, mas como que se usa esse tal de Spring Data Repository mesmo?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O objetivo de se usar os repositories do Spring Data é reduzir a quantidade de código necessário para manusear as entidades de forma complexa. Para isso, criamos a interface &lt;strong&gt;repository&lt;/strong&gt; extendendo outra interface como, por exemplo, a &lt;strong&gt;CrudRepository&lt;/strong&gt;. O que essa extensão causa é o provisionamento de alguns métodos para performar um CRUD da entidade no banco de dados, isto é, Criar, Ler, Atualizar e Deletar dados. É possível estender algumas outras interfaces, como a &lt;strong&gt;JpaRepository&lt;/strong&gt; com funcionalidades de listagem e paginação e, ainda, complementar as assinaturas dessas interfaces e usar anotações para a inserção de queries customizadas e coisas afins.&lt;/p&gt;

&lt;p&gt;Um exemplo seria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Repository
public interface Repositorio extends CrudRepository&amp;lt;Pessoa, Integer&amp;gt; {
     Pessoa findByName(@Param("name") String name);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro dos diamantes do CrudRepository há a entidade a ser manipulada e, em seguida, o tipo da Primary Key da entidade.&lt;/p&gt;

&lt;p&gt;A assinatura do método entre as chaves significa um método customizado que desejo que a interface seja capaz de produzir, que foge do escopo do que &lt;strong&gt;CrudRepository&lt;/strong&gt; fornece..&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beleza, entendi, mas como que uma interface é capaz de realizar alguma ação, sendo que ela é só uma assinatura?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;É aí, meu querido, que surge a mágica embaixo dos panos.&lt;/p&gt;

&lt;p&gt;Lembra que é criada uma interface estendendo as interfaces CrudRepository ou JpaRepository? Então, nesse momento o Spring implementa essa interface por baixo dos panos na classe &lt;strong&gt;SimpleJpaRepository&lt;/strong&gt;, que fica responsável por manipular a entidade. Essa classe fornece um conjunto mais complexo do que o EntityManager e é possível encontrar a documentação &lt;a href="https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/support/SimpleJpaRepository.html"&gt;aqui.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Então é só isso que rola embaixo dos panos? Easy.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Não é bem assim, meu jovem. &lt;/p&gt;

&lt;p&gt;Um exemplo de coisas mais aprofundadas a se inteirar seria o proxy, &lt;strong&gt;JdkDynamicAopProxy&lt;/strong&gt;, que em linhas gerais é usado para gerenciar os métodos customizados criados em sua interface de repositório. Caso você use a interface com os métodos CRUD habilitados pela extensão de &lt;strong&gt;CrudRepository&lt;/strong&gt;, o proxy simplesmente te leva até o &lt;strong&gt;SimpleJpaRepository&lt;/strong&gt;. No entanto, se você utilizar os seus métodos customizados, o proxy te redirecionará para as outras estruturas Spring Data para que sua query específica seja alcançada. &lt;/p&gt;

&lt;p&gt;Então, no caso da nossa implementação repositorio, os métodos nativos de &lt;strong&gt;CrudRepository&lt;/strong&gt; seriam redirecionados para o &lt;strong&gt;SimpleJpaRepository&lt;/strong&gt;, enquanto o método &lt;strong&gt;FindByName&lt;/strong&gt; seria redirecionado para outras estruturas de serviço do Spring Data.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>java</category>
      <category>springboot</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
