Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Najprostszy dostep do danych na bazie Postgres

30 views
Skip to first unread message

Tomasz

unread,
Jan 12, 2011, 8:06:11 AM1/12/11
to
Mam w javie niwielkie doswiadczenie, kilka lat temu napisalem jedna
aplikacje desktopowa.
Obecnie szykuje mi sie wiekszy projekt z baza Postgres i prosilbym o
odpowiedz jaki jest obecnie najprostszy, najbardziej popularny dostep do
danych z poziomu kodu zrodlowego.
To na czym opieralem sie 3 lata temu bylo tak zakomplikowane ze np dodanie
jednego pola do tabeli wymagalo kilkugodzinnego grzebania w kodzie.
Czy istnieje mozliwosc prostego dostepu do danych poprzez instrukcje SQL,
oczywiscie po wczesniejszym polaczeniu sie z wlasciwa baza danych, Np
jesli chce zmodyfikowac jakis rekord to pisze:

"update klient
set nazwa = 'Kowalewski',
ulica = 'Kamionkowa'
where id = 362;"

Czy tez musze wczesnie napisac setki linii kodu zwiazanego z dana tabela a
dopiero po tym jakos tam siegac?

--
Tomasz

__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirusow 5780 (20110112) __________

Wiadomosc zostala sprawdzona przez program ESET NOD32 Antivirus.

http://www.eset.pl lub http://www.eset.com

Scypio

unread,
Jan 12, 2011, 8:24:09 AM1/12/11
to
Dnia Wed, 12 Jan 2011 14:06:11 +0100, Tomasz napisal(a):

> Czy tez musze wczesnie napisac setki linii kodu zwiazanego z dana tabela a
> dopiero po tym jakos tam siegac?

Setki, a nawet tysiące!!!! A tak konkretnie to pięć.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class JDBCTest {

public static void main(String[] args) throws Throwable {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection connection = DriverManager.
getConnection("jdbc:oracle:thin:user/pa...@127.0.0.1:1521:xe");
PreparedStatement ps = connection.
prepareStatement("update HELLO_WORLD set FIELD_1=0 where FIELD_2=1");
int res = ps.executeUpdate();
connection.close();
System.out.println(res + " records modified");
}

}

jak zmienisz nazwę drivera i connection string zadziała ci
toto na postgresie...

pozdrawiam,
--
scypio

Tomasz

unread,
Jan 12, 2011, 2:24:37 PM1/12/11
to

Użytkownik "Scypio" <scypio...@poczta.fm> napisał

> Setki, a nawet tysiące!!!! A tak konkretnie to pięć.
>
> import java.sql.Connection;
> import java.sql.DriverManager;
> import java.sql.PreparedStatement;
>
> public class JDBCTest {
>
> public static void main(String[] args) throws Throwable {
> Class.forName("oracle.jdbc.driver.OracleDriver");
> Connection connection = DriverManager.
> getConnection("jdbc:oracle:thin:user/pa...@127.0.0.1:1521:xe");
> PreparedStatement ps = connection.
> prepareStatement("update HELLO_WORLD set FIELD_1=0 where FIELD_2=1");
> int res = ps.executeUpdate();
> connection.close();
> System.out.println(res + " records modified");
> }
>
> }
>
Wyprobowalem, update, insert, delete wszysto dziala swietnie,
nie wiem jeszcze jak zaladowac dane z Select ale mysle za jakos dam sobie
rade. Gdybys dal mi jakis przykladzik na select to bylaby juz bajka.
Niezmierne dzieki, przekonuje sie z powrotem do Javy.

--
Tomasz


__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirusow 5782 (20110112) __________

Przemysław Chmielewski

unread,
Jan 12, 2011, 4:20:22 PM1/12/11
to
On 12 Sty, 20:24, "Tomasz" <tutomas...@gmail.com> wrote:
> Wyprobowalem, update, insert, delete wszysto dziala swietnie,
> nie wiem jeszcze jak zaladowac dane z Select ale mysle za jakos dam sobie
> rade. Gdybys dal mi jakis przykladzik na select to bylaby juz bajka.
> Niezmierne dzieki, przekonuje sie z powrotem do Javy.
Na temat JDBC w internecie są niezmierzone ilości materiałów.
Przykłady choćby na java2s.com.
http://www.java2s.com/Code/Java/Database-SQL-JDBC/JDBCselect.htm
http://www.jdbc-tutorial.com/jdbc-select-data.htm

Oczywiście zmienic sterownika JDBC pod postgresa.

Nie wiem jaka to aplikacja ale może hibernate/jpa warto użyć?

Pozdrawiam

--
Przemysław Chmielewski

Tomasz

unread,
Jan 12, 2011, 4:44:04 PM1/12/11
to

Użytkownik "Przemysław Chmielewski" <przem...@gmail.com> napisał

Nie wiem jaka to aplikacja ale może hibernate/jpa warto użyć?

Wiesz ja jestem przyzwyczajony do grzebania na bazach danych z pelna
swiadomoscia co robie a taki hibernate za duzo za mnie chce chyba robic i to
mi sie nie podoba.
To nie jest duza aplikacja tak gdzies 2 lata pracy dla jednej osoby. Taka
gotowa aplikacje mozna kupic za ok 700 euro ale jak inwestor ma takie hobby
to ja od tego jestem.

Zbigniew Malec

unread,
Jan 12, 2011, 5:17:46 PM1/12/11
to
On Wed, 12 Jan 2011 14:06:11 +0100, Tomasz wrote:

> To na czym opieralem sie 3 lata temu bylo tak zakomplikowane ze np dodanie
> jednego pola do tabeli wymagalo kilkugodzinnego grzebania w kodzie.

Ueee? Przeciez 3 lata temu JDBC działało doskonale. Nie bardzo sobie
potrafię wyobrazić, co ty musiałeś robić, żeby tyle kodu nastukać. No chyba
że sklejałeś ręcznie paczki i puszczałeś je po sockecie w natywnym
protokole postgresa :>

--
Pozdrawiam
Zbyszek Malec

Paweł Andziak

unread,
Jan 12, 2011, 5:39:57 PM1/12/11
to
W dniu 12.01.2011 23:17, Zbigniew Malec pisze:

Mi się skojarzyło z "SELECT * FROM tabela1, tabela2...". Wtedy
faktycznie dodanie kolumny np. w tabela1 powoduje wyżej opisaną
sytuację. Ale to nie jest kwestia JDBC tylko samego SQL i konstuowania
zapytań.

--
ganda

WOJSAL

unread,
Jan 13, 2011, 2:46:01 AM1/13/11
to
W dniu 12.01.2011 23:17, Zbigniew Malec pisze:
>
> Ueee? Przeciez 3 lata temu JDBC działało doskonale. Nie bardzo sobie

Moze korzystał z jakiegoś super-frameworka, co w polaczeniu z jakimis
super-wzorcami projektowymi wspomaganymi przez 500 XMLi
konfiguracyjnych, prowadzi do komplikowania prostych rzeczy. I wtedy
mamy wariant "drapanie w lewe ucho przez prawe kolano" oraz wnioski
w stylu "Java jest slabym jezykiem" itp.

Pozdrawiam,
Wojtek

WOJSAL

unread,
Jan 13, 2011, 2:52:29 AM1/13/11
to
W dniu 12.01.2011 20:24, Tomasz pisze:

> Wyprobowalem, update, insert, delete wszysto dziala swietnie,

Moze dlatego, ze kolega zaproponowal Ci proste, zwyczajne rozwiazanie? :)

