[JAVA] So stellen Sie auf einem virtuellen Server eine Verbindung von Spring zu MySQL her (ungelöst)

Überblick

Ich habe die H2-Datenbank der integrierten Datenbank mit SpringBoot + Thymeleaf + Java verwendet, wurde jedoch angewiesen, MySQL auf den virtuellen Server zu stellen und eine Verbindung herzustellen, sodass ich Schwierigkeiten habe, die Datenbank zu ersetzen. Ich bin seit über einer Woche in einer großen Anzahl von Fehlerprotokollen ausgespuckt und süchtig danach ~~ Immer noch ungelöst ~~, also werde ich mir notieren, was bisher richtig zu sein scheint, um das Memorandum + meine Gedanken zu organisieren. Wenn Sie damit vertraut sind, geben Sie mir bitte einen Rat.

Nachtrag 2019/6/14: Ich habe es geschafft, die Testverbindung erfolgreich zu bestehen. Es ist immer noch sehr ungewiss. Dies funktioniert vorerst, aber wenn Sie einen integrierten Server in der Repository-Klasse und der Entity-Klasse verwenden, müssen Sie anscheinend fast alles neu schreiben, um an dieser Methode zu ändern. Insbesondere Controller wird vernichtet. Kann HTML so verwendet werden, wie es ist?

Erforderliche Klasse (vielleicht)

Name der Klasse                                                                       Erklärung der Hauptfunktion
JSch Erstellen Sie eine Sitzungsinstanz mit SSH-Benutzer, SSH-Kennwort, SSH-Port usw. als Argumenten
Session Stellen Sie eine Verbindung zu einem virtuellen Server her. Instanz ist nicht neu, aber JSch getSession(args)Nach Methode generieren. Abfragen können nur ausgegeben werden, solange diese Verbindung besteht (sollte)
Properties (Möglicherweise) Erweiterung zum Hinzufügen von Einstellungen zu einer Sitzungsinstanz.Es wird im Allgemeinen zum Lesen der Eigenschaftendatei verwendet, und es scheint, dass es nicht nur für die Serverseite oder die Datenbank verwendet wird.
JdbcTemplate Diese Instanz gibt eine SQL-Abfrage aus. Mit anderen Worten, das Ziel ist es, eine Instanz davon vom Controller verwenden zu können

build.gradle Fügen Sie Abhängigkeiten Folgendes hinzu (der ursprüngliche Teil ist in Ordnung) Nach dem Hinzufügen Gradle aktualisieren.

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 ** * Wenn Sie dies in einem Zustand schreiben, in dem es nicht richtig eingestellt ist, wird das Projekt nicht gestartet. Daher ist es schwierig, wenn Sie GitCommit nicht unmittelbar zuvor ausführen. ** ** **

application.properties


	spring.datasource.url=jdbc:mysql://127.0.0.1:3306/In MySQL auf dem virtuellen Server erstellter Datenbankname
	spring.datasource.username=MySQL-Benutzername
	spring.datasource.password=MySQL-Passwort
	spring.datasource.driver-class-name=com.mysql.jdbc.Driver

Erstellen Sie Ihre eigene SSHConnection-Klasse.

Schreiben Sie hier das SSH-Passwort und die Portnummer des virtuellen Servers. Ich denke, die MySQL-Portnummer ist auf 3306 festgelegt. Die SSH-Remote-Portnummer scheint ebenfalls auf 2222 festgelegt zu sein, ist jedoch abhängig von der Kommentarseite 22. Oder es heißt, dass es sicher ist, eine völlig andere Nummer zu verwenden. Wenn Sie Vagrant verwenden, um CentOS unter Bezugnahme auf die Punktinstallation zu installieren, ist Vagrant meiner Meinung nach die Standardeinstellung für den Benutzernamen und das Kennwort. Wenn Sie es jedoch selbst ändern, wird dies der Fall sein. Wenn Sie den Schlüssel authentifizieren möchten, müssen Sie außerdem den auskommentierten Teil einführen, aber er scheint auch dann zu funktionieren, wenn Sie ihn so auskommentieren, wie er ist.

SSHConnection.java



/**
 * @author tabuchikenta
 * 
 */
public class SSHConnection {
	private final static String S_PATH_FILE_PRIVATE_KEY = "/Users/Mac-Benutzername/.ssh/id_rsa"; 
	private final static String S_PATH_FILE_KNOWN_HOSTS = "/Users/Mac-Benutzername/.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); 

	}
}

Anwendungsklasse static void main (String [] args) Möglicherweise müssen Sie nichts tun

Löschen Sie your.pacage und schreiben Sie Ihren eigenen Paketnamen (normalerweise sollte dieser automatisch importiert werden). Wenn Sie sich andere Websites ansehen, ist hier alles gepackt oder Sie tun verschiedene Dinge. Es kann daher empfohlen werden, dies zu tun, aber es hat auch funktioniert, wenn Sie es an anderer Stelle herausgeschnitten haben. Vielleicht schreibe ich keine andere Verarbeitung als das Starten an einem solchen Ort Ich denke es ist besser. Es gibt eine Person, die es in einen Container legt, und es scheint, dass es besser ist, aber vorerst wollte ich den Teil, der nicht mit der Verbindung zu tun zu haben scheint, so weit wie möglich entfernen, also habe ich ihn gelöscht. Es scheint mit der IDE zu funktionieren, die normal ausspuckt. (Entschuldigung, wenn ich falsch liege)

MySQLTestApplication.java


package com.your.package;//Ändern Sie dies nach Ihren Wünschen
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);
        }
    }

Hinzufügung der DAO-Klasse

Als ich die Annotation @Autowired direkt zu privatem JdbcTemplate jdbc; hinzufügte, funktionierte dies nicht mit einer NullPointerException-Ausnahme. Es scheint, dass @Autowired nur in der Anwendungsklasse oder der Controller-Klasse für die JdbcTemplate-Instanz funktioniert (möglicherweise ist es einfach falsch). Daher habe ich beschlossen, es in der Controller-Klasse zu generieren und es als Argument im Konstruktor dieser DAO-Klasse zu empfangen und zu verwenden. Ich probiere es immer noch aus, aber ich denke, es ist in Ordnung, nur eine Instanz dieser Klasse zu haben. Ich denke, es ist besser, das Singleton-Muster zu verwenden, damit es von außen nicht neu wird. Obwohl der Datensatz derzeit so wie er ist der Liste zugewiesen ist, sollten Sie meiner Meinung nach tatsächlich eine Entitätsklasse erstellen und diese Instanz in die Liste aufnehmen.

MyDao.java



package com.your.packages;

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

/*Ist es tatsächlich besser, ein einzelnes Tonnenmuster zu verwenden? ..*/
public class MyDao {

    private JdbcTemplate jdbc;
    
    public MyDao(JdbcTemplate jdbc) {
    	this.jdbc = jdbc;
    	try {
			SSHConnection sshcon = new SSHConnection();//Stellen Sie nun auf dem virtuellen Server eine Verbindung zu MySQL her.
		} catch (Throwable e) {
			e.printStackTrace();
		}
    }
    /*Stellen Sie eine SQL-Abfrage aus und geben Sie einen Datensatz zurück*/
    public List<Map<String,Object>> findAll(){
    	List list = this.jdbc.queryForList("SELECT * FROM M_student");//SQL ausgeben
    	list.forEach(System.out::println);//Um das Protokoll zu überprüfen, können Sie es löschen, wenn Sie den Vorgang überprüfen können.
    	return list;
    }
    	
}

Controller-Klasse erstellen

Zeilen mit Kommentaren ändern die Verarbeitung entsprechend ihrer eigenen Seite.

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();//Nehmen Sie nun den Datensatz heraus
		mav.addObject("msg",recordset.get(0));//In eine HTML-Vorlage gießen.
		
		return mav;
		
	}
}

Erstellen Sie index.html

Das Ergebnis wird in die von addObject oben angegebene Variable "msg" eingefügt. Ändern Sie den Variablennamen usw. gemäß dem obigen Controller.

index.html



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

Recommended Posts

So stellen Sie auf einem virtuellen Server eine Verbindung von Spring zu MySQL her (ungelöst)
02. Ich habe eine API erstellt, um eine Verbindung von Spring Boot zu MySQL (My Batis) herzustellen.
Stellen Sie mit Eclipse eine Verbindung von Java zu MySQL her
Stellen Sie über eine Java-Anwendung eine Verbindung zu Aurora (MySQL) her
Es kann keine Verbindung zum lokalen MySQL-Server über den Fehler "/ tmp / mysql.sock" (2) hergestellt werden
So stellen Sie mit Heroku eine Verbindung zu ClearDB von Sequel Pro her
[Ruby on Rails] Von der MySQL-Konstruktion zum Datenbankwechsel
Versuchen Sie Spring Boot von 0 bis 100.
Stellen Sie eine Verbindung von Java zu PostgreSQL her
Stellen Sie mit Java eine Verbindung zu MySQL 8 her
[Android] Verbindung zu MySQL herstellen (unvollendet)
Es kann keine Verbindung zum lokalen MySQL-Server über den Socket '/ tmp / mysql.sock' (2) hergestellt werden
Bis zur Auflösung kann keine Verbindung zum lokalen MySQL-Server über den Socket '/ var / lib / mysql / mysql.sock' (2) hergestellt werden.
Stoppen Sie das erneute Senden vom Client zum Server
Ändern Sie die Datenbank von SQLite in MySQL
Hinweise zur Migration von CircleCI 1.0 auf 2.0
Rüsten Sie den Federstiefel von der 1.5-Serie auf die 2.0-Serie auf
Stellen Sie mit dem iPhone eine Verbindung zum Rails-Server her
Aktualisieren Sie MySQL mit Docker von 5.7 auf 8.0
[Java] So rufen Sie die von HTML auf der Serverseite übergebenen Parameter ab
FEHLER 2002 (HY000) beim Starten von MySQL: Es kann keine Verbindung zum lokalen MySQL-Server über den Socket '/ tmp / mysql.sock' (2) hergestellt werden.
Zusammenfassung der Sprachen, die von nun an gelernt werden sollen
Kick ShellScript auf dem Server von Java
Die Geschichte des Übergangs von Spring Boot 1.5 zu 2.1
Änderungen bei der Migration von Spring Boot 1.5 auf Spring Boot 2.0
Übergang von Struts2 zu Spring MVC (Controller)
Änderungen bei der Migration von Spring Boot 2.0 zu Spring Boot 2.2
Stellen Sie auf Raspberry Pi eine serielle Verbindung zu Ubuntu her
[Reverse] Spring Security (von Zeit zu Zeit aktualisiert)
Migration von Eclipse zu IntelliJ (unterwegs)
Migrieren Sie von Java zu Server Side Kotlin + Spring-Boot
SSH-Login beim App-Server mit Heroku
Migration von der Eclipse-Serverfunktion (Tomcat) zum Einbetten von Tomcat
Beachten Sie, wie Sie auf Heroku bereitgestelltes MySQL zurücksetzen können
Berühren Sie alle "Anleitungen" des Frühlings (von Zeit zu Zeit aktualisiert)
[Rails MySQL] So setzen Sie die Datenbank auf Heroku zurück
DataSource-Verbindung von WebSphere zu MySQL (Änderung der DataSource-Eigenschaften?)
Minecraft BE Serverentwicklung von PHP nach Java