MySQL Workbench for Spring Boot Backend

MySQL Workbench, veritabanı tasarımı, geliştirme ve yönetiminde kullanılan ücretsiz bir araçtır. MySQL Workbench’in son sürümünü resmi web sitesinden indirebilirsiniz.

  1. Terminal açın ve aşağıdaki komutları sırasıyla çalıştırarak MySQL Workbench’i yüklemek için gereken paketleri güncelleyin:
sudo apt-get update
sudo apt-get upgrade
  1. MySQL Workbench'i yüklemek için aşağıdaki komutu çalıştırın:
sudo apt-get install mysql-workbench
  1. Yukarıdaki komutu çalıştırdıktan sonra, kurulum işlemi başlayacak ve işlem tamamlandığında MySQL Workbench kurulmuş olacaktır.

Local instance 3306′ tıkladığımızda bize şifre soracaktır:

Başarılı şifre işleminden sonra;

Bu adımları takip ederek, Ubuntu 16.04 üzerinde MySQL Workbench’i yükleyebilirsiniz. Diğer Linux dağıtımlarında farklı kurulum adımları gerekebilir.

İşletim sisteminiz Windows ise, bunları yüklemek için şu adımları izleyebilirsiniz:

  • MySQL Server’ı yükleyin: Yükleyiciye çift tıklayın ve MySQL Server’ı yüklemek için ekrandaki talimatları izleyin. Kurulum sırasında, kök kullanıcı hesabı için bir parola seçmeniz istenecektir.
  • MySQL Workbench’i indirin: MySQL web sitesine (https://dev.mysql.com/downloads/workbench/) gidin ve işletim sisteminiz için MySQL Workbench yükleyicisini indirin.
  • MySQL Workbench’i yükleyin: Yükleyiciye çift tıklayın ve MySQL Workbench’i yüklemek için ekrandaki talimatları izleyin. Kurulum sırasında, ek yazılım paketleri yüklemeniz istenebilir.
  • MySQL Workbench’i yapılandırın: MySQL Workbench yüklendikten sonra, açın ve MySQL Server’a yeni bir bağlantı oluşturmak için “Yeni Bağlantı” düğmesine tıklayın. Gerekli bilgileri girin, bunlar arasında MySQL Server yüklemesi sırasında belirlediğiniz ana bilgisayar adı, kullanıcı adı ve şifre bulunur.
  • MySQL Server’a bağlanın: Bağlantıyı yapılandırdıktan sonra, MySQL Workbench’in MySQL Server’a bağlanabilmesi için “Bağlantıyı Test Et” düğmesine tıklayın. Bağlantı başarılıysa, bağlantıyı kaydetmek için “Tamam” düğmesine tıklayın.
  • MySQL Workbench’i kullanmaya başlayın: Artık MySQL Workbench’i kullanarak MySQL veritabanlarınızı yönetebilir, tablolar ve diğer veritabanı nesneleri oluşturabilir ve SQL sorgularını çalıştırabilirsiniz.

How to Solve MySQL Error: Access denied for user root@localhost

Most MySQL users encountered the ERROR 1698 (28000): Access denied for user ‘root’@’localhost’. This error message usually appears for new installations of MySQL when you try to connect to MySQL with the root user.

This guide will show you how to quickly resolve the access denied for user root on localhost. The outlined instructions apply to both MySQL and MariaDB. There will be no need to modify any tables or to perform complex configuration.

Using Root to Access MySQL

When you install MySQL and try to access it on the local machine with the root user, the command you use is:

mysql -u root -p

Solve Access Denied for User Root Error

To be able to log into MySQL as root, first use sudo to modify the root user:

sudo mysql

This command changes the password for the user root and sets the authentication method to mysql_native_password. This is a traditional method for authentication, and it is not as secure as auth_plugin. In the example above, we set “root” as the password, but we encourage you to set a stronger password.

Test Root User MySQL Access

After you run the commands listed above, exit the MySQL shell by pressing CTRL + D on your keyboard or type exit; and hit enter. There is no need to restart the mysqld service to log in.

Now try again to access MySQL with root. In the terminal, type in:

mysql -u root -p

Reference:

1. https://phoenixnap.com/kb/access-denied-for-user-root-localhost

Spring Boot H2 Gömülü Veritabanı Projesi

Adım 1: Spring Boot Projesi Oluşturma

İlk olarak, Spring Boot projesi oluşturmanız gerekiyor. Bu örnekte, Maven kullanacağız.

  1. VS Code’u açın ve bir proje klasörü oluşturun. Proje klasörünü açmak için File > Open Folder‘ı tıklayın ve bir klasör seçin.
  2. VS Code’un sol kenar çubuğunda, Extensions ikonuna tıklayın ve Spring Boot Extension Pack aramak için arama kutusunu kullanın. Spring Boot Extension Pack eklentisini yükleyin ve kurulumu tamamlayın.
  3. Sol kenar çubuğunda, Explorer bölmesinde, projenizin kök klasörüne sağ tıklayın ve Open in Terminal seçeneğini seçin.
  4. Açılan terminal penceresinde, aşağıdaki komutu yazarak Spring Boot uygulaması için temel yapıyı oluşturun:
spring init --dependencies=web,data-jpa,h2 my-spring-boot-app

Yukarıdaki komut, web, data-jpa ve h2 bağımlılıklarını içeren bir Spring Boot uygulaması oluşturur. my-spring-boot-app, oluşturmak istediğiniz uygulamanın adıdır. Bu adı değiştirebilirsiniz.

  1. Komut çalıştırıldıktan sonra, projenizde birkaç dosya ve klasör oluşacaktır. Bu dosyalar, projenizde Spring Boot uygulamanızı oluşturmanıza yardımcı olacaktır.
  2. Projenizi VS Code’da açın ve src/main/java altındaki com.example.demo paketinde DemoApplication.java adlı bir sınıf oluşturun. Bu sınıf, uygulamanızın giriş noktasıdır.

Adım 2: Veritabanı Bağlantısını Yapılandırma

Şimdi, H2 veritabanına bağlanmak için Spring Boot’u yapılandırmamız gerekiyor. Bu örnekte, application.properties dosyasında yapılandıracağız.

spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.path=/h2-console

Yukarıdaki ayarlar, gömülü H2 veritabanına bağlanmamızı sağlar. spring.h2.console.enabled özelliği, H2 veritabanı konsolunu etkinleştirir. spring.datasource.url özelliği, veritabanı URL’sini belirtir. spring.datasource.driverClassName özelliği, veritabanı sürücüsünü belirtir. spring.jpa.database-platform özelliği, Hibernate tarafından kullanılacak veritabanı platformunu belirtir.

Şekil 1. h2-console Ekranı

CREATE TABLE person (
  id BIGINT NOT NULL AUTO_INCREMENT,
  firstName VARCHAR(255) NOT NULL,
  lastName VARCHAR(255) NOT NULL,
  PRIMARY KEY (id)
);

Şekil 2. h2-console Ekranı-2

Adım 3: Veritabanı Tablosu ve Test Verileri Oluşturma

Şimdi, H2 veritabanında bir tablo oluşturmanız gerekiyor. Bu örnekte, “Person” adlı bir tablo oluşturacağız. Ayrıca, tabloya birkaç test verisi de ekleyeceğiz.

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String

Adım 4: Restful Web Servislerini Ekleme

Şimdi, RESTful web servislerimizi oluşturacağız. Bu örnekte, “Person” adlı bir RESTful web servisi oluşturacağız.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/person")
public class PersonController {
    @Autowired
    private PersonRepository personRepository;

    @PostMapping
    public Person savePerson(@RequestBody Person person) {
        return personRepository.save(person);
    }

    @GetMapping
    public List<Person> getPersons() {
        return personRepository.findAll();
    }

    @GetMapping("/{id}")
    public Optional<Person> getPerson(@PathVariable Long id) {
        return personRepository.findById(id);
    }

    @PutMapping("/{id}")
    public Person updatePerson(@PathVariable Long id, @RequestBody Person person) {
        person.setId(id);
        return personRepository.save(person);
    }

    @DeleteMapping("/{id}")
    public void deletePerson(@PathVariable Long id) {
        personRepository.deleteById(id);
    }
}

Yukarıdaki sınıf, “Person” tablosundaki verilerin alınmasını, ekleme, güncelleme ve silme işlemlerini gerçekleştirmek için kullanılır. “Person” nesnelerinin oluşturulmasını sağlamak için @RequestBody kullanılır. Ayrıca, @GetMapping ve @PostMapping gibi farklı HTTP yöntemlerini kullanarak web servislerimizi tanımlarız.

Adım 5: Veritabanı Erişim Katmanını Oluşturma

Şimdi, veritabanına erişmek için bir erişim katmanı oluşturacağız. Bu örnekte, JPA (Java Persistence API) kullanacağız.

import org.springframework.data.jpa.repository.JpaRepository;

public interface PersonRepository extends JpaRepository<Person, Long> {
}

Yukarıdaki sınıf, “Person” tablosuna erişmek için JpaRepository arayüzünü genişletir. JpaRepository, veritabanına erişmek için bir dizi hazır yöntem sağlar. Bu nedenle, PersonRepository sınıfını manuel olarak bir sorgu oluşturmaya gerek kalmadan, veritabanına erişmek için kullanabilirsiniz.

Adım 6: Uygulamayı Başlatma

Son olarak, uygulamanızı başlatmanız gerekiyor. Bu örnekte, Spring Boot uygulamasını “H2demoApplication” sınıfı ile başlatıyoruz.


	

Spring Boot Developer Tools Kullanımı

Spring Boot Developer Tools, Spring Boot uygulamanızın geliştirme sürecini hızlandırmak ve kolaylaştırmak için bir dizi araç ve özellikler içeren bir kütüphanedir. Bu araçlar arasında otomatik yeniden yükleme, hızlı yeniden başlatma, anlık yenileme, otomatik yeniden yapılandırma vb. yer alır.

Spring Boot Developer Tools’u kullanarak, Spring Boot uygulamanızı anında yeniden yükleyebilirsiniz. Bu sayede, kod değişikliklerinizi kaydettikten hemen sonra uygulamanızı yeniden başlatmanız gerekmez, Spring Boot Developer Tools bunu sizin için otomatik olarak yapar.

Aşağıda, Spring Boot Developer Tools kullanarak hızlı bir şekilde bir “Merhaba Dünya” uygulaması oluşturmak için bir örnek kod bulunmaktadır:

İlk olarak, Spring Boot’u ve Developer Tools’u projenize ekleyin. Bu örnekte, Maven kullanarak projeyi yönetiyoruz.

pom.xml dosyasına aşağıdaki bağımlılıkları ekleyin:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
  </dependency>
</dependencies>

Daha sonra, Spring Boot uygulamanızı oluşturun. Bu örnekte, HelloController adında bir controller sınıfı ve /hello isteğine cevap verecek bir hello metodu kullanıyoruz.

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Merhaba Dünya!";
    }
}