> nie wiem jeszcze jak zaladowac dane z Select ale mysle za jakos dam
> sobie rade. Gdybys dal mi jakis przykladzik na select to bylaby juz bajka.

Zajrzyj tutaj:
http://www.exampledepot.com/egs/java.sql/pkg.html

> Niezmierne dzieki, przekonuje sie z powrotem do Javy.

Twoje problemy wczesniejsze nie tyle wynikaly z Javy, co raczej
- jak sie domyslam - z przekombinowania. Nie bylo tak? :)

Pozdrawiam,
Wojtek

Tomasz

unread,
Jan 13, 2011, 3:00:34 AM1/13/11
to

Użytkownik "Zbigniew Malec" <al...@invalid.invalid> napisał

>
>> To na czym opieralem sie 3 lata temu bylo tak zakomplikowane ze np
>> dodanie
>> jednego pola do tabeli wymagalo kilkugodzinnego grzebania w kodzie.
>
> Ueee? Przeciez 3 lata temu JDBC działało doskonale.

Tak, samo polaczenie do bazy wygladalo identycznie i prosto.
Nie mialem wtedy zadnego doswiadczenia wiec korzystalem z doradztwa kolegow
ekspertow od jawy. Oni natworzyli mi mnostwo roznych klas dotyczacych danej
tabeli w celowosci ktorych do dzis nie moge sie polapac. Ale jak zaczalem
analizowac te kody to i dzis wiedzac o co chodzi chyba ich tez nie unikne.
Po pierwsze do interfejsu uzytkownika (SWT) potrzebne byly wszystkie pola
danej tabeli w postaci stringa, wiec od razu pojawily sie metody
zamieniajace rozne typy pol na string, oczywiscie nalezalo do tego utworzyc
odpowiednia ilosc zmiennych String. Przed zapisem do bazy nalezalo te
wszystkie zmienne znowu zamienic na zmienne o odpowiednich typach i dopiero
podstawic do instrukcji "update".
Mysle ze tu lezal najwiekszy problem powodujacy olbrzymia komplikacje kodu.
Na przyklad w Clipperze pobieralem dane z tabeli do zmiennych o tych samych
typach co w tabeli, robilem na nich rozne operacje bez zmiany typow po czym
podstawialem je do instrukcji "update" czy "insert". Gdyby w javie bylo to
mozliwe to odpadlo by mi 80% niepotrzebnej roboty. Z pewnoscia tak jest
tylko wtedy nie wiedzialem jakie biblioteki sa i jakie nalezy uzyc.
Jesli w tym kierunku moglby mi ktos dac dobra rade to bede bardzo wdzieczny.

--
Tomasz


__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirusow 5782 (20110112) __________

Tomasz

unread,
Jan 13, 2011, 3:27:45 AM1/13/11
to

Użytkownik "WOJSAL" <woj...@NOSPAM-gazeta.pl> napisał

>
> Zajrzyj tutaj:
> http://www.exampledepot.com/egs/java.sql/pkg.html
>
>> Niezmierne dzieki, przekonuje sie z powrotem do Javy.
>
> Twoje problemy wczesniejsze nie tyle wynikaly z Javy, co raczej
> - jak sie domyslam - z przekombinowania. Nie bylo tak? :)
>
Masz racje, jako zielony poczatkujacy korzystalem z doradztwa kolegow
"ekspertow" i oni mi to tak zakomplikowali ze do dzis nie moge sie w tym
polapac. Teraz musze sam krok po kroku najprostzym sposobem przejsc droge od
pobrania danych z bazy danych poprzez ich edycje do zapisu rezultatow znowu
do bazy. Wydaje mi sie ze jedynie srodkowy element sprawia mi najwieksze
problemy i tu prosilbym o porade. Przy pomocy jakich bibliotek czy klas
najprosciej edytowac dane pobrane z bazy aby uniknac kikukrotnych konweersji
typow?

WOJSAL

unread,
Jan 13, 2011, 3:29:17 AM1/13/11
to
W dniu 13.01.2011 09:00, Tomasz pisze:

> Nie mialem wtedy zadnego doswiadczenia wiec korzystalem z doradztwa
> kolegow ekspertow od jawy. Oni natworzyli mi mnostwo roznych klas
> dotyczacych danej tabeli w celowosci ktorych do dzis nie moge sie
> polapac. Ale jak zaczalem analizowac te kody to i dzis wiedzac o co
> chodzi chyba ich tez nie unikne.

I tu byl problem. Ktos tak bardzo Ci pomogł, ze potem nie dalo sie
pracowac. Zdarza sie :)


> Po pierwsze do interfejsu uzytkownika (SWT) potrzebne byly wszystkie
> pola danej tabeli w postaci stringa, wiec od razu pojawily sie metody
> zamieniajace rozne typy pol na string, oczywiscie nalezalo do tego
> utworzyc odpowiednia ilosc zmiennych String. Przed zapisem do bazy
> nalezalo te wszystkie zmienne znowu zamienic na zmienne o odpowiednich
> typach i dopiero podstawic do instrukcji "update".

W widokach opartch na Swingu czy SWT tego nie unikniesz.
Taki JSF juz sam aktualizuje model. W Swingu czy SWT kopiowanie
widok -> model i model -> widok musisz zrobic sam. Oczywiscie
zakladajac ze w logice biznesowej nie korzystasz bezposrednio
z kontrolek widoku, bo to - przynajmniej dla mnie - byloby chore.


> Mysle ze tu lezal najwiekszy problem powodujacy olbrzymia komplikacje
> kodu. Na przyklad w Clipperze pobieralem dane z tabeli do zmiennych o
> tych samych typach co w tabeli, robilem na nich rozne operacje bez
> zmiany typow po czym podstawialem je do instrukcji "update" czy
> "insert". Gdyby w javie bylo to mozliwe to odpadlo by mi 80%
> niepotrzebnej roboty. Z pewnoscia tak jest tylko wtedy nie wiedzialem
> jakie biblioteki sa i jakie nalezy uzyc.

W obsludze akcji mozesz wykorzystac wzorzec metody szablonowej. Tj
obiekt akcji dziedziczy po abstrakcyjnej klasie (ta klasa zas
wykorzystuje wzorzec metody szablonowej). Wtedy takie kopiowanie
widok->model (na poczatku akcji) oraz model-> widok (na koniec
akcji) + obsluga wyjatkow - wykonuje sie "automatycznie".
Jesli z tego maja korzystac inne osoby, konieczne (!) jest wykonanie
tutoriala. Jesli z tego masz korzystac sam, tutorial mozesz sobie odpuscic.

Pozdrawiam,
Wojtek

WOJSAL

unread,
Jan 13, 2011, 3:34:26 AM1/13/11
to
W dniu 13.01.2011 09:27, Tomasz pisze:

> rezultatow znowu do bazy. Wydaje mi sie ze jedynie srodkowy element
> sprawia mi najwieksze problemy i tu prosilbym o porade. Przy pomocy
> jakich bibliotek czy klas najprosciej edytowac dane pobrane z bazy aby
> uniknac kikukrotnych konweersji typow?
>

W jakiej technologii jest widok? (Swing? SWT? Webowy?)

Pozdrawiam,
Wojtek

Tomasz

unread,
Jan 13, 2011, 3:54:11 AM1/13/11
to

Użytkownik "WOJSAL" <woj...@NOSPAM-gazeta.pl> napisał

>
> W jakiej technologii jest widok? (Swing? SWT? Webowy?)

