[JAVA] Pour se connecter de Spring à MySQL sur un serveur virtuel (non résolu)

Aperçu

J'utilisais la base de données H2 de la base de données intégrée avec SpringBoot + Thymeleaf + Java, mais j'ai été chargé de mettre MySQL sur le serveur virtuel et de le connecter, donc j'ai du mal à remplacer la base de données. J'ai été recraché dans un grand nombre de journaux d'erreurs depuis plus d'une semaine maintenant, et j'y suis accro ~~ Toujours pas résolu ~~, donc afin d'organiser mon mémorandum + mon esprit, je vais noter ce qui semble être correct jusqu'à présent. Si vous connaissez ceci, donnez-moi quelques conseils.

PostScript 2019/6/14: J'ai réussi à réussir la connexion de test. C'est encore très incertain. Cela fonctionne pour le moment, mais si vous utilisez un serveur intégré dans la classe Repository et la classe Entity, il semble que vous devrez réécrire presque tout pour passer à cette méthode. Surtout le contrôleur est anéanti. Le html peut-il être utilisé tel quel?

Classe obligatoire (peut-être)

nom de la classe                                                                       Explication de la fonction principale
JSch Créez une instance de session avec un utilisateur SSH, un mot de passe SSH, un port SSH, etc. comme arguments
Session Connectez-vous à un serveur virtuel. L'instance n'est pas nouvelle mais JSch getSession(args)Générer par méthode. Les requêtes ne peuvent être émises que lorsque cette connexion est active (devrait)
Properties (Peut-être) extension utilisée pour ajouter des paramètres à une instance de Session.Il est généralement utilisé pour lire le fichier de propriétés, et il semble qu'il ne soit pas utilisé uniquement pour le côté serveur ou DB.
JdbcTemplate Cette instance émet une requête SQL. En d'autres termes, l'objectif est de pouvoir utiliser une instance de celui-ci à partir du contrôleur

build.gradle Ajoutez ce qui suit aux dépendances (la partie d'origine est OK) Après l'ajout, actualisez le gradle.

build.gradle


dependencies {
	implementation 'org.springframework.boot:spring-boot-starter'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	compile 'org.springframework.boot:spring-boot-starter'
    compile 'org.springframework.boot:spring-boot-starter-jdbc'
    compile 'mysql:mysql-connector-java:5.1.35'
    compile 'com.jcraft:jsch:0.1.53'
}

application.properties ** * Si vous écrivez ceci dans un état où il n'est pas défini correctement, le projet ne démarrera pas, donc ce sera difficile si vous ne faites pas GitCommit immédiatement avant. ** **

application.properties


	spring.datasource.url=jdbc:mysql://127.0.0.1:3306/Nom de la base de données créé dans MySQL sur le serveur virtuel
	spring.datasource.username=Nom d'utilisateur MySQL
	spring.datasource.password=Mot de passe MySQL
	spring.datasource.driver-class-name=com.mysql.jdbc.Driver

Créez votre propre classe SSHConnection.

Écrivez ici le mot de passe SSH et le numéro de port du serveur virtuel. Je pense que le numéro de port MySQL est fixé à 3306. Le numéro de port distant SSH semble également être fixé à 2222, mais il est à 22 selon le site de commentaires. Ou il dit qu'il est sûr d'utiliser un numéro complètement différent. Si vous utilisez Vagrant pour installer CentOS en vous référant à l'installation dot, je pense que vagrant est la valeur par défaut pour le nom d'utilisateur et le mot de passe, mais si vous le changez vous-même, ce sera le cas. De plus, si vous souhaitez authentifier la clé, vous devez introduire la partie commentée, mais cela semble fonctionner même si vous commentez tel quel.

SSHConnection.java



/**
 * @author tabuchikenta
 * 
 */
public class SSHConnection {
	private final static String S_PATH_FILE_PRIVATE_KEY = "/Users/Nom d'utilisateur Mac/.ssh/id_rsa"; 
	private final static String S_PATH_FILE_KNOWN_HOSTS = "/Users/Nom d'utilisateur Mac/.ssh/known_hosts";
	private final static String S_PASS_PHRASE = "vagrant";
	private final static int LOCAl_PORT = 3306; 
	private final static int REMOTE_PORT = 3306; 
	private final static int SSH_REMOTE_PORT = 2222; 
	private final static String SSH_USER = "vagrant";
	private final static String SSH_REMOTE_SERVER = "127.0.0.1";
	private final static String MYSQL_REMOTE_SERVER = "127.0.0.1";

	private Session session; //represents each ssh session
	
	public void closeSSH ()
	{
	    session.disconnect();
	}

	public SSHConnection () throws Throwable
	{
	    JSch jsch = null;

	        jsch = new JSch();
	       // jsch.setKnownHosts(S_PATH_FILE_KNOWN_HOSTS);
	       // jsch.addIdentity(S_PATH_FILE_PRIVATE_KEY, S_PASS_PHRASE.getBytes());
	       
	        session = jsch.getSession(SSH_USER, SSH_REMOTE_SERVER, SSH_REMOTE_PORT);
	        session.setPassword(S_PASS_PHRASE);
	        final Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
	        session.connect();          
	        session.setPortForwardingL(LOCAl_PORT, MYSQL_REMOTE_SERVER, REMOTE_PORT); 

	}
}

Classe d'application static void main (String [] args) Peut-être que vous n'avez rien à faire

Supprimez your.pacage et écrivez votre propre nom de package (il doit généralement être importé automatiquement). Si vous regardez d'autres sites, tout est emballé ici ou vous faites diverses choses, il peut donc être recommandé de le faire, mais cela a fonctionné même si vous le coupez ailleurs, alors peut-être que je n'écrirai aucun traitement autre que le démarrage dans un tel endroit Je pense que c'est mieux. Il y a une personne qui le met dans un conteneur et il semble que c'est mieux, mais pour le moment je voulais éliminer autant que possible la partie qui semble n'avoir aucun rapport avec la connexion, alors je l'ai supprimée. Il semble fonctionner avec l'IDE crachant normalement. (Excusez-moi si je me trompe)

MySQLTestApplication.java


package com.your.package;//Changez cela pour vous convenir
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

Ajout de la classe DAO

Lorsque j'ai ajouté l'annotation @Autowired directement à JdbcTemplate jdbc; privé, cela ne fonctionnait pas avec une exception NullPointerException. Il semble que @Autowired ne fonctionne que dans la classe Application ou la classe Controller pour l'instance JdbcTemplate (peut-être que c'est tout simplement faux) Par conséquent, j'ai décidé de le générer dans la classe Controller et de le recevoir comme argument dans le constructeur de cette classe DAO et de l'utiliser. Je suis toujours en train de l'essayer, mais je pense que ce n'est pas grave de n'avoir qu'une seule instance de cette classe, donc je pense qu'il est préférable d'utiliser le modèle Singleton pour qu'il ne soit pas nouveau de l'extérieur. De plus, bien que le jeu d'enregistrements soit actuellement attribué à List tel quel, je pense que vous devriez en fait créer une classe Entity et placer cette instance dans List.

MyDao.java



package com.your.packages;

import java.util.List;
import java.util.Map;
import org.springframework.jdbc.core.JdbcTemplate;

/*Est-il vraiment préférable d'utiliser un motif d'une seule tonne? ..*/
public class MyDao {

    private JdbcTemplate jdbc;
    
    public MyDao(JdbcTemplate jdbc) {
    	this.jdbc = jdbc;
    	try {
			SSHConnection sshcon = new SSHConnection();//Connectez-vous maintenant à MySQL sur le serveur virtuel.
		} catch (Throwable e) {
			e.printStackTrace();
		}
    }
    /*Émettre une requête SQL et renvoyer un jeu d'enregistrements*/
    public List<Map<String,Object>> findAll(){
    	List list = this.jdbc.queryForList("SELECT * FROM M_student");//Émettre SQL
    	list.forEach(System.out::println);//Pour vérifier le journal, vous pouvez le supprimer si vous pouvez vérifier l'opération.
    	return list;
    }
    	
}