Son olarak, uygulamanızı başlatın ve /hello isteğine bir tarayıcıdan erişin.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

Bu kadar! Şimdi, HelloController sınıfındaki metodu değiştirin ve kaydedin. Spring Boot Developer Tools, uygulamanızı otomatik olarak yeniden yükleyecek ve yeni değişiklikleri görebileceksiniz.

Spring Boot Developer Tools’un sağladığı diğer özellikler arasında, statik içeriği yeniden yüklemek, sabit dosyaları yeniden yüklemek, thymeleaf şablonlarını yeniden yüklemek vb. yer alır. Bu özellikler sayesinde, Spring Boot uygulamanızı hızlı ve kolay bir şekilde geliştirebilirsiniz.

Profile ve Farklı Interface İçeren Spring Boot Örneği

Örneğimizde, DatabaseConfiguration adında bir sınıfımız ve bu sınıfın uygulama için iki farklı profile’ı var: dev ve prod.

DatabaseConfiguration.java

@Configuration
public class DatabaseConfiguration {

    @Value("${database.username}")
    private String username;

    @Value("${database.password}")
    private String password;

    @Value("${database.dev-url}")
    private String devUrl;

    @Value("${database.prod-url}")
    private String prodUrl;

    @Bean
    @Profile("dev")
    public DataSource devDataSource() {
        return new DevDataSource(username, password, devUrl);
    }