Dotychczas robilem w SWT ale nie jestem tym zbytnio przywiazany.
Zaczynajac nowy projekt moge przyjac zupelnie inna technologie.
Napisales cos o JSF, na razie jeszcze nic o tym nie wiem ale jesli ta
technologia pozwala pominac wszelkie wlasne konwersje to juz byloby cos.

Scypio

unread,
Jan 13, 2011, 4:09:40 AM1/13/11
to
Dnia Thu, 13 Jan 2011 09:00:34 +0100, Tomasz napisal(a):

> Na przyklad w Clipperze pobieralem dane z tabeli do zmiennych o tych samych
> typach co w tabeli, robilem na nich rozne operacje bez zmiany typow po czym
> podstawialem je do instrukcji "update" czy "insert". Gdyby w javie bylo to
> mozliwe to odpadlo by mi 80% niepotrzebnej roboty.

Nic nie zrozumia�em z tej wyci�tej historii, ale w javie jest to jak
najbardziej mo�liwe... prosz�, ma�a demonstracja jak wyci�ga� dane z bazy
i je aktualizowa� u�ywaj�c natywnych typ�w Javy (a nie string�w...)

String ssql = "select ID_INT, SOMEVAL_LONG, STRINGFIELD, DATEFIELD from FOO";
String usql = "update FOO set SOMEVAL_LONG = ? where ID_INT = ?";
PreparedStatement ps = connection.prepareStatement(ssql);
PreparedStatement updateStmt = connection.prepareStatement(usql);
java.sql.ResultSet rs = ps.executeQuery();
while (rs.next()) {
Integer id_int = rs.getInt(1);
Long someval_long = rs.getLong(2);
String stringfield = rs.getString("STRINGFIELD");
java.util.Date datefield = rs.getDate(4);
System.out.println(id_int + ", " + someval_long + ", " + stringfield +
", " + datefield);
updateStmt.setInt(2, id_int);
updateStmt.setLong(1, 2*someval_long);
updateStmt.executeUpdate();
}

R�ne sprytne frameworki powsta�y poniewa� przy wi�kszej skali projektu
zarz�dzanie tymi wszsytkimi sqlami i po��czeniami staje si� do��
m�cz�ce... ale mo�e po prostu trzeba do nich dojrze� :)

pozdrawiam,
--
scypio

Scypio

unread,
Jan 13, 2011, 4:18:49 AM1/13/11
to
Dnia Thu, 13 Jan 2011 09:09:40 +0000 (UTC), Scypio napisal(a):

> Nic nie zrozumia�em z tej wyci�tej historii

OK, GUI w SWT, ju� rozumiem, nie musicie t�umaczy� ;)

pozdrawiam,
--
scypio

Tomasz

unread,
Jan 13, 2011, 4:20:50 AM1/13/11
to

U�ytkownik "Scypio" <scypio...@poczta.fm> napisa�

> najbardziej mo�liwe... prosz�, ma�a demonstracja jak wyci�ga� dane z bazy
> i je aktualizowa� u�ywaj�c natywnych typ�w Javy (a nie string�w...)
>
> String ssql = "select ID_INT, SOMEVAL_LONG, STRINGFIELD, DATEFIELD from
> FOO";
> String usql = "update FOO set SOMEVAL_LONG = ? where ID_INT = ?";
> PreparedStatement ps = connection.prepareStatement(ssql);
> PreparedStatement updateStmt = connection.prepareStatement(usql);
> java.sql.ResultSet rs = ps.executeQuery();
> while (rs.next()) {
> Integer id_int = rs.getInt(1);
> Long someval_long = rs.getLong(2);
> String stringfield = rs.getString("STRINGFIELD");
> java.util.Date datefield = rs.getDate(4);
> System.out.println(id_int + ", " + someval_long + ", " + stringfield +
> ", " + datefield);
> updateStmt.setInt(2, id_int);
> updateStmt.setLong(1, 2*someval_long);
> updateStmt.executeUpdate();
> }
>
> R�ne sprytne frameworki powsta�y poniewa� przy wi�kszej skali projektu
> zarz�dzanie tymi wszsytkimi sqlami i po��czeniami staje si� do��

Problem moj chyba lezy gdzie indziej a mianowicie w mozliwosci okien SWT,
tam niestety musze wszystkie typy danych zamienic na string a po ich
modyfikacji znowu na odpowiednie typy.
Poszukuje wiec takich okien edycyjnych gdzie moge podstawiac te same typy
ktore sa w bazie danych a nie zawsze stringi.

WOJSAL

unread,
Jan 13, 2011, 4:24:17 AM1/13/11
to
W dniu 13.01.2011 09:54, Tomasz pisze:

> Dotychczas robilem w SWT ale nie jestem tym zbytnio przywiazany.
> Zaczynajac nowy projekt moge przyjac zupelnie inna technologie.
> Napisales cos o JSF, na razie jeszcze nic o tym nie wiem ale jesli ta
> technologia pozwala pominac wszelkie wlasne konwersje to juz byloby cos.
>

JSF to framework webowy, wiec w Twoim przypadku sie raczej nie przyda.
Jesli robisz aplikacje desktopowa to masz wybor miedzy Swing a SWT.
Ja bym radzil Swing, bo jest i standardem i lepiej opisany. A problem,
kopiowania modelu do widoku w obu przypadkach jest identyczny.

Odnosnie problemu kopiowania widok <-> model, radzilbym nie kombinowac
tylko samemu w kazdym widoku napisac dwie metody:
- kopiujWidokDoModelu(TModel model)
- kopiujModelDoWidoku(TModel model)

Metody te powiny byc wolane w kazdej akcji:
na poczatku akcji: kopiujWidokDoModelu
na koniec akcji (tj. po poprawnym wykonaniu akcji): kopiujModelDoWidoku

Ciala tych metod sa proste:
dla kazdej kontrolki widoku (czy tez dla kazdego pola modelu) wywolaj:
- metode getValue() (w metodzie kopiujWidokDoModelu()).
- metode setValue (w metodzie kopiujModelDoWidoku())

Troche inaczej obsluguje sie obiekt JTable.

Pozdrawiam,
Wojtek


kk

unread,
Jan 13, 2011, 6:18:16 AM1/13/11
to
>Problem moj chyba lezy gdzie indziej a mianowicie w mozliwosci okien SWT,
>tam niestety musze wszystkie typy danych zamienic na string a po ich
>modyfikacji znowu na odpowiednie typy.

Nie zasadniczo nie musisz konwertować tego sam, ale kwestia co musisz
robić sam, a co nie zależy od tego jakie zabawki wybierzesz (i co uda
Ci się nauczyć/skonfigurować ;))

Ponieważ korzystasz z SWT (Swing tak samo to dotyczy) warto ściągnąć
http://code.google.com/intl/pl/javadevtools/wbpro/
Ponieważ nie chcesz konwertować nic ręcznie, no i generalnie jest to
"DOBRE" (TM) - wypada poczytać o data binding np.
http://wiki.eclipse.org/index.php/JFace_Data_Binding, zdaje mi się, że
SWT Designer wspiera to więc nie musisz grzebać się ręcznie tylko
wiedzieć, że gdzieś w opcjach to jest :)
Ponieważ preferujesz wiedzieć co jest w bazie danych, warto sprawdzić
http://www.mybatis.org/ , bo dość szybko ręczne podejście do SQL
przestanie się skalować.

Oczywiście każdy z tych punktów tworzy nowy narzut wiedzy którą trzeba
posiąść i zakłada, że gdzieś po drodze wszystkie wyniki twoich zapytań
i/lub tabele są reprezentowane jako obiekt Java :)

Pozdrawiam,
Krzysztof Kowalczyk

kk

