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