Zuordnung von Datenbank-Spalte-Namen zu Java-Klasse, die Felder mithilfe von apache-commons-dbutils
Ich würde gerne zum füllen eines POJO - (State.java) von der DB mit Apache DBUtils
Bibliothek. Da jedoch die Namen der Bean-Eigenschaften, die nicht genau übereinstimmen mit DB-Spalte mit Namen von einigen der Eigenschaften übrig sind ungefüllt.
Nun, ich habe einige der Forschung auf diesem durch googeln und fand, dass dies kann erreicht werden durch:
- Spalte aliasing beim schreiben einer SQL-Abfrage (was ich nicht bevorzugen, da ich mehrere verbindungen in einige größere Tabellen und daher würde erfordern viel aliasing)
- Mit BeanProcessor (konnte nicht finden einen wirklich guten Beispiel überall)
Kann jemand ein gutes Beispiel, wie BeanProcessor
zuordnen von Spaltennamen zu den Eigenschaften? Tweaking das Beispiel würde mir noch besser.
DB-Tabelle
CREATE TABLE public.states (
state_id INTEGER DEFAULT nextval('states_seq'::regclass) NOT NULL,
state_cd VARCHAR(2) NOT NULL,
name VARCHAR(100) NOT NULL,
tax_pct NUMERIC(10,2) DEFAULT 0.00 NOT NULL,
active CHAR(1) DEFAULT 'Y'::bpchar NOT NULL,
)
State.java
public class State implements Serializable {
private int stateId;
private String stateCode;
private String name;
private BigDecimal taxPct = new BigDecimal(0);
private Date expiryDate;
private String createdBy;
private Date createdOn;
private String active;
//getters and setters here
}
Main.java
public class Main {
public static void main(String[] args) {
String url = "jdbc:postgresql://gsi-547576.gsiccorp.net:5432/istore-db";
String driver = "org.postgresql.Driver";
String user = "postgres";
String pwd = "postgres";
Connection conn = null;
List<State> states = null;
try {
DbUtils.loadDriver(driver);
conn = DriverManager.getConnection(url, user, pwd);
states = (List<State>) new QueryRunner().query(conn, "select * from states a where a.active='Y'", new BeanListHandler(State.class);
System.out.println("states:: " + states);
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
DbUtils.closeQuietly(conn);
}
}
}
- Siehe meine Antwort. Hatte eine Menge tun, um das Graben in den java-docs und den Quellcode, um zu einer Lösung zu kommen 🙂
- Ja, bot ich gerade getan habe und immer
ArrayIndexOutofBoundsException
. Siehe mein code oben aktualisiert. - Das ist nicht wie stackoverflow funktioniert. Sie können nicht nehmen Sie eine Antwort zu Ihrer Frage und zu halten, erstellen Sie neue Fragen. Wenn Sie ein Problem mit meiner Antwort sind, können Sie post einen Kommentar auf meine Antwort.
- Entschuldige mich für diese, wie ich nicht wussten, wie Sie die änderungen anzeigen, die ich Tat, um meinen code zu Sie und daher ich bearbeitet habe, die ursprüngliche Frage. Der "Kommentar" - Sektion nur erlaubt, mich zu fügen Sie sehr wenig Informationen.
- Kein problem. Aber das ist nicht, wie stackoverflow funktioniert. Sie können nicht nur halten der Inkrementierung Ihre Frage. Sie können post eine neue Frage anstatt Sie zu verändern, diese Frage. Ich glaube, ich habe das beantwortet deine ursprüngliche Frage
How to use BeanProcessor to map column names to properties
- Vereinbart und es ist definitiv ein Fortschritt von der früheren version von meinem Programm 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie einen Blick auf die Java-docs für BeanProcessor :
Sieht aus wie Sie benötigen, um eine Klasse erstellen, die sich aus
BeanProcessor
und überschreibt diemapColumnsToProperties
- Methode wie folgt :Anschließend können Sie das plugin über StateBeanProcessor in Ihrem code wie folgt :
Haftungsausschluss : ich noch nicht getestet, aus diesem code. Es zielt darauf ab, Ihnen zu zeigen, die bits und Stücke, die Sie zusammenstellen können, um benutzerdefinierte feldzuweisungen. Wenn Sie ein Problem mit ihm, lassen Sie es mich wissen, damit ich Sie ansehen kann.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
. Ich habe aktualisiert mein ursprüngliche code-Basis für Ihre Referenz. Ich habe etwas zu tun mit der Zuordnung aber nicht sicher, wie Sie Sie als ich immer noch nicht visualisieren das gesamte Bild hier.java.sql.SQLException: Cannot set createdOn: incompatible types, cannot convert java.lang.String to java.util.Date Query: select * from states a where a.active='Y' Parameters: [] at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:392)
ich komme aus china,mein Englisch ist nicht sehr gut,
aber dieses Problem ,das ist meine Lösung :
da die dbutils ist open source, können Sie den Quellcode ändern, und verwenden maven um eine jar Datei, nur für dich ,ich ändern Sie einfach die BeanProcessor Klasse,können Sie fügen Sie eine Methode namens
changeColumnName
wie diese :und in der Methode
er das problem lösen kann.willkommen, um mit mir zu besprechen .meine google-E-Mail ist [email protected]
Habe ich bereits beantwortet ähnlichen also Frage hier.
Können Sie
GenerousBeanProcessor
welche eine Unterklasse vonBeanProcessor
ignoriert es die Unterstrich - & Kleinschreibung von Spaltennamen. Sie nicht haben, um Ihre eigenen benutzerdefiniertenBeanProcessor
für diesen speziellen Fall.GenerousBeanProcessor
ist seit der version 1.6 von commons-dbutils.Verwendung: