Lorsque vous essayez de créer une application qui se connecte à une base de données, cela est souvent gênant en termes de construction d'environnement. Même si vous essayez le mappeur O / R pendant un certain temps, vous pouvez installer le serveur de base de données localement, créer une table et entrer des données. Récemment, il semble qu'il soit possible de créer facilement un environnement en utilisant une technologie de conteneur telle que Docker, mais si vous souhaitez distribuer des exemples d'applications à des fins éducatives, etc., créez l'environnement aussi facilement que possible et exécutez-le dès que possible. Le seuil sera un peu plus élevé.
Si possible, je veux un environnement qui soit facile à distribuer dans une petite capacité et qui puisse être exécuté immédiatement ... ** H2DB ** semble résoudre un tel problème.
H2DB est un RDB léger entièrement composé de Java. Il peut être facilement exécuté uniquement par un accès aux fichiers ou à la mémoire, et est très approprié pour l'éducation et la distribution d'exemples d'application. De plus, comme il a également une fonction serveur, il est possible de se connecter à partir de plusieurs applications (par exemple, vérifier le contenu de la table depuis la console lors de la connexion à la base de données depuis l'application Web).
Il s'agit d'un outil d'aide au développement RDB et a les deux fonctions suivantes.
--Mappeur O / R
Cet article traite principalement du deuxième outil de support de gestion de base de données. En utilisant cela, vous pouvez créer une table et saisir des données en un seul lot. De plus, j'écrirai un petit exemple de code en tant que mappeur O / R.
DBFlute a diverses fonctions, et il y a un moteur dédié pour les exécuter. Par conséquent, lorsque vous utilisez DBFlute pour la première fois, il est nécessaire de télécharger le moteur et de définir l'environnement, mais c'est un outil pour préparer facilement un tel environnement. Il est distribué dans un format jar exécutable et peut être exécuté immédiatement dans n'importe quel environnement Java (https://github.com/dbflute/dbflute-intro/releases).
Après avoir préparé l'environnement d'accès à la base de données, essayez d'utiliser les trois types de mappeurs O / R suivants à titre d'essai.
Cet article utilise les versions suivantes.
Comme c'est un gros problème, je vais commencer par préparer l'environnement de codage et l'environnement d'exécution. Il n'est pas nécessaire que ce soit Eclipse, mais pour vous éviter quelques ennuis, je vais compter sur Pléiades All in One ici. Téléchargez Java Full Edition avec jkd pour Windows ou Mac à partir de http://mergedoc.osdn.jp/.
Créez un projet Spring Boot à partir de https://start.spring.io/. À ce moment-là, ajoutez ce qui suit à la dépendance Spring Boot.
Décompressez le fichier téléchargé dans un emplacement approprié (par exemple sous l'espace de travail si vous utilisez eclipse). sample-dbaccess-h2 ├─ .gitignore ├─ .mvn ├─ HELP.md ├─ mvnw ├─ mvnw.cmd ├─ pom.xml └─ src
Récupérez le fichier jar depuis github. https://github.com/dbflute/dbflute-intro/releases
Placez le fichier téléchargé directement sous le projet Spring que vous avez décompressé précédemment. sample-dbaccess-h2 ├─ .gitignore ├─ .mvn ├─ dbflute-intro.jar ├─ HELP.md ├─ mvnw ├─ mvnw.cmd ├─ pom.xml └─ src
Exécutez le fichier dbflute-intro.jar. Pour plus tard, si le chemin java ne passe pas, transmettez-le.
set PATH=%PATH%;C:\path\to\eclipse_java\11\bin
java -jar dbflute-intro.jar
Une fois exécuté, un serveur local sera lancé en interne et ouvert dans le navigateur.
Saisissez les informations requises et effectuez la configuration initiale. Après avoir terminé la saisie, cliquez sur le bouton "Créer" sur l'écran pour l'exécuter.
Les points suivants doivent être notés lors de la saisie.
En outre, étant donné que DBFlute est utilisé comme exemple en tant que mappeur O / R, cliquez sur "Paramètres du mappeur O / R" sur le côté droit de l'écran pour le préparer pour l'entrée, puis entrez ce qui suit.
Si vous cliquez sur le bouton "Créer" et que l'exécution est réussie, l'écran suivant s'affiche. !!
Il y a plus de fichiers dans le projet. sample-dbaccess ├─ .gitignore ├─ .mvn ├─ dbflute-intro.jar ├─ dbflute_sample_dbaccess_h2 ├─ mydbflute ├─ HELP.md ├─ mvnw ├─ mvnw.cmd ├─ pom.xml └─ src
--mydbflute: moteur DBFlute. En gros, vous ne modifiez pas ici. --dbflute_ * xxx *: ce dossier contient les paramètres DBFlute pour chaque projet. "Xxx" est le "Nom du projet" entré dans la configuration initiale.
Entrez le DDL tel que l'instruction de création de table dans replace-schema.sql dans le dossier DBFlute spécifique au projet "dbflute_sample_dbaccess_h2" créé précédemment.
dbflute_sample_dbaccess_h2/playsql/replace-schema.sql
create table DEPARTMENT (
DEPARTMENT_ID int not null,
DEPARTMENT_NAME varchar(100) not null,
constraint PK_DEPARTMENT primary key(DEPARTMENT_ID),
constraint FK_DEPARTMENT_1 FOREIGN KEY (DEPARTMENT_ID) references DEPARTMENT(DEPARTMENT_ID)
);
create table EMPLOYEE (
EMPLOYEE_ID int not null,
EMPLOYEE_NAME varchar(100) not null,
DEPARTMENT_ID int not null,
constraint PK_EMPLOYEE primary key(EMPLOYEE_ID),
constraint FK_EMPLOYEE_1 FOREIGN KEY (DEPARTMENT_ID) references DEPARTMENT(DEPARTMENT_ID)
);
Cette fois, nous allons créer des données d'enregistrement au format tsv (format de données avec des tabulations comme délimiteurs). Il existe des règles spéciales lors de l'enregistrement des données et une attention particulière doit être portée aux noms de répertoires et de fichiers. Pour plus de détails, reportez-vous à "Enregistrement des données (TSV)".
dbflute_sample_dbaccess_h2/playsql/data/ut/tsv/UTF-8/01-department.tsv
DEPARTMENT_ID DEPARTMENT_NAME
1 département 1
2 département 2
3 département 3
dbflute_sample_dbaccess_h2/playsql/data/ut/tsv/UTF-8/02-employee.tsv
EMPLOYEE_ID EMPLOYEE_NAME DEPARTMENT_ID
11 Employé 11 1
12 salariés 12 1
13 Employés 13 1
21 Employés 21 2
22 Employés 22 2
23 Employés 23 2
31 Employé 31 3
32 salariés 32 3
33 Employé 33 3
Sur l'écran DBFlute Intro, sélectionnez le projet créé et appuyez sur le bouton Remplacer le schéma pour exécuter la création de schéma et la saisie de données.
Vous pouvez également exécuter le fichier manage.bat. Notez que le chemin java est en place.
cd dbflute_sample_dbaccess_h2
manage.bat 0
Le fichier de données pour h2 a augmenté directement sous le projet. Le nom de fichier (\ * .mv.db) créé ici est spécifié par l'URL de connexion entrée dans la configuration initiale de DBFlute Intro. sample-dbaccess-h2 ├─ .gitignore ├─ .mvn ├─ _h2 ├─ h2data.mv.db ├─ dbflute-intro.jar ├─ dbflute_sample_dbaccess_h2 ├─ mydbflute ├─ HELP.md ├─ mvnw ├─ mvnw.cmd ├─ pom.xml └─ src
La génération automatique du code source pour DBFlute n'a pas pu être effectuée à partir de l'écran DBFlute Intro, alors exécutez-la depuis la ligne de commande. Exécutez manage.bat avec l'argument "2: régénérer" (ou vous pouvez l'exécuter sans aucun argument et le saisir plus tard). Voir Manage Tasks pour plus d'informations.
cd dbflute_sample_dbaccess
manage.bat 2
En cas de succès, le code généré automatiquement sera sorti sous le package entré dans 4. Configuration initiale de DBFlute Engine.
Ajoutez des paramètres pour utiliser le mappeur O / R sur Spring.
Modifiez d'abord pom.xml. Ajustez la version Java pour ajouter des dépendances DBFlute.
pom.xml
<properties>
<java.version>1.11</java.version>
</properties>
<!--Omission-->
<dependencies>
<!--Ajouter à diverses dépendances existantes-->
<dependency>
<groupId>org.dbflute</groupId>
<artifactId>dbflute-runtime</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
src/main/resources/application.yml
#Informations de connexion à la base de données commune
spring:
datasource:
url: jdbc:h2:file:./_h2/h2data
username: sa
driverClassName: org.h2.Driver
#Paramètres de My Batis. lower_Mappez le nom de la colonne de cas à la propriété camelCase
mybatis:
configuration:
mapUnderscoreToCamelCase: true
La chaîne de connexion pour h2 est «h2: fichier: chemin du fichier». Ici, pour le chemin du fichier, spécifiez le chemin relatif depuis le répertoire de base lors de l'exécution de java (lors de l'exécution depuis eclipse, directement sous le projet) ou le chemin absolu.
Si vous définissez ʻurl: jdbc: h2: file: _h2 / h2data au lieu de ʻurl: jdbc: h2: file: ./_h2 / h2data
dans le paramètre de chemin de fichier de h2, l'erreur suivante se produira à l'exécution.
URL de base de données avec chemin de fichier relatif à partir du répertoire courant implicite("jdbc:h2:file:_h2/h2data")Il n'est pas permis de spécifier dans. Chemin absolu ou relatif à la place( ~/name, ./name)Ou spécifiez baseDir.
A file path that is implicitly relative to the current working directory is not allowed in the database URL "jdbc:h2:file:_h2/h2data". Use an absolute path, ~/name, ./name, or the baseDir setting instead. [90011-199]
Si vous utilisez un chemin relatif, il semble que vous deviez écrire explicitement le chemin en commençant par le .
actuel.
Sélectionnez un projet et essayez "Maven> Mettre à jour le projet".
Ajoutez le fichier suivant et démarrez facilement Spring à partir de la ligne de commande.
SampleDbaccessH2Application.java
@SpringBootApplication
public class SampleDbaccessH2DBFluteApplication {
@Autowired
EmployeeBhv employeeBhv;
public static void main(String[] args) {
try (ConfigurableApplicationContext ctx = SpringApplication.run(SampleDbaccessH2DBFluteApplication.class, args)) {
SampleDbaccessH2DBFluteApplication app = ctx.getBean(SampleDbaccessH2DBFluteApplication.class);
app.run(args);
}
}
private void run(String... args) {
System.out.println("Commencer le traitement");
employeeBhv.selectList(cb -> {
cb.setupSelect_Department();
cb.query().setDepartmentId_Equal(2);
}).forEach(employee -> {
System.out.println(
String.format(
"employeeName: %s, departmentName: %s",
employee.getEmployeeName(),
employee.getDepartment().get().getDepartmentName()));
});
//Traitement des applications
System.out.println("Sortie de traitement");
}
}
SampleDbaccessH2MyBatisApplication.java
@SpringBootApplication
public class SampleDbaccessH2MyBatisApplication {
@Autowired
EmployeeMapper employeeMapper;
public static void main(String[] args) {
try (ConfigurableApplicationContext ctx = SpringApplication.run(SampleDbaccessH2MyBatisApplication.class, args)) {
SampleDbaccessH2MyBatisApplication app = ctx.getBean(SampleDbaccessH2MyBatisApplication.class);
app.run(args);
}
}
private void run(String... args) {
System.out.println("Commencer le traitement");
employeeMapper.findEmployeeList(2).forEach(employee -> {
if (employee != null) {
System.out.println(
String.format(
"employeeName: %s, departmentName: %s",
employee.getEmployeeName(),
employee.getDepartmentName()));
} else {
System.out.println("employee is null");
}
});
//Traitement des applications
System.out.println("Sortie de traitement");
}
}
EmployeeMapper.java
@Mapper
public interface EmployeeMapper {
@Select({ "select emp.EMPLOYEE_NAME as EMPLOYEENAME, dept.DEPARTMENT_NAME",
"from EMPLOYEE emp",
"inner join DEPARTMENT dept on dept.DEPARTMENT_ID = emp.DEPARTMENT_ID",
"where emp.DEPARTMENT_ID = #{departmentId}", })
List<Employee> findEmployeeList(int departmentId);
}
Employee.java
public class Employee {
private String employeeName;
private String departmentName;
// getter, setter
}
SampleDbaccessH2JDBCApplication.java
@SpringBootApplication
public class SampleDbaccessH2JDBCApplication {
@Autowired
JdbcTemplate jdbcTemplate;
public static void main(String[] args) {
try (ConfigurableApplicationContext ctx = SpringApplication.run(SampleDbaccessH2JDBCApplication.class, args)) {
SampleDbaccessH2JDBCApplication app = ctx.getBean(SampleDbaccessH2JDBCApplication.class);
app.run(args);
}
}
private void run(String... args) {
System.out.println("Commencer le traitement");
findEmployeeList(2).forEach(map -> {
System.out.println(
String.format(
"employeeName: %s, departmentName: %s",
map.get("EMPLOYEE_NAME"),
map.get("DEPARTMENT_NAME")));
});
System.out.println("Sortie de traitement");
}
private List<Map<String, Object>> findEmployeeList(int departmentId) {
return jdbcTemplate.queryForList(String.join("", new String[] {
"select emp.EMPLOYEE_NAME, dept.DEPARTMENT_NAME",
" from EMPLOYEE emp",
" inner join DEPARTMENT dept on dept.DEPARTMENT_ID = emp.DEPARTMENT_ID",
" where emp.DEPARTMENT_ID = ?"
}), departmentId);
}
}
Après tout, je pensais que l'article créé par copier-coller était facile. Lors de l'écriture du code source, vous devez copier et coller et viser DRY ...
S'il y a un changement d'ajout de table, modifiez replace-schema.sql et les données d'enregistrement, exécutez manage.bat, la table existante sera supprimée et régénérée, et la migration est possible dans l'environnement de développement. En outre, DBFlute a d'excellentes fonctions en tant qu'outil de migration, comme un outil de comparaison des différences de schéma (Référence: "[20160521 Derrière le renouvellement complet du service de distribution vidéo à grande échelle avec Java 8](https: //www.slideshare) .net / SuguruAkiho / 20160521-jjug-cccunext) ". Même si vous ne pouvez pas l'introduire en tant que mappeur O / R, veuillez envisager de l'introduire en tant qu'outil de support de gestion de base de données.
Si vous souhaitez accéder à la base de données à partir de plusieurs applications en même temps, il n'est pas possible de se connecter avec file: ...
en raison de restrictions.
Plusieurs accès simultanés peuvent se produire non seulement dans un environnement de production, mais également dans un environnement de développement local.
Par exemple, lorsque vous souhaitez mettre à jour le schéma avec DBFlute pendant que l'application Web est en cours d'exécution.
Pour ce faire, vous devez utiliser la fonction serveur.
La procédure de démarrage du serveur est brièvement décrite ci-dessous.
Téléchargez toutes les plates-formes à partir du Site Honke.
Décompressez le fichier zip téléchargé et déplacez les fichiers requis vers votre projet. Puisque seul le runtime est requis, déplacez les fichiers suivants de sous bin vers le répertoire pour h2.
La structure du projet est la suivante.
sample-dbaccess-h2 ├─ .gitignore ├─.mvn ├─ _h2 ├─ h2data.mv.db ├─ h2data.trace.db ├─ h2.bat ├─ h2-1.4.199.jar ├─ dbflute-intro.jar ├─ dbflute_sample_dbaccess_h2 ├─ mydbflute ├─ HELP.md ├─ mvnw ├─ mvnw.cmd ├─ pom.xml └─ src
Cd sous le même répertoire que le script de démarrage que vous avez déplacé ci-dessus et exécutez le script de démarrage. Notez que le chemin Java doit être de la même manière que l'exécution de DBFlute Intro. Le navigateur démarre et l'écran passe à l'écran de connexion de la console h2.
Vous n'avez pas besoin de vous connecter à la console, mais ici nous essaierons de vérifier l'entrée de données de la console. Entrez les informations suivantes pour vous connecter à la console.
Lorsque vous vous connectez, vous pouvez confirmer que la table a été créée et que les données ont été saisies.
Modifiez la chaîne de connexion comme suit:
url: jdbc:h2:tcp://localhost/./h2data
src/main/resources/application.yml
spring:
datasource:
url: jdbc:h2:tcp://localhost/./h2data
#Omission
dbflute_sample_dbaccess_h2/dfprop/databaseInfoMap.dfprop
#Omission
; url: jdbc:h2:tcp://localhost/./h2data
#Omission
Pour la même raison que celle déjà mentionnée, il ne peut pas être ʻurl: jdbc: h2: tcp: // localhost / h2data. Doit être un chemin explicitement relatif
. / H2data au lieu de
h2data`.
Bien que cela n'ait pas été vérifié, il semble qu'il soit possible de définir les paramètres (port, etc.) lors du démarrage du serveur. http://www.h2database.com/html/tutorial.html#console_settings
Le fichier (h2data.mv.db dans l'exemple ci-dessus) n'est pas terminé. Lorsque j'ai démarré le serveur sur H2 au premier accès et effectué le remplacement du schéma à partir de DBFlute, une erreur s'est produite.
Database "/path/to/h2/h2data" not found, and IFEXISTS=true, so we cant auto-create it [90146-197]
J'ai reçu un message d'erreur disant que si j'ajoute ʻIFEXISTS = true à l'option de connexion, il ne peut pas être créé automatiquement, donc j'ai essayé de définir ʻIFEXISTS = false
, mais cela n'a pas fonctionné.
Pour le moment, la première fois, je l'évite par la méthode suivante.
--Accès avec file:
au lieu de tcp:
.
--Initialiser à partir de H2 Management Console