J'ai essayé d'utiliser Mirage-SQL comme cadre d'accès aux données dans les applications Java, je vais donc vous présenter l'utilisation de base.
pom.xml
<dependency>
<groupId>jp.sf.amateras.mirage</groupId>
<artifactId>mirage</artifactId>
<version>***</version>
</dependency>
Ajoutez également un référentiel.
pom.xml
<repository>
<id>amateras</id>
<name>amateras</name>
<url>http://amateras.sourceforge.jp/mvn</url>
</repository>
Placez le fichier jdbc.properties
à la racine du chemin de classe.
jdbc.properties
jdbc.driver=Classe de pilote
jdbc.url=URL
jdbc.user=Nom d'utilisateur
jdbc.password=mot de passe
Placez le fichier .sql
à la racine du chemin de classe.
test.sql
SELECT *
FROM staff
/*BEGIN*/
WHERE
/*IF username != null */
staffname = /*staffname*/'testuser'
/*END*/
/*IF staffstatus != null */
AND staffstatus = /*status*/1
/*END*/
/*END*/
Il y a des commentaires significatifs entre les deux. Cette instruction de commentaire et la valeur après le commentaire seront remplacées par des espaces réservés lors de la génération de l'instruction préparée.
Étant donné que la variable de liaison est écrite en tant que commentaire de SQL et que la valeur de test est écrite immédiatement après cela, ce SQL peut être exécuté tel quel avec l'outil de gestion de base de données ou la ligne de commande. C'est "2Way SQL".
Généralement, lors de l'exploitation d'une base de données à partir d'une application, je pense que SQL est stocké dans une variable de type chaîne et exécuté, mais Mirage-SQL peut être utilisé pour séparer complètement SQL du code source Java. Par conséquent, vous pouvez éviter la situation où «SQL ne peut pas être confirmé tant qu'il n'est pas exécuté». Puisque l'instruction SQL n'est pas assemblée dynamiquement, c'est également une contre-mesure contre l'injection SQL.
C'est une bonne idée de penser à / * BEGIN * / ~ / * END * /
comme quelque chose qui s'ajuste pour ne pas causer d'erreur de syntaxe.
(Voir github wiki pour plus d'informations)
Staff
import jp.sf.amateras.mirage.annotation.Column;
import jp.sf.amateras.mirage.annotation.Table;
@Table(name = "staff")//Peut être omis si le nom de la classe et le nom de la table sont identiques
public class Staff implements Serializable {
@Column(name = "staffname")//Peut être omis si le nom de la colonne et le nom du champ sont identiques
private String staffname ;
@Column(name = "staffstatus ")
private int staffstatus ;
//Ci-dessous, méthode d'accesseur
public void setStaffname (String staffname) {
this.staffname= staffname;
}
public String getStaffname () {
return staffname;
}
public void setStaffstatus (int staffstatus ) {
this.staffstatus = staffstatus ;
}
public int getStaffstatus () {
return staffstatus ;
}
}
Main
Session session = SessionFactory.getSession();
SqlManager sqlManager = session.getSqlManager();
session.begin();
try {
Map<String, Object> params = new HashMap<>();
params.put("status", 0);
SqlResource selectUserSql = new ClasspathSqlResource("test.sql");
List<Staff> results = sqlManager.getResultList(Staff.class, selectUserSql, params);
for (Staff result : results ) {
System.out.println(result.getStaffname());
}
session.commit();
} catch (Exception ex) {
session.rollback();
} finally {
session.release();
}
J'ai utilisé Map comme valeur à transmettre à la variable de liaison, mais une classe portant le même nom que la variable de liaison convient.
Recommended Posts