Créer une classe de contrôleur

Les lignes avec des commentaires changent de traitement en fonction de leur propre page.

MyController.java



package com.kenta.tabuchi.test;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class MyController {

    @Autowired
    private JdbcTemplate jdbc;
    
	@RequestMapping(value= "/",method=RequestMethod.GET)
	public ModelAndView indexGet(ModelAndView mav) {
		mav.setViewName("index");
		MyDao dao = new MyDao(jdbc);
		List<Map<String,Object>> recordset = dao.findAll();//Maintenant, sortez le record
		mav.addObject("msg",recordset.get(0));//Versez dans un modèle HTML.
		
		return mav;
		
	}
}

Créer index.html

Le résultat est versé dans la variable "msg" spécifiée par addObject ci-dessus. Modifiez le nom de la variable, etc. en fonction du contrôleur ci-dessus.

index.html



<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Test MySQL</title>
</head>
<body>
	<p>Hello MySQLTest</p>
	<p th:text="${msg}"></p>
</body>
</html>

Recommended Posts

Pour se connecter de Spring à MySQL sur un serveur virtuel (non résolu)
02. J'ai créé une API pour me connecter de Spring Boot à MySQL (My Batis)
Connectez-vous de Java à MySQL à l'aide d'Eclipse
Connectez-vous à Aurora (MySQL) depuis une application Java
Impossible de se connecter au serveur MySQL local via l'erreur socket '/ tmp / mysql.sock' (2)
Comment se connecter à ClearDB depuis Sequel Pro avec Heroku
[Ruby on Rails] De la construction de MySQL au changement de base de données
Essayez Spring Boot de 0 à 100.
Connectez-vous de Java à PostgreSQL
Connectez-vous à MySQL 8 avec Java
[Android] Connectez-vous à MySQL (non terminé)
Impossible de se connecter au serveur MySQL local via la solution de contournement d'erreur socket '/ tmp / mysql.sock' (2)
Impossible de se connecter au serveur MySQL local via le socket '/ var / lib / mysql / mysql.sock' (2) jusqu'à la résolution.
Arrêter de renvoyer du client au serveur
Changer la base de données de SQLite en MySQL
Remarques sur la migration de CircleCI 1.0 vers 2.0
Mise à niveau de la botte à ressort de la série 1.5 à la série 2.0
Connectez-vous au serveur Rails avec iPhone
Mettre à jour MySQL de 5.7 à 8.0 avec Docker
[Java] Comment récupérer les paramètres passés du html côté serveur
ERREUR 2002 (HY000) lors du démarrage de MySQL: impossible de se connecter au serveur MySQL local via le socket '/ tmp / mysql.sock' (2)
Résumé des langues à apprendre à partir de maintenant
Kick ShellScript sur le serveur depuis Java
L'histoire de la transition de Spring Boot 1.5 à 2.1
Modifications lors de la migration de Spring Boot 1.5 vers Spring Boot 2.0
Transition de Struts2 à Spring MVC (contrôleur)
Modifications lors de la migration de Spring Boot 2.0 vers Spring Boot 2.2
Connectez-vous en série à Ubuntu sur Raspberry Pi
[Inverser] Spring Security (mis à jour de temps en temps)
Migration d'Eclipse vers IntelliJ (en cours)
Migrer de Java vers Kotlin côté serveur + Spring-boot
Connexion SSH au serveur d'applications avec heroku
Migration de la fonction serveur Eclipse (Tomcat) vers Embed Tomcat
Remarquez comment restaurer Mysql déployé sur Heroku
Appuyez sur tous les "Guides" de Spring (mis à jour de temps en temps)
[Rails MySQL] Comment réinitialiser la base de données sur heroku
Connexion DataSource de WebSphere à MySQL (changement de propriété DataSource?)
Développement de serveur Minecraft BE de PHP à Java