    @Bean
    @Profile("prod")
    public DataSource prodDataSource() {
        return new ProdDataSource(username, password, prodUrl);
    }
}

Yukarıdaki kod bloğunda, DatabaseConfiguration adlı bir sınıfımız var ve burada DataSource adlı bir başka sınıfımızı kullanıyoruz. Bu DataSource sınıfı, iki farklı profilde çalışacak şekilde yapılandırılmıştır: dev ve prod.

Ayrıca, @Value anotasyonu kullanarak application.properties dosyasında tanımladığımız veritabanı kullanıcı adı ve şifresini ayarlarız.

application.properties

# Veritabanı ayarları
database.username=myuser
database.password=mypassword

# Uygulama ayarları
spring.profiles.active=dev

Aşağıda, DataSource sınıfımızın arayüzünü gösteren bir örnek kod bloğu bulunmaktadır:

public interface DataSource {
    void connect();
}

DevDataSource.java

public class DevDataSource implements DataSource {
    private String username;
    private String password;
    private String url;

    public DevDataSource(String username, String password, String url) {
        this.username = username;
        this.password = password;
        this.url = url;
    }

    @Override
    public void connect() {
        System.out.println("DevDataSource connected to " + url + " with username " + username + " and password " + password);
    }
}

Bu arayüz, DataSource sınıfımızın uygulama tarafından kullanılacak API’sini tanımlar. connect() metodu burada sadece bir örnek olsun diye eklenmiştir.

