From 4a37364497745997ab40fc4f6d8bf48ec4b4bcc4 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Tue, 18 May 2021 19:11:44 +0300 Subject: [PATCH] add Spring Data --- build.gradle | 5 ++ .../ru/dmitriymx/plugin/BanHammerPlugin.java | 3 - .../dmitriymx/plugin/command/BanCommand.java | 13 +++- .../dmitriymx/plugin/config/SpringConfig.java | 53 ++++++++++++++-- .../plugin/entity/BannedUserEntity.java | 60 +++++++++++++++++++ .../repository/BannedUserRepository.java | 13 ++++ .../plugin/service/BannedUserService.java | 25 ++++++++ src/main/resources/config.yml | 8 ++- 8 files changed, 168 insertions(+), 12 deletions(-) create mode 100644 src/main/java/ru/dmitriymx/plugin/entity/BannedUserEntity.java create mode 100644 src/main/java/ru/dmitriymx/plugin/repository/BannedUserRepository.java create mode 100644 src/main/java/ru/dmitriymx/plugin/service/BannedUserService.java diff --git a/build.gradle b/build.gradle index 3467439..5dd1711 100644 --- a/build.gradle +++ b/build.gradle @@ -33,6 +33,11 @@ dependencies { } implementation 'org.springframework:spring-context:5.2.5.RELEASE' + + // compileOnly потому, что в spigot/paper уже есть драйвер для MySQL 5 + compileOnly 'mysql:mysql-connector-java:5.1.48' + implementation 'org.hibernate:hibernate-core:5.4.14.Final' + implementation 'org.springframework.data:spring-data-jpa:2.2.6.RELEASE' } processResources { diff --git a/src/main/java/ru/dmitriymx/plugin/BanHammerPlugin.java b/src/main/java/ru/dmitriymx/plugin/BanHammerPlugin.java index f5b793b..a26a339 100644 --- a/src/main/java/ru/dmitriymx/plugin/BanHammerPlugin.java +++ b/src/main/java/ru/dmitriymx/plugin/BanHammerPlugin.java @@ -19,9 +19,6 @@ public class BanHammerPlugin extends JavaPlugin { ApplicationContext context = createSpringContext(); - //TODO для демонстрации - getLogger().info("dburl: " + context.getBean("databaseUrl", String.class)); - this.getCommand("ban").setExecutor(context.getBean(BanCommand.class)); this.getCommand("unban").setExecutor(context.getBean(UnbanCommand.class)); } diff --git a/src/main/java/ru/dmitriymx/plugin/command/BanCommand.java b/src/main/java/ru/dmitriymx/plugin/command/BanCommand.java index 63092fb..b281a77 100644 --- a/src/main/java/ru/dmitriymx/plugin/command/BanCommand.java +++ b/src/main/java/ru/dmitriymx/plugin/command/BanCommand.java @@ -6,6 +6,7 @@ import org.bukkit.command.CommandSender; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; +import ru.dmitriymx.plugin.service.BannedUserService; import java.util.logging.Logger; @@ -13,16 +14,26 @@ import java.util.logging.Logger; public class BanCommand implements CommandExecutor { private final Logger logger; + private final BannedUserService service; @Autowired @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") - public BanCommand(@Qualifier("bukkitLogger") Logger logger) { + public BanCommand(@Qualifier("bukkitLogger") Logger logger, BannedUserService service) { this.logger = logger; + this.service = service; } @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { logger.info("Call '" + label + "' command"); + + if (args.length == 0) { + return true; + } + + boolean result = service.inBanned(args[0]); + logger.info("Player '" + args[0] + "': " + (result ? "is banned" : "not banned")); + return true; } } diff --git a/src/main/java/ru/dmitriymx/plugin/config/SpringConfig.java b/src/main/java/ru/dmitriymx/plugin/config/SpringConfig.java index eabeedf..ca55a03 100644 --- a/src/main/java/ru/dmitriymx/plugin/config/SpringConfig.java +++ b/src/main/java/ru/dmitriymx/plugin/config/SpringConfig.java @@ -1,12 +1,20 @@ package ru.dmitriymx.plugin.config; +import org.hibernate.jpa.HibernatePersistenceProvider; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; + +import javax.sql.DataSource; +import java.util.Properties; @Configuration -@ComponentScan("ru.dmitriymx.plugin") +@ComponentScan(basePackages = "ru.dmitriymx.plugin") +@EnableJpaRepositories(basePackages = "ru.dmitriymx.plugin.repository") public class SpringConfig { @Value("${database.url}") @@ -18,9 +26,44 @@ public class SpringConfig { @Value("${database.password}") private String databasePassword; - //TODO для демонстрации - @Bean("databaseUrl") - public String getDatabaseUrl() { - return databaseUrl; + @Value("${database.hibernate.show-sql}") + private String showSql; + + @Bean + public DataSource dataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setUrl(databaseUrl); + dataSource.setUsername(databaseUser); + dataSource.setPassword(databasePassword); + + return dataSource; + } + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { + LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); + entityManagerFactoryBean.setDataSource(dataSource); + entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class); + entityManagerFactoryBean.setPackagesToScan("ru.dmitriymx.plugin.entity"); + entityManagerFactoryBean.setJpaProperties(hibernateJpaProperties()); + + return entityManagerFactoryBean; + } + + private Properties hibernateJpaProperties() { + Properties properties = new Properties(); + properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect"); + + // показывать выполняемые SQL в логах + properties.setProperty("hibernate.show_sql", showSql); + + // validate: проверяет соответствие схемы таблиц с имеющимися Entity классами + // update: при необходимости, обновляет схемы таблиц в соответствии с имеющимися Entity классами + // create: создаёт схемы таблиц, уничтожая имеющиеся данные + // create-drop: уничтожает таблицы, если все соединения закрываются; обычно происходит при завершеннии работы приложения + // none: ничего не делать + properties.setProperty("hibernate.hbm2ddl.auto", "update"); + + return properties; } } diff --git a/src/main/java/ru/dmitriymx/plugin/entity/BannedUserEntity.java b/src/main/java/ru/dmitriymx/plugin/entity/BannedUserEntity.java new file mode 100644 index 0000000..3b59162 --- /dev/null +++ b/src/main/java/ru/dmitriymx/plugin/entity/BannedUserEntity.java @@ -0,0 +1,60 @@ +package ru.dmitriymx.plugin.entity; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import java.util.Objects; + +@Entity +@Table(name = "ban_users") +public class BannedUserEntity { + + @Id + private Integer id; + + @Column( + name = "player_name", + unique = true, + nullable = false, + length = 16 + ) + private String playerName; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getPlayerName() { + return playerName; + } + + public void setPlayerName(String playerName) { + this.playerName = playerName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof BannedUserEntity)) return false; + BannedUserEntity that = (BannedUserEntity) o; + return playerName.equals(that.playerName); + } + + @Override + public int hashCode() { + return Objects.hash(playerName); + } + + @Override + public String toString() { + return "BannedUserEntity{" + + "id=" + id + + ", playerName='" + playerName + '\'' + + '}'; + } +} diff --git a/src/main/java/ru/dmitriymx/plugin/repository/BannedUserRepository.java b/src/main/java/ru/dmitriymx/plugin/repository/BannedUserRepository.java new file mode 100644 index 0000000..a3c6880 --- /dev/null +++ b/src/main/java/ru/dmitriymx/plugin/repository/BannedUserRepository.java @@ -0,0 +1,13 @@ +package ru.dmitriymx.plugin.repository; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; +import ru.dmitriymx.plugin.entity.BannedUserEntity; + +import java.util.Optional; + +@Repository +public interface BannedUserRepository extends CrudRepository { + + Optional findByPlayerName(String playerName); +} diff --git a/src/main/java/ru/dmitriymx/plugin/service/BannedUserService.java b/src/main/java/ru/dmitriymx/plugin/service/BannedUserService.java new file mode 100644 index 0000000..5d0fe5c --- /dev/null +++ b/src/main/java/ru/dmitriymx/plugin/service/BannedUserService.java @@ -0,0 +1,25 @@ +package ru.dmitriymx.plugin.service; + +import org.bukkit.entity.Player; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ru.dmitriymx.plugin.repository.BannedUserRepository; + +@Service +public class BannedUserService { + + private final BannedUserRepository repository; + + @Autowired + public BannedUserService(BannedUserRepository repository) { + this.repository = repository; + } + + public boolean inBanned(Player player) { + return inBanned(player.getName()); + } + + public boolean inBanned(String playerName) { + return repository.findByPlayerName(playerName.toLowerCase()).isPresent(); + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index ec03bea..358d5bc 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,4 +1,6 @@ database: - url: some-url - user: some-user - password: some-password + url: jdbc:mysql://localhost:3306/ban_hammer + user: root + password: secret + hibernate: + show-sql: true