unread,
Jan 13, 2011, 7:02:38 AM1/13/11
to
I jeszcze dodam, że proponowałbym SWT a dokładniej wykorzystanie JFace
viewers, bo mają bardzo ładna wersję MVC, znacznie przyjaźniejszą w
mojej opinii niż pomieszanie w Swing, ale musisz znaleźć dokumentacje
do tego ;)

Dość zaawansowany przykład tabelki:
http://www.vogella.de/articles/EclipseJFaceTable/article.html

I zaległy link:
http://code.google.com/intl/pl/javadevtools/wbpro/features/swt/data_binding/index.html

Są 3 typy bindingów, nie interesuj się tymi dla EMF, bo to jest dla
hmm, nie dla każdego ;)

Jest jeszcze jedna wersja SWT dla śmiałych:
http://wiki.eclipse.org/E4/XWT
to dalej jest SWT, ale bardziej podobne do JSF w sensie, masz sobie
jakiś dziwny markup, który ma bindingi od razu przypisane do atrybutów
i automagicznie to sobie hula. Optymistycznie, nie musisz dotykać
widoku w Javie, tylko robisz kontrolery. Nie liczyłbym jednak na
wsparcie w polskim internecie ;) Wsparcie do edycji też jest
http://wiki.eclipse.org/E4/XWTDesigner .

Pozdrawiam,
Krzysztof Kowalczyk

Tomasz

unread,
Jan 13, 2011, 11:08:32 AM1/13/11
to

U�ytkownik "WOJSAL" <woj...@NOSPAM-gazeta.pl> napisa� w

A problem,
> kopiowania modelu do widoku w obu przypadkach jest identyczny.
>
> Odnosnie problemu kopiowania widok <-> model, radzilbym nie kombinowac
> tylko samemu w kazdym widoku napisac dwie metody:
> - kopiujWidokDoModelu(TModel model)
> - kopiujModelDoWidoku(TModel model)
>
> Metody te powiny byc wolane w kazdej akcji:
> na poczatku akcji: kopiujWidokDoModelu
> na koniec akcji (tj. po poprawnym wykonaniu akcji): kopiujModelDoWidoku
>
> Ciala tych metod sa proste:
> dla kazdej kontrolki widoku (czy tez dla kazdego pola modelu) wywolaj:
> - metode getValue() (w metodzie kopiujWidokDoModelu()).
> - metode setValue (w metodzie kopiujModelDoWidoku())

Fajne rzeczy mi tu radzisz ale ja nie kapuje tej terminologii


- kopiujWidokDoModelu(TModel model)
- kopiujModelDoWidoku(TModel model)

Prawdopodobnie z niezrozumienia tematu w poprzedniej aplikacji narobilem
sobie tyle niepotrzebnego balaganu.

Z jednej strony mam pole jakiejs tabeli na bazie danych z drugiej
jakas zmienna String ktora w okienku edycyjnym reprezentuje to pole. Mozesz
mi w dw�ch zdaniach lub na jakims przykladzie wyjasnic jak mialyby wygladac
te metody?

--
Tomasz

__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirusow 5784 (20110113) __________

WOJSAL

unread,
Jan 14, 2011, 6:47:10 AM1/14/11
to
W dniu 13.01.2011 17:08, Tomasz pisze:

>
> Z jednej strony mam pole jakiejs tabeli na bazie danych z drugiej
> jakas zmienna String ktora w okienku edycyjnym reprezentuje to pole.

> Mozesz mi w dwóch zdaniach lub na jakims przykladzie wyjasnic jak
> mialyby wygladac te metody?
>

Mamy 3 klasy:
1. model - klasa Model (posredniczy w wymianie danych miedzy widokiem a
logika).
2. widok - klasa Widok (Swing). Ma dostep do modelu. Nic nie wie o tym,
jak logika jest zaimpelementowana, w jakiej technologii, jaka baza itp
3. logika - klasa Logika (tu czytamy dane z bazy i wrzucamy je do
modelu). Logika nic nie wie o widoku, o technologii widoku (czy to jest
swing? czy SWT? czy moze interfejs webowy?).


Klasa Model jest, jak zawsze, bardzo prosta:
public class Model {

public String poleZDanymiZbazy;

public String getPoleZDanymiZbazy() {
return this.poleZDanymiZbazy;
}

public void setPoleZDanymiZbazy(String poleZDanymiZbazy) {
this.poleZDanymiZbazy = poleZDanymiZbazy;
}
}

Klasa widoku (przepraszam za prymitywne kodowanie, ale chodzi tylko tu
pokazanie idei):
public class Widok extends JFrame {

private static final long serialVersionUID = 1L;
private final Model model;
private final JFormattedTextField poleZDanymiZbazy = new
JFormattedTextField();

public Widok(Model md) {
this.model = md;
JPanel panel = new JPanel();
this.setSize(new Dimension(500, 300));
JButton button = new JButton("Czytaj bazę");
button.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
try {
Widok.this.kopiujWidokDoModelu(Widok.this.model);
/**
* tu wywolanie logiki biznesowej
*/
DaoDostepDobazy logika = new DaoDostepDobazy();
logika.czytajDaneZbazy(Widok.this.model);
Widok.this.kopiujModelDoWidoku(Widok.this.model);
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
panel.add(button);
panel.add(this.poleZDanymiZbazy);
this.getContentPane().add(panel);
}

/**
* dane z widoku kopiujemy do modelu. czyli to co wprowadzil user
wrzucamy do modelu.
*/
public void kopiujWidokDoModelu(Model model) {
model.setPoleZDanymiZbazy((String)
this.poleZDanymiZbazy.getValue());
}

/**
* dane pobrane z logiki wrzucamy do widoku. Aktualizujemy tu widok
tymi danymi, wyswietalmy dane np. pochodzace z bazy
*/
public void kopiujModelDoWidoku(Model model) {
this.poleZDanymiZbazy.setValue(model.getPoleZDanymiZbazy());
}
}

Klasa logiki (czyli obslugi akcji):
public class Logika {

public void czytajDaneZbazy(Model model) {
/**
* tu czytamy dane z bazy i wrzucamy je do modelu
*/
model.set....
}
}


Przyklad ten nie stosuje zadnych wlasnych narzedzi, wlasnych klas
bazowych. Jest on napisany tylko po to, by ukazac idee transferu danych
miedzy widokiem poprzez model do kontrolera (i z powrotem). Tak wiec tu
pokazalem tylko idee.

Przy duzej aplikacji nalezaloby zredykowac powtarzajacy sie kod. Tak
wiec przy duzych aplikacjach nalezaloby:
1. Napisac wlasna klase bazowa do obslugi akcji, tak by metody
kopiowania widok<-->model, byly obslugiwane w jednym miejscu w
kodzie. oraz by obsluga wyjatkow akcji byla tez w jednym miejscu w kodzie.
2. Formatka powinna implementowac interfejs zdefiniowany przez nas.
Interfejs ten by mial metody do kopiowania widok<--> model
Klasa obslugi akcji (z p. 1) uzywalaby tego interfejsu do
transferu danych miedzy widokiem a modelem.
Interfejs powinien byc generyczny (chodzi o typ modelu).
3. O redykcji kodu w obsludze bazy nie mowie, by nie zaciemniac przykladu.

Pozdrawiam,
Wojtek

Tomasz

unread,
Jan 15, 2011, 2:16:04 AM1/15/11
to

Użytkownik "WOJSAL" <woj...@NOSPAM-gazeta.pl> napisał

> Mamy 3 klasy:
> 1. model - klasa Model (posredniczy w wymianie danych miedzy widokiem a
> logika).
> 2. widok - klasa Widok (Swing). Ma dostep do modelu. Nic nie wie o tym,
> jak logika jest zaimpelementowana, w jakiej technologii, jaka baza itp
> 3. logika - klasa Logika (tu czytamy dane z bazy i wrzucamy je do
> modelu). Logika nic nie wie o widoku, o technologii widoku

Dzieki za pewne uporzadkowanie mojej haotycznej wiedzy.
Oczywiscie w mojej pierwszej aplikacji wszystkie te elementy w jakims sensie
byly tyle ze uzywalem je bez swiadomego planu a co za tym idzie mialem w
kodzie wielki balagan.
Nie wspomniales nic o tym co caly czas bylo dla mnie najwiekszym problemem o
konwersji typow z modelu do widoku i odrotnie.
Tak w Swingu jak w SWT widoki operuja na stringach a w modelu mam caly
dostepny zestaw typow. Gdzie i jak mam pamietac przekomwertowane na stringi
wartosci pol? Czy nalezy stworzyc Model2 w ktorym beda przechowywane pola z
typami uzywanymi w widoku? Rozumiem ze metody kopiujModelDoWidoku i
kopiujWidokDoModelu powinny wlasnie zajmowac sie konwersja danych z modelu1
do modelu2 i odwrotnie.
Jak Ty to widzisz?

--
Tomasz


__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirusow 5788 (20110114) __________

kk

unread,
Jan 15, 2011, 2:58:58 PM1/15/11
to
> Nie wspomniales nic o tym co caly czas bylo dla mnie najwiekszym problemem o
> konwersji typow z modelu do widoku i odrotnie.
> Tak w Swingu jak w SWT widoki operuja na stringach a w modelu mam caly
> dostepny zestaw typow. Gdzie i jak mam pamietac przekomwertowane na stringi
> wartosci pol? Czy nalezy stworzyc Model2 w ktorym beda przechowywane pola z
> typami uzywanymi w widoku? Rozumiem ze metody kopiujModelDoWidoku i
> kopiujWidokDoModelu powinny wlasnie zajmowac sie konwersja danych z modelu1
> do modelu2 i odwrotnie.
> Jak Ty to widzisz?

Do tego właśnie przydaje się binding, który zwykle jest powiązany z
konwerterami i walidacją.
Przy porządnym bindingu wybierasz:

koniecznie:
- jakie pole ma być przypisane do jakiego pola (czyli np.
getDataUrodzenia() do pola text field lub nawet jak łaskawie
biblioteka na to pozwala DateChooser)
- rodzaj bindowania (to zależy od rozwiązania, ale przykładowo, czy ma
tylko odczytywać (jednostronne) czy pozwalać na zmiany dwustronne, czy
ma mieć opóźnienie, czy nie, itp)

opcjonalnie:
- konwerter - czyli jak zamieniać wartość z widoku (String) na wartość
w modelu (np. Data) - zwykle powinno działać automatycznie po typie
pola w modelu
- walidacja - czyli możesz przykładowo ograniczyć wartość liczbą lub
datę do określonego zakresu, określić wyrażenie regularne na String
itp

Problemem jest jedynie, że porządnie to jest to zrobione w warstwie
webowej (np. JSF), a na desktopach zrobione jest to słabiej. Nie jest
to łatwe zagadnienie na początku, na szczęście narzędzia wspierają tu
pracę (linki podałem wcześniej).

Przykład: http://www.vogella.de/articles/EclipseDataBinding/article.html

WOJSAL

unread,
Jan 16, 2011, 6:59:11 AM1/16/11
to
U�ytkownik Tomasz napisa�:

> Nie wspomniales nic o tym co caly czas bylo dla mnie najwiekszym
> problemem o konwersji typow z modelu do widoku i odrotnie.

To jest wlasnie w metodach kopiujModelDoWidoku() oraz
kopiujWidokDoModelu().

> Tak w Swingu jak w SWT widoki operuja na stringach a w modelu mam caly
> dostepny zestaw typow. Gdzie i jak mam pamietac przekomwertowane na
> stringi wartosci pol?

To jest pamietane w kontrolkach widoku. Swing oraz SWT sďż˝ realizowane wg
MVC i kazada kontrolka widoku ma tu sw�j model.

> Czy nalezy stworzyc Model2 w ktorym beda
> przechowywane pola z typami uzywanymi w widoku?

Nie ma takiej potrzeby.


Pozdrawiam,
Wojtek

Tomasz

unread,
Jan 16, 2011, 8:03:44 AM1/16/11
to

Użytkownik "WOJSAL" <wojsal...@neostrada.pl> napisał w wiadomości
news:4d32ddab$0$2495$6578...@news.neostrada.pl...
> Użytkownik Tomasz napisał:

>> Nie wspomniales nic o tym co caly czas bylo dla mnie najwiekszym
>> problemem o konwersji typow z modelu do widoku i odrotnie.
>
> To jest wlasnie w metodach kopiujModelDoWidoku() oraz
> kopiujWidokDoModelu().
>
>> Tak w Swingu jak w SWT widoki operuja na stringach a w modelu mam caly
>> dostepny zestaw typow. Gdzie i jak mam pamietac przekomwertowane na
>> stringi wartosci pol?
>
> To jest pamietane w kontrolkach widoku. Swing oraz SWT są realizowane wg
> MVC i kazada kontrolka widoku ma tu swój model.

>
>> Czy nalezy stworzyc Model2 w ktorym beda przechowywane pola z typami
>> uzywanymi w widoku?
>
> Nie ma takiej potrzeby.
>
Niezmierne dzieki, teraz mam juz jasny poglad na to jakie elementy sa
niezbedne w javie i SWT aby uzytkownik mogl komunikowac sie z baza danych.
Mialem troche nadziei ze mozna to wszystko zrobic prosciej ale skoro nie ma
innej mozliwosci to trudno.
Pisales ze Taki JSF juz sam aktualizuje model. Czy myslisz ze nikt nie
zrobil czegos podobnego dla Swinga czy SWT i czy rzeczywiscie ten JSF nie da
sie zastosowac do aplikacji desktopowych?

--
Tomasz


__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirusow 5791 (20110116) __________

WOJSAL

unread,
Jan 16, 2011, 8:21:30 AM1/16/11
to
Użytkownik Tomasz napisał:

>>
> Pisales ze Taki JSF juz sam aktualizuje model. Czy myslisz ze nikt nie
> zrobil czegos podobnego dla Swinga czy SWT


Byc moze ktos juz cos takiego zrobil. Tu inni koledzy proponowali takie
rozwiazania. Czyli zamiast proponowanych przeze mnie dwoch metod
kopiujacych do/z modelu, pewnie jest jakis framework/biblioteka gdzie:
definiujesz powiazanie w jakims XML komponent widokowy->pole w bazie czy
pole modelu calego widoku.
Tylko czy to bedzie prostsze? podejrzewam, ze watpie :)

>i czy rzeczywiscie ten JSF
> nie da sie zastosowac do aplikacji desktopowych?

JSF jest obslugiwany przez serwery aplikacji. W desktopie nie masz
serwera aplikacji. Poza tym JSF odwoluje sie do stron JSP a tego tez
nie masz w aplikacji deskptopowej. Wiec nie da sie tego tu zastosowac.
Co najwyzej JSF moze byc przykladem rozwiazania ktore moglo by byc
zaimplementowane w nowszych wersjach Swingu czy SWT. Czyli powiazanie
(binding) kontrolki widoku z modelem widoku (a nie jak to jest teraz z
modelem kontrolki). I najlepiej by to bylo rozwiazanie czystojavowe, bez
miliardow XMLi. Ale to juz tylko takie tam moje marzenia :)

Pozdrawiam,
Wojtek

Tomasz

unread,
Jan 16, 2011, 9:22:22 AM1/16/11
to

Użytkownik "WOJSAL" <wojsal...@neostrada.pl> napisał

I najlepiej by to bylo rozwiazanie czystojavowe, bez
> miliardow XMLi. Ale to juz tylko takie tam moje marzenia :)
>

Popytam Cie jeszcze o jedna rzecz ktora mnie niepokoi.
Aby krotko wyjasnic o co mi chodzi podam przyklad z Clippera.
Podczas wprowadzanych danych w oknie uzytkownika kontrolka wygladala na
przyklad tak:
@ 7,44 get nPROCPROW picture "99.99"
ten parametr picture "99.99" w tym przypadku pozwala na wprowadzenie
wylacznie cyfr i ew dwie cyfry po przecinku.
Mozliwosci roznych kombinacji tego parametru "picture" sa tak duze ze
praktycznie zalatwia to wszystkie potrzebne w dowolnej aplikacji kombinacje.
O ile sie orientuje to podobne mechanizmy byly zaimplementowane w wielu
jezykach programowania.
Robiac 3 lata temu pewien program w javie (SWT) stwierdzilem ku mojemu
zdumieniu ze tego typu obsluge musze sobie napiac sam.
Jak to wyglada w chwili obecnej w javie (SWT)?

kk

unread,
Jan 16, 2011, 12:10:44 PM1/16/11
to
Binding w SWT i w Swing jest robiony bez XMLi, ale bez gui edytora
może być trudny dla początkującego.

Statystycznie małą część oprogramowania robi się teraz na desktopy,
dlatego Swing i SWT się kurzą i mało ciekawych rzeczy się tam dzieje.
To o czym piszesz to pola maskowane, kiedyś była biblioteka, która to
wspierała dla SWT: http://sourceforge.net/projects/essentialdata/ , tu
powinna być taka i inne kontrolki, które natywnie np. przyjmują daty i
wartości liczbowe -> brak potrzeby konwertowania.

W praktyce łatwiej teraz napisać aplikację bazodanową w JSF, bo
kontrolki są lepsze, nie potrzeba konwerterów a walidacja dzieje się
sama, wystarczy dodać adnotacje np. @Email do pola, przykład kontrolek
z maskowaniem: http://www.primefaces.org/showcase/ui/inputMask.jsf

WOJSAL

unread,
Jan 16, 2011, 4:20:50 PM1/16/11
to
Użytkownik Tomasz napisał:

> Podczas wprowadzanych danych w oknie uzytkownika kontrolka wygladala na
> przyklad tak:
> @ 7,44 get nPROCPROW picture "99.99"
> ten parametr picture "99.99" w tym przypadku pozwala na wprowadzenie
> wylacznie cyfr i ew dwie cyfry po przecinku.

Nie przypominam sobie takiego maskowania w SWT. W Swing jest pole
JFormattedText. I tam można wrzucac maski, formaty pól do wprowadzania,
wyświetlania itp.

Czy Twoja aplikacja musi być dekstopowa? Bo jesli nie musi, to
może warto się zastanowić nad aplikacją webową, w JSF. Z tym że tu by
trzeba trochę o JSF poczytac.

Pozdrawiam,
Wojtek

Tomasz

unread,
Jan 16, 2011, 4:48:03 PM1/16/11
to

Użytkownik "kk" <kowalczyk...@gmail.com> napisał

To o czym piszesz to pola maskowane, kiedyś była biblioteka, która to
wspierała dla SWT: http://sourceforge.net/projects/essentialdata/ , tu
powinna być taka i inne kontrolki, które natywnie np. przyjmują daty i
wartości liczbowe -> brak potrzeby konwertowania.

Wyglada ze to jest to co mi jest potrzebne, sciagnalem zainstalowalem do
Eclipse ale niestety nie ma do tego zadnej dokumentacji. Jedyne co jest to
link do dokumentacji:
Please refer to
http://essentialdata.sf.net for the current documentation.
Niestety ta strona nie dziala w zwiazku z czym nie mam zielonego pojecia co
w tej bibliotece siedzi i jak to uzyc.
Masz moze jakis pomysl jak taka dokumentacje zdobyc. Szukalem w internecie
ale wszedzie byl tylko ten link.

--
Tomasz


__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirusow 5792 (20110116) __________

Tomasz

unread,
Jan 16, 2011, 5:14:15 PM1/16/11
to

Użytkownik "WOJSAL" <wojsal...@neostrada.pl> napisał

>
> Czy Twoja aplikacja musi być dekstopowa?

Raczj tak.
W czym wiec teraz pisze sie aplikacje desktopowe?
Moze dac sobie spokoj z Java i sprobowac zrobic to w delphi?

--
Tomasz


__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirusow 5792 (20110116) __________

WOJSAL

unread,
Jan 17, 2011, 2:37:06 AM1/17/11
to
W dniu 16.01.2011 23:14, Tomasz pisze:

> W czym wiec teraz pisze sie aplikacje desktopowe?

W Swingu lub w SWT. Ja wole Swing.

> Moze dac sobie spokoj z Java i sprobowac zrobic to w delphi?

W Javie tez mozna pisac aplikacje desktopowe. Wole Jave niz Delphi.

Pozdrawiam,
Wojtek

kk

unread,
Jan 17, 2011, 3:57:21 AM1/17/11
to
Jeżeli chodzi o dokumentacje, to ja zwykle korzystam z kodu źródłowego
lub testów jeśli są. Ostatecznie z Ctrl + Spacja i perspektywa Java
Browsing. Ale na tak niskim poziomie GUI to kodowałem dawno temu więc
teraz nie pamiętam co i jak się robiło.

Ogólnie to teraz aplikacji na desktopy się nie pisze ;) a tak na
serio, to jeśli się pisze komercyjną aplikację na desktop to zwykle
zaczyna się od kupienia komercyjnego zestawu kontrolek - i to za równo
w .Net jak i Java. Nie jest to potrzebne w QT podobno ;). Borland
swego czasu miał własną bibliotekę kontrolek, za równo do C++ jak i
oczywiście w Delphi, dlatego tak przyjemnie się pisało. No ale Delphi
aktualnie hmm, jest mało przyszłościowym językiem. Jeśli ktoś już
pisze na desktop to zwykle coś dużego i wtedy nawet napisanie własnych
kontrolek jest relatywnie niewielkim kosztem, albo i tak musi je
zrobić bo jest to mała aplikacja która ma robić coś dziwnego.
Platformy takie jak Eclipse RCP dają duże wsparcie do myślenia na
wyższym poziomie (np. http://redview.org/ , albo najnowsze E4 itp.) i
trzymania architektury w ryzach.

Kolejny projekt, który może być przydatny to
http://www.mvmsoft.de/content/plugins/rcpforms/rcpforms.htm

kk

unread,
Jan 17, 2011, 4:27:43 AM1/17/11
to
By jeszcze bardziej utrudnić Ci życie, to w Eclipse jest jeszcze jeden
projekt, który jest kolejną warstwą abstrakcji nad SWT, ale
prawdopodobnie robi wszystko co potrzebujesz. W sumie nie wiem czemu
nie napisałem o nim na początku, pewnie dlatego, że jeszcze z niego
nie korzystałem nigdy, ale tak po zastanowieniu, myślę, że najlepiej
by pasował jeśli cię nie przerazi :)

Przykłady kodu z obsługa pewnych zabawnych kontrolek:
http://wiki.eclipse.org/Riena_Snippets
Strona o tym: http://wiki.eclipse.org/Riena_Project (na dole masz
listę tutoriali)

Plusy: ma trochę ulepszone kontrolki, ma od razu wbudowane metody ala
"odczytaj dane z modelu" i bindowanie, wspiera budowę całej aplikacji
w różne sposoby
Minusy: większa część możliwości nie będzie cię interesować (jak osgi
albo uruchamianie widoku przez www), jest to duża kobyła, daleko
ucieka od SWT no i ma duże założenia odnośnie jak aplikacja powinna
wyglądać ;)

Riena ma swoją osobną logikę tworzenia aplikacji (stworzony po to by
szybko robiło się aplikacje bazodanowe) i wymaga więcej konfiguracji
niż prosta aplikacja w SWT, no i każda wygląda bardzo podobnie (menu,
lewy pasek i system zakładek), ale jeśli ma wszystkie potrzebne rzeczy
to na prawdę powinno się sprawdzić, jeśli nie, to pisanie własnej
kontrolki może być tutaj trudniejsze (tego nie wiem).

kk

unread,
Jan 17, 2011, 4:32:56 AM1/17/11
to
http://www.eclipse.org/nebula/ - dodatkowe komponenty SWT w tym
FormatedText

Tomasz

unread,
Jan 17, 2011, 5:33:43 AM1/17/11
to

Uzytkownik "kk" <kowalczyk...@gmail.com> napisal

> http://www.eclipse.org/nebula/ - dodatkowe komponenty SWT w tym
> FormatedText
>

Ta biblioteke to akurat uzywalem w aplikacji ktora pisalem 3 lata temu.
Oczywiscie w pewnych przypadkach pomagalo ale i tak przy moich przerobkach.
Ogolnie nie bylem z tego zadowolony.

Ale w innym poscie piszesz ze:
jesli sie pisze komercyjna aplikacje na desktop to zwykle
zaczyna sie od kupienia komercyjnego zestawu kontrolek - i to za równo


w .Net jak i Java.

Ta sugestia bardzo mnie zainteresowala, inwestor z pewnoscia polknie te
koszty z przyjemnoscia a ja mniej sie narobie i calosc bedzie duzo szybciej.
Powiedz mi gdzie powinienem szukac takich komercyjnych kontrolek do javy.
Czy one sa pisane pod Swing lub SWT czy tez maja wszystkie okienka w swoich
komercyjnych bibliotekch?

--
Tomasz


__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirusow 5793 (20110117) __________

kk

unread,
Jan 17, 2011, 6:36:47 AM1/17/11
to
Dla Swing:
http://www.javadesktop.org/rollups/components/index.html

Dla .Net / C# to bardzo miło wspominam jak korzystałem z komponentów
od http://www.devexpress.com/

Może tam nie być tego czego szukasz. Dla SWT nie znam, może nie być
wcale.

Tomasz

unread,
Jan 18, 2011, 11:58:43 AM1/18/11
to

Użytkownik "kk" <kowalczyk...@gmail.com> napisał

Może tam nie być tego czego szukasz.

Troche z innej beczki moze wiesz jak to przelknac.
Probuje zaimportowac dane z jakiegos pliku bezposrednio do bazy przy pomocy
:

PreparedStatement ps = connection.prepareStatement("INSERT INTO
wl_auftrag( "
+ "status, record_nr, auftrag_nr, auftrag_datum)" + " VALUES (" + "'" +
status
+ "', '" + record_nr + "', '" + auftrag_nr + "', '" + auftrag_datum +
"');");

Rekordow do przepisania jest kilkanascie tysiecy i data w zmiennej
auftrag_datum jest raz wypelniona poprawna data a raz "null". Dopóki nie
trafie na date = null inserty ida poprawnie, po napotkaniu na null dostaje
komunikat :

ERROR: invalid input syntax for type date: "null"

Jesli w podobnym insercie wpisze dane z reki i tam bedzie null to taki
insert sie wykonuje poprawnie ale jesli ten null jest w zmiennej to daje
komunikat bledu.

Od kilku godzin szukam rozwiazania i nic mi nie wychodzi.
Oczywiscie moge zamienic date null na jakas 0001.01.01 ale to bedzie
wygladac troche glupio.
Masz moze jakis pomysl?

--
Tomasz


__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirusow 5797 (20110118) __________

Lesiok

unread,
Jan 18, 2011, 12:09:46 PM1/18/11
to
null nie może być ujęty w apostrofy a u Ciebie tak jest.
Musisz najpierw sprawdzić czy auftrag_datum jest null i dopiero wtedy
odpowiednio zbudować SQL-a.


--
================================
Leszek KUBRAK

Tomasz

unread,
Jan 18, 2011, 12:18:12 PM1/18/11
to

Użytkownik "Lesiok" <les...@infokub.com.pl> napisał

>>
> null nie może być ujęty w apostrofy a u Ciebie tak jest.
> Musisz najpierw sprawdzić czy auftrag_datum jest null i dopiero wtedy
> odpowiednio zbudować SQL-a.

Tak tez w pewnym momencie myslalem ale to mi sie wydawalo zbyt
przekombinowane. W tym rekordzie mam 5 roznych pol z datami i kazda moze byc
data lub nulem, jak to zrobic najprociej?

Zbigniew Malec

unread,
Jan 18, 2011, 12:41:07 PM1/18/11
to
On Tue, 18 Jan 2011 17:58:43 +0100, Tomasz wrote:

> PreparedStatement ps = connection.prepareStatement("INSERT INTO
> wl_auftrag( "
> + "status, record_nr, auftrag_nr, auftrag_datum)" + " VALUES (" + "'" +
> status
> + "', '" + record_nr + "', '" + auftrag_nr + "', '" + auftrag_datum +
> "');");


Paaaaanie, tak to si� nie robi. To jest wr�cz podr�cznikowy przyk�ad, jak
tego nie robiďż˝. Poczytaj o PreparedStatement w javie trochďż˝ najpierw i
dopiero wr�� do problemu.

PreparedStatement ps = connection.prepareStatement(
"INSERT INFO wl_auftrag(status, record_nr, auftrag_nr, auftrag_datum)
VALUES (?, ?, ?, ?)";

ps.setString(1, "");
ps.setInteger(2, record_nr);
...

--
Pozdrawiam
Zbyszek Malec

Tomek Łabuz

unread,
Jan 18, 2011, 12:41:23 PM1/18/11
to
W dniu 2011-01-18 18:18, Tomasz pisze:

>
> Użytkownik "Lesiok" <les...@infokub.com.pl> napisał
>
>>>
>> null nie może być ujęty w apostrofy a u Ciebie tak jest.
>> Musisz najpierw sprawdzić czy auftrag_datum jest null i dopiero wtedy
>> odpowiednio zbudować SQL-a.
>
> Tak tez w pewnym momencie myslalem ale to mi sie wydawalo zbyt
> przekombinowane. W tym rekordzie mam 5 roznych pol z datami i kazda moze
> byc data lub nulem, jak to zrobic najprociej?
>

zapoznaj się z parametrami przekazywanymi do PreparedStatement
powinny rozwiązać ten problem
Pozdrowienia

Tomasz

unread,
Jan 18, 2011, 3:18:45 PM1/18/11
to

Użytkownik "Zbigniew Malec" <al...@invalid.invalid> napisał

>
> PreparedStatement ps = connection.prepareStatement(
> "INSERT INFO wl_auftrag(status, record_nr, auftrag_nr, auftrag_datum)
> VALUES (?, ?, ?, ?)";
>
> ps.setString(1, "");
> ps.setInteger(2, record_nr);
> ...

No, to jest porada konkretna, od razu zaczelo mi wszystko dzialac.
Dla mnie, ktory sporo czasu spedzil na pisanie zapytan SQl, taki
PreparedStatement wydawal sie narzedziem gdzie bede mogl skopiowac cale
zapytania SQL jak leci. Okazuje sie ze jest to narzedzie bardziej
skomplikowane. Na nauke nigdy za późno.

--
Tomasz


__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirusow 5798 (20110118) __________

Zbigniew Malec

unread,
Jan 20, 2011, 3:38:31 AM1/20/11
to
On Tue, 18 Jan 2011 21:18:45 +0100, Tomasz wrote:

> No, to jest porada konkretna, od razu zaczelo mi wszystko dzialac.
> Dla mnie, ktory sporo czasu spedzil na pisanie zapytan SQl, taki
> PreparedStatement wydawal sie narzedziem gdzie bede mogl skopiowac cale
> zapytania SQL jak leci. Okazuje sie ze jest to narzedzie bardziej
> skomplikowane. Na nauke nigdy za późno.

Oczywiście teoretycznie możesz sobie skleić całe zapytanie i już gotowe
uruchomić z pomocą PreparedStatement, jednak to podejście ma swoje wady.
Przede wszystkim jest podatne na SQL injection, jest mniej czytelne oraz
może być wolniejsze (jednego prepared statementa możesz wykonać wiele razy,
wystarczy żebyś przed każdym wywołaniem execute ustawił nowe wartości
zmiennych '?'). Wobec powyższego (jak mawiał mój nauczyciel geografii
jeszcze w liceum), pokazana przeze mnie metoda użycia PreparedStatement
jest jedyną słuszną! :)

--
Pozdrawiam
Zbyszek Malec

Tomasz

unread,
Jan 20, 2011, 4:24:47 AM1/20/11
to

Użytkownik "Zbigniew Malec" <al...@invalid.invalid> napisał
(jednego prepared statementa możesz wykonać wiele razy,
> wystarczy żebyś przed każdym wywołaniem execute ustawił nowe wartości
> zmiennych '?'). Wobec powyższego (jak mawiał mój nauczyciel geografii
> jeszcze w liceum), pokazana przeze mnie metoda użycia PreparedStatement
> jest jedyną słuszną! :)

Widze tu jeszcze inna zalete.
Takie podstawienie danych do ps jast bardziej przejrzyste i latwiejsze do
analizowania i ewentualnych modyfikacji.

ps.setString(1, status);
ps.setInt(2, record_nr);
ps.setInt(3, auftrag_nr);
ps.setDate(4, auftrag_datum);
ps.setString(5, lieferzeit);
ps.setInt(6, kd_nr_alt);
ps.setFloat(7, teile_betrag);
ps.setFloat(8, lohn_betrag);
ps.setFloat(9, fleistung_betrag);
ps.setFloat(10, gesamt_betrag);
ps.setFloat(11, bezahlung);
ps.setDate(12, bezahlung_datum);
ps.setDate(13, mahnung_datum);
ps.setInt(14, ofpo_nr);
ps.setString(15, reserve);
ps.setDate(16, rechnung_datum);
ps.setInt(17, mahnstufe);
ps.setString(18, abrechnung_period);
ps.setString(19, arbeit_art);
ps.setFloat(20, fleistung_ek_betrag);

--
Tomasz


__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirusow 5801 (20110119) __________

Jacek Czerwinski

unread,
Jan 20, 2011, 6:23:55 AM1/20/11
to
W dniu 2011-01-20 10:24, Tomasz pisze:

>
> Takie podstawienie danych do ps jast bardziej przejrzyste i latwiejsze
> do analizowania i ewentualnych modyfikacji.
>
> ps.setString(1, status);
...
> ps.setFloat(20, fleistung_ek_betrag);


serio? przejrzyste? Noooo moze tak, palców w sumie mamy po 20 ...

Dla mnie wszystko co jest na parametrach pozycyjnych to tkwi w Cobolach
czy innych latach 60-tych.

Taki przyklad negatywny na krotkiej kwerendzie:

select * from y where a=? or b=?
gdy oba pytajniki sa rowne

select * from y where a=:par or b=:par

Ktore czytelniejsze?
Nie wspomnie o konserwowaniu kwerendy i dodaniu w srodku 11-go i 12-go
parametru, ale za to z usunieciem 4-go.

Dla mnie wylacznie Spring JDBC named template, jesli nie bede wierny tej
bibliotece, to tylko dlatego ze znajde cos rownowaznego. Do tego fajna
abstrakcja Map z aktualnymi parametrami, ktora nie jest konkrenym
obiektem JDBC, bardzo sie przydaje.

W kazdym srodowisku SQL (Win/Java/C++/VCL/cokolwiek itd) tak dlugo krece
nosem, az znajde cos na tym poziomie.


WOJSAL

unread,
Jan 20, 2011, 7:23:10 AM1/20/11
to
W dniu 20.01.2011 12:23, Jacek Czerwinski pisze:

>
> select * from y where a=? or b=?
> gdy oba pytajniki sa rowne
>
> select * from y where a=:par or b=:par

To juz rzecz gustu. :)

>
> Ktore czytelniejsze?
> Nie wspomnie o konserwowaniu kwerendy i dodaniu w srodku 11-go i 12-go
> parametru, ale za to z usunieciem 4-go.
>

Tu masz racje - to jest wada PrepearedStatemnet.
Natomiast zaleta PreparedStatement:
- szybkosc (przy powtarzanych zapytaniach)
- prosta konwersja (tj. nie musisz sie zastanawiac co dac w uszach co
nie, jaki jest format daty, liczby przecinkowej itp)

>
> W kazdym srodowisku SQL (Win/Java/C++/VCL/cokolwiek itd) tak dlugo krece
> nosem, az znajde cos na tym poziomie.
>

A zamiast krecic nosem nie szybciej samemu zaimplemnetowac taki
SimpleJdbcTemplate?
:)

Pozdrawiam,
Wojtek

Jacek Czerwinski

unread,
Jan 20, 2011, 9:37:55 AM1/20/11
to
W dniu 2011-01-20 13:23, WOJSAL pisze:

> W dniu 20.01.2011 12:23, Jacek Czerwinski pisze:

> Tu masz racje - to jest wada PrepearedStatemnet.
> Natomiast zaleta PreparedStatement:
Do preparowania nie trzeba mnie przekonywac.

Do Twoich argumentow dodam bezpieczensto czy przed SQL injection, ale i
banalne przed znakami specjalnymi (grube i chude pazurki zwane
kabyczkami i co tam jeszcze sie trafi) w danych. Bohaterskie escapowanie
mnie nigdy nie przekonywalo.


>> W kazdym srodowisku SQL (Win/Java/C++/VCL/cokolwiek itd) tak dlugo krece
>> nosem, az znajde cos na tym poziomie.


> A zamiast krecic nosem nie szybciej samemu zaimplemnetowac taki
> SimpleJdbcTemplate?
> :)

Dokladnie.

W C++ mam ten problem, stara aplikacja w MFC, wersję 12.0 musze na cos
przeniesc. Dla jednej aplikacji MFC nie bede platnego microsofta
kupowal. Na dzis oryginalne recordsety mam juz mocno owrapowane w mój
kod, wiec jeden krok zostal. Wraper zasadza sie, wstyd sie przyznac, na
podstawieniach stringow $data_faktury$ :P


0 new messages