Son olarak, DatabaseService adlı bir başka sınıfımız var ve burada DataSource sınıfımızı kullanıyoruz:

@Service
public class DatabaseService {

    private final DataSource dataSource;

    public DatabaseService(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public void connectToDatabase() {
        dataSource.connect();
    }
}

Yukarıdaki sınıfta, DataSource sınıfı constructor’a parametre olarak geçirilir. connectToDatabase() metodu, DataSource sınıfının connect() metodunu çağırarak veritabanına bağlanır.

ProdDataSource.java

public class ProdDataSource implements DataSource {
    private String username;
    private String password;
    private String url;

    public ProdDataSource(String username, String password, String url) {
        this.username = username;
        this.password = password;
        this.url = url;
    }

    @Override
    public void connect() {
        System.out.println("ProdDataSource connected to " + url + " with username " + username + " and password " + password);
    }
}

DatabaseConfiguration.java

@Configuration
public class DatabaseConfiguration {

    @Value("${database.username}")
    private String username;

    @Value("${database.password}")
    private String password;

    @Value("${database.dev-url}")
    private String devUrl;

    @Value("${database.prod-url}")
    private String prodUrl;

    @Bean
    @Profile("dev")
    public DataSource devDataSource() {
        return new DevDataSource(username, password, devUrl);
    }

    @Bean
    @Profile("prod")
    public DataSource prodDataSource() {
        return new ProdDataSource(username, password, prodUrl);
    }
}

Bu örnekte, DatabaseService sınıfı, DataSource arayüzünü kullanarak veritabanına bağlanır. DatabaseConfiguration sınıfı, DataSource sınıfının iki farklı profil için nasıl yapılandırılacağını gösterir. application.properties dosyasında database.username ve database.password özelliklerini ayarlayarak veritabanı kimlik bilgilerini belirleyebilirsiniz.

Application.java

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
        return args -> {
            DataSource dataSource = (DataSource) ctx.getBean("devDataSource");
            dataSource.connect();
        };
    }
}

Yukarıdaki örnekte, DataSource adlı bir arayüz tanımlıyoruz ve DevDataSource ve ProdDataSource sınıfları bu arayüzü uyguluyor. DatabaseConfiguration sınıfı, uygulama iki farklı profil çalıştırdığında hangi veritabanı bağlantısı sınıfını kullanacağını belirler. application.properties dosyasında veritabanı kullanıcı adı, şifre ve iki farklı URL tanımlanır. Son olarak, Application sınıfı, CommandLineRunner arabirimi aracılığıyla DevDataSource nesnesini elde eder ve veritabanına bağlanır.

Spring Boot Port Değiştirmek

pring Boot uygulamasının çalışacağı portu değiştirmek için, application.properties veya application.yml dosyalarını kullanarak yapılandırma dosyasını değiştirebilirsiniz. Bu dosyalar, uygulamanın çalışması için gerekli olan ayarları içerir.

application.properties dosyasını kullanarak, uygulamanın çalışacağı portu aşağıdaki şekilde ayarlayabilirsiniz:

server.port=8081

Bu örnekte, uygulamanın 8081 numaralı bağlantı noktası üzerinde çalışacağı belirtilmiştir. Benzer şekilde, application.yml dosyasını kullanarak aynı ayarlamayı yapabilirsiniz:

server:
  port: 8081

Bu dosya, aynı şekilde uygulamanın 8081 numaralı bağlantı noktası üzerinde çalışacağını belirtir. Ancak, programatik olarak da port ayarlamak mümkündür. Bunu yapmak için, application.properties veya application.yml dosyalarında herhangi bir port numarası belirtmeden, aşağıdaki şekilde SpringApplication sınıfı üzerinden run() metodunu çağırarak uygulama başlatılabilir:

package com.hello.hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class HelloApplication {

	public static void main(String[] args) {
		SpringApplication.run(HelloApplication.class, args);
	}
    @GetMapping("/hello")
    public String hello() {
        return "Merhaba Dünya!";
    }
}

Yukarıdaki örnekte, server.port değeri SpringApplication nesnesine özgü bir özellik olarak ayarlanır. Bu şekilde, uygulama çalıştırıldığında, ayarlanan port numarası kullanılacaktır.

Not: Spring Boot uygulaması, bir web uygulaması olarak tasarlanmışsa, SpringBootServletInitializer sınıfını genişletmek gerekebilir. Bu sınıf, uygulamanın dış dünyaya açık olan HTTP bağlantı noktasını ayarlamak için gereklidir.