Ich habe versucht, Mirage-SQL als Framework für den Datenzugriff in Java-Anwendungen zu verwenden, daher werde ich die grundlegende Verwendung vorstellen.
pom.xml
<dependency>
<groupId>jp.sf.amateras.mirage</groupId>
<artifactId>mirage</artifactId>
<version>***</version>
</dependency>
Fügen Sie auch ein Repository hinzu.
pom.xml
<repository>
<id>amateras</id>
<name>amateras</name>
<url>http://amateras.sourceforge.jp/mvn</url>
</repository>
Platzieren Sie die Datei "jdbc.properties" im Stammverzeichnis des Klassenpfads.
jdbc.properties
jdbc.driver=Fahrerklasse
jdbc.url=URL
jdbc.user=Nutzername
jdbc.password=Passwort
Platzieren Sie die .sql-Datei im Stammverzeichnis des Klassenpfads.
test.sql
SELECT *
FROM staff
/*BEGIN*/
WHERE
/*IF username != null */
staffname = /*staffname*/'testuser'
/*END*/
/*IF staffstatus != null */
AND staffstatus = /*status*/1
/*END*/
/*END*/
Dazwischen gibt es aussagekräftige Kommentare. Diese Kommentaranweisung und der Wert nach dem Kommentar werden beim Generieren der vorbereiteten Anweisung durch Platzhalter ersetzt.
Da die Bindevariable als Kommentar von SQL geschrieben wird und der Wert für das Testen unmittelbar danach geschrieben wird, kann diese SQL wie mit dem DB-Verwaltungstool oder der Befehlszeile ausgeführt werden. Dies ist "2Way SQL".
Wenn Sie eine Datenbank von einer Anwendung aus betreiben, wird SQL im Allgemeinen in einer Variablen vom Typ String gespeichert und ausgeführt. Mirage-SQL kann jedoch verwendet werden, um SQL vollständig vom Java-Quellcode zu trennen. Daher können Sie die Situation vermeiden, dass "SQL erst bestätigt werden kann, wenn es ausgeführt wird". Da die SQL-Anweisung nicht dynamisch zusammengestellt wird, ist sie auch eine Gegenmaßnahme gegen die SQL-Injection.
Es ist eine gute Idee, sich / * BEGIN * / ~ / * END * /
als etwas vorzustellen, das sich so anpasst, dass es keinen Syntaxfehler verursacht.
(Weitere Informationen finden Sie unter github wiki.)
Staff
import jp.sf.amateras.mirage.annotation.Column;
import jp.sf.amateras.mirage.annotation.Table;
@Table(name = "staff")//Kann weggelassen werden, wenn der Klassenname und der Tabellenname identisch sind
public class Staff implements Serializable {
@Column(name = "staffname")//Kann weggelassen werden, wenn der Spaltenname und der Feldname identisch sind
private String staffname ;
@Column(name = "staffstatus ")
private int staffstatus ;
//Unten die Zugriffsmethode
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();
}
Ich habe Map als Wert für die Übergabe an die Bindevariable verwendet, aber eine Klasse mit demselben Namen wie die Bindevariable ist in Ordnung.
Recommended Posts