MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

Introdução ao MariaDB usando Docker, Java Spring e JDBC


Desde que foi forjado do MySQL em 2009, o MariaDB se tornou um dos bancos de dados mais populares para desenvolvedores na última década. Embora muitos tecnólogos provavelmente tenham gravitado para ele como uma solução devido às suas raízes de código aberto e por estar enraizado no mundo dos bancos de dados relacionais, isso realmente apenas começa a arranhar a superfície do que o MariaDB tem a oferecer.

Ao longo dos anos, o MariaDB divergiu do MySQL adicionando muitos recursos e funcionalidades, muitos dos quais não poderemos nos aprofundar no contexto deste artigo. No entanto, uma coisa, acima de tudo, permaneceu a mesma; fornecendo uma solução de banco de dados moderna, de código aberto e de alta qualidade que os desenvolvedores podem usar para impulsionar sua inovação.

Mas antes que você possa mergulhar no MariaDB e conferir tudo o que ele tem a oferecer, você precisará responder às perguntas mais fundamentais; como você começa a usar o MariaDB?

MariaDB e Java Database Connectivity (JDBC)


Provavelmente não é surpresa que o Java e, em última análise, o ambiente Java Virtual Machine (JVM) como um todo, tenha sido uma opção extremamente popular usada pelos desenvolvedores para criar aplicativos.

Com isso em mente, escrevi este breve passo a passo para guiá-lo pelas etapas de introdução ao MariaDB (Community Server) usando uma imagem do Docker, Java e o cliente MariaDB JDBC.

Neste passo a passo, você usará MariaDB e JDBC para criar um aplicativo "To do" simples (baseado em Maven) que, usando Java Spring, irá expor uma variedade de endpoints a serem usados ​​para executar CRUD básico (criar-ler-atualizar-excluir ) operações em uma instância de banco de dados MariaDB.

Vamos começar!

Requisitos


Antes de entrar no código, você precisará certificar-se de ter algumas coisas em sua máquina:
  • Cliente MariaDB
  • Docker
  • Java (v. 8+)
  • Curl (para testar os endpoints da API)

Criando uma nova instância MariaDB usando o Docker


Uma das maneiras mais simples de começar a usar o MariaDB, independentemente do sistema operacional que você está usando, é extrair a imagem do MariaDB Server Docker do Docker Hub e usá-la para criar um novo contêiner.

Para fazer isso, basta abrir uma janela de terminal e executar o seguinte:

$ docker run -p 3306:3306 -d --name mariadb -eMARIADB_ROOT_PASSWORD=Password123! mariadb/server:10.4 

É isso. Agora você deve ter uma instância em execução do MariaDB. Bem indolor, certo?

Você pode confirmar a instância em um contêiner do Docker executando o seguinte:

$ docker ps

E você deve ver seu contêiner na saída.

Conectando-se ao MariaDB


Agora que você tem uma instância do MariaDB Server em execução em um novo contêiner do Docker, a próxima etapa será conectar-se e comunicar-se com a instância do banco de dados usando o cliente MariaDB.

Existem muitos clientes SQL disponíveis à solta. Para simplificar, optei por demonstrar como usar o cliente oficial do MariaDB, mas certamente sinta-se à vontade para usar o cliente que preferir.

Conecte-se à sua instância MariaDB executando o seguinte:

$ mariadb --host 127.0.0.1 -P 3306 --user root -pPassword123!

Você deve ver algo como o seguinte, o que significa que você se conectou com sucesso à instância do MariaDB!



Uma vez conectado, você pode criar um novo banco de dados.

CREATE DATABASE todo;

Em seguida, crie uma nova tabela.

CREATE TABLE todo.tasks (
  id INT(11) unsigned NOT NULL AUTO_INCREMENT,
  description VARCHAR(500) NOT NULL,
  completed BOOLEAN NOT NULL DEFAULT 0,
  PRIMARY KEY (id)
);

Introdução ao Java Spring, JDBC e MariaDB


Com uma instância de banco de dados ativada e o esquema criado, você está pronto para criar um novo aplicativo Java.

Criar um projeto Maven

Comece navegando até https://start.spring.io, que permitirá que você crie um novo projeto Maven baseado em Spring. Para este projeto, você pode inserir os seguintes critérios.



Em seguida, adicione as seguintes dependências:


  • Lombok: Uma biblioteca que eliminará a necessidade de criar código de placa de caldeira (por exemplo, getters, setters) dentro dos objetos de domínio.
  • Spring Web: Uma biblioteca para criar e expor endpoints de API RESTful.
  • JPA de dados Spring: Uma biblioteca que fornece abstrações para ajudar a eliminar o código de placa de caldeira para conexão e comunicação com bancos de dados.

Por fim, clique no botão "GERAR" para criar e baixar o projeto (contido em um arquivo .zip) para um local desejado em sua máquina.

Adicione o conector MariaDB R2DBC

Navegue até o local onde você baixou o novo projeto Maven (arquivo .zip) e descompacte. Em seguida, use um editor de código para abrir o projeto e abra pom.xml.

Adicione uma nova dependência para o conector JDBC do MariaDB à coleção de dependências.

<dependency>             
   <groupId>org.mariadb.jdbc</groupId>           
   <artifactId>mariadb-java-client</artifactId>
   <version>2.6.0</version>
</dependency>

Preparando a integração de dados

Agora que você criou um projeto que contém todas as dependências necessárias, é necessário pular para o código Java. Normalmente, gosto de começar criando as classes de entidade.

Navegue até /src/main/java/com/mariadb/todo , crie uma nova pasta chamada "domain" e crie um novo arquivo dentro dela chamado "Task.java".

Abra "Task.java" e adicione o seguinte código.

package com.mariadb.todo.domain;

import javax.persistence.*;

import lombok.Data;

@Data
@Entity
@Table(name = "tasks")
public class Task {
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String description;
    private Boolean completed = false;
}

Em seguida, crie uma nova pasta chamada "repositórios" em /src/main/java/com/mariadb/todo , e crie um novo arquivo dentro dele chamado "TaskRepository.java".

Abra "TaskRepository.java" e adicione o seguinte código.

package com.mariadb.todo.repositories;

import com.mariadb.todo.domain.Task;

import org.springframework.data.repository.CrudRepository;

public interface TaskRepository extends CrudRepository<Task, Integer> {
}

Como o nome sugere, a interface CrudRepository fornece operações CRUD básicas em um repositório para um tipo genérico (sua classe Task neste caso) e o tipo de chave primária para esse tipo genérico.

Criar um serviço de dados

Os serviços podem ser usados ​​para gerenciar a lógica de negócios do seu aplicativo. O único serviço, TaskService, neste aplicativo é usado para validar um objeto Task e integrar com o TaskRepository.

Crie uma nova pasta chamada "services" em /src/main/java/com/mariadb/todo , e crie um novo arquivo dentro dele chamado "TaskService.java".

Abra "TaskService.java" e adicione o seguinte código.

package com.mariadb.todo.services;

import java.util.Optional;

import com.mariadb.todo.domain.Task;
import com.mariadb.todo.repositories.TaskRepository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

// Registered as a Spring Service (Component)
@Service
public class TaskService {

    // Automatically instantiate (via Spring IoC) 
    @Autowired
    private TaskRepository repository;

    // 
    public Boolean isValid(final Task task) {
        if (task != null && !task.getDescription().isEmpty()) {
            return true;
        }
        return false;
    }

    // Get all records from the tasks table
    public Iterable<Task> getAllTasks() {
        return this.repository.findAll();
    }

    // Save a new task record
    public Task createTask(final Task task) {
        return this.repository.save(task);
    }

    // Update an existing task record
    @Transactional
    public Task updateTask(final Task task) {
        Optional<Task> ot = this.repository.findById(task.getId());
        Task t = ot.get();
        t.setDescription(task.getDescription());
        t.setCompleted(task.getCompleted());
        return this.repository.save(t);
    }

    // Delete the task record by specified id
    @Transactional
    public void deleteTask(final int id){
        Optional<Task> ot = this.repository.findById(id);
        Task t = ot.get();
        this.repository.delete(t);
    }
}

Expor endpoints da API

Por fim, você precisará criar um controlador para expor quatro endpoints que podem ser usados ​​para executar as operações básicas de CRUD em suas tarefas.

Crie uma nova pasta chamada "controllers" em /src/main/java/com/mariadb/todo e crie um novo arquivo dentro dela chamado "TaskController.java".

Abra "TaskController.java" e adicione o seguinte código.

package com.mariadb.todo.controllers;

import com.mariadb.todo.domain.Task;
import com.mariadb.todo.services.TaskService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/tasks")
public class TaskController {

    @Autowired
    private TaskService service;

    // Get all tasks
    @GetMapping()
    public ResponseEntity<Iterable<Task>> get() {
        return ResponseEntity.ok(this.service.getAllTasks());
    }

    // Create a new task
    @PostMapping()
    public ResponseEntity<Task> post(@RequestBody Task task) {
        if (service.isValid(task)) {
            return ResponseEntity.ok(this.service.createTask(task));
        }
        return ResponseEntity.status(HttpStatus.I_AM_A_TEAPOT).build();
    }

    // Update a task
    @PutMapping()
    public ResponseEntity<Task> put(@RequestBody Task task) {
        if (service.isValid(task)) {
            return ResponseEntity.ok(this.service.updateTask(task));
        }
        return ResponseEntity.status(HttpStatus.I_AM_A_TEAPOT).build();
    }

    // Delete a task
    @DeleteMapping()
    public ResponseEntity<Void> delete(@RequestParam int id) {
        if (id > 0) {
            this.service.deleteTask(id);
            return ResponseEntity.ok().build();
        }
        return ResponseEntity.status(HttpStatus.I_AM_A_TEAPOT).build();
    }
}

Teste

Agora que tudo foi construído, é hora de testá-lo!

Primeiro, construa o aplicativo.

$ mvn package

E então execute-o.

$ mvn spring-boot:run

Primeiro, comece adicionando uma nova tarefa à sua lista de tarefas.

$ curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"description":"A New Task"}' \
  http://localhost:8080/api/tasks

Embora você certamente possa consultar o banco de dados diretamente para confirmar que um novo registro de tarefa foi adicionado, onde está a graça nisso? De volta à API!

$ curl https://localhost:8080/api/tasks

Se tudo correr bem, você deverá receber a seguinte resposta JSON:

{ "id": 1, "description": "A New Task", "completed": false }

Voilà, um aplicativo Java Spring totalmente reativo usando JDBC e MariaDB! Para ver este código na íntegra, confira a fonte aqui. E se você está se perguntando "com certeza seria bom ver uma implementação com uma interface de usuário", você está com sorte! Você pode encontrar uma implementação completa de um aplicativo TODO usando React.js e sua escolha de vários projetos de API
(R2DBC, JDBC, Node.js e Python) que se integram diretamente ao MariaDB aqui!

Apenas começando


Agora que você criou com sucesso um novo projeto Maven usando Spring Data JPA, JDBC e MariaDB, você tem todas as ferramentas necessárias para começar a criar aplicativos totalmente reativos, utilizando o poder do MariaDB, de sua preferência! , sugestões ou preocupações com esta postagem do blog, informe-me aqui ou entre em contato diretamente comigo no Twitter em @probablyrealrob!Obrigado por dedicar um tempo para ler isso e boa programação!