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?
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
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);
}
}
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);
}
}
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;
}
}
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;
}
}
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>