UnixCode Posted March 7, 2012 Posted March 7, 2012 Γεια σε όλους είχα κάνει παρόμοιο τόπικ πριν πολύ καιρό αλλά μιας και τώρα καταλαβαίνω τα πράγματα 1000 φορές καλύτερα είπα να ξανακάνω, άλλωστε αυτό θα περιέχει πιο πολλά πράγματα. Σήμερα θα μιλήσουμε συγκεκριμένα για το πώς μπορούμε να κάνουμε συνδέσεις στην database μέσω Java στο L2J και πώς μπορούμε να εκτελούμε εντολές και όλα τα σχετικά Πότε και πού χρησιμοποιούμε SQL connections, σε τι είναι χρήσιμες? Σίγουρα κάποιος πρώτη φορά θα το αναρωτηθεί. Λοιπόν καταρχάς συνδέσεις με database θα χρειαστόυμε σε περιπτώσεις που θέλουμε να πάρουμε στοιχεία απο την database (λογικό) από οποιοδήποτε table,column θέλουμε εμείς και σε περιπτώσεις που θέλουμε κάτι να περάσουμε μέσα στην database μας. Το καλό πράγμα σε όλη την ιστορία που χωρίς αυτό δεν θα είχε και νόημα,είναι ότι στην database τα πράγματα μας μένουν και μετά το restart του server μας , μένουν για πάντα αν το θελήσουμε! (ανάλογα βέβαια) Χαρακτηριστικά Παραδείγματα : donate system , nobless , pvp kills. Και τα 3 παρατηρείτε ότι δεν διαλύονται με το rr του server , ένας donator είναι και μετά το rr donator, ένας nobless είναι Nobless και μετά το rr και ένας παίκτης μετά το rr του server έχει όσα pvp είχε πριν, δεν μηδενίζονται. Πολλά λόγια , πάμε στο ψητό , ας αρχίσουμε Θα προσπαθήσω να το εξηγήσω όσο καλύτερα μπορώ. Καταρχάς κάνουμε Import για αρχή τα εξής import java.sql.Connection; import java.sql.PreparedStatement; import net.sf.l2j.L2DatabaseFactory; Όπως βλέπετε έχουμε κάνει Import την κλαση Connection και την κλάση PreparedStatement . κλάση Connection: με αυτή θα δημιουργήσουμε την σύνδεση μας για να μπούμε στην database του server, το λέει και η λέξη , έτσι δεν είναι?(Connection=σύνδεση) κλάση PreparedStatement: στην SQL εκτελόυμε συνέχεια statements ( προτάσεις - εντολές ). π.χ ΚΑΝΕ ΟΛΟΥΣ ΤΟΥΣ ΠΕΚΤΕΣ ΝΟΒΛΕΣΣ Αυτή είναι μια πρόταση που εκτελείται , βέβαια όχι έτσι αλλά στην SQL για να το κάνουμε αυτό γράφουμε UPDATE characters SET nobless=1 WHERE accesslevel=0 πχ έτσι κάνουμε nobl τους παίκτες που δεν ειναι GM Άρα αυτή η κλάση μας βοηθάει σε αυτό , να δημιουργήσουμε προτάσεις σε SQL μέσω Java. Αφού πλέον γνωρίζουμε σε τι θα μας χρειαστούν αυτές οι 2 κλάσεις πάμε να τις χρησιμοποιήσουμε. Καταρχάς δημιουργούμε ένα αντικείμενο για την καθεμία κλάση βάζοντας το τιμή null προς το παρόν δηλαδή άδεια τιμή , δεν θα περιέχει τίποτα. Connection connection = null; PreparedStatement state = null; Τώρα καταλαβαίνετε και οι ίδιοι σας ότι η σύνδεση είναι δυνατόν να μην πετύχει 100% ειδικά αν έχει και προτάσεις μέσα λόγω λαθών στην σύνταξη του SQL ή ακόμα λόγω της μη-ύπαρξης της database άρα θα χρειαστούμε να περυκυκλώσουμε τον κώδικα μας με try/catch. Τα προσθέτουμε λοιπόν try { } catch(Exception e) { e.printStackTrace(); } μέσα στα blocks του try θα είναι ο κύριος code. στο catch βλέπουμε πως βάλαμε την μέθοδο e.printStackTrace(); η οποία είναι καλή να την βάζετε γιατί αν εμφανιστεί οποιοδήποτε error θα σας το εμφανίζει στο GS και θα είναι πιο εύκολο να το fix. Πάμε λοιπόν να δώσουμε ζωή στα αντικείμενα που δημιουργήσαμε νωρίτερα και μη ξεχάσαμε απο δω και πέρα ότι κάνουμε είναι μέσα στο try . Καταρχάς λέμε πως το αντικείμενο connection θα είναι μια σύνδεση η οποία συνδέεται με την database που τρέχει ο server, για να το κάνουμε αυτό γράφουμε connection = L2DatabaseFactory.getInstance().getConnection(); Αυτό μονάχα,πλέον έχουμε σύνδεση στην database χρησιμοποιώντας το connection.Τώρα θα μπορούσαμε να κλείσουμε τη σύνδεση κάλλιστα , αλλά κανένας ο λόγος να δημιουργήσουμε σύνδεση χωρίς ουσιαστικό λόγο. Ήρθε η ώρα να χρησιμοποιήσουμε το άλλο μας αντικείμενο, το state . Αυτό απλά είναι αυτο που είπαμε, θα το κάνουμε να παίρνει μια πρόταση την οποία θα εκτελέσουμε αργότερα στην database . Ας πούμε ότι θέλω να κανω το name σε όλους τους GM, ADMINISTRATOR. Άχρηστο φυσικά γιατί μπορούμε να το κάνουμε και χωρίς connection(και πάλι άχρηστο) στην database αλλά είναι ένα παράδειγμα για να δείτε πως δουλεύει , γράφουμε state = connection.prepareStatement("UPDATE characters SET char_name='ADMINISTRATOR' WHERE accesslevel>0"); Το update το χρησιμοποιούμε για να αλλάξουμε τιμές στην database σε υπάρχον πράγματα , εδώ αλλάξαμε το ονομα τον GMS. Έτοιμο και το state , τώρα τι μένει? να εκτελέσουμε τη πρόταση(το state δηλαδή πλέον). άρα έχουμε state.execute(); το εκτελέσαμε , αυτό ήταν. και τώρα αυτό που δεν ξεχνάμε ποτέ να κάνουμε είναι να κλείσουμε τη σήνδεση αλλά και την πρόταση αλλιώς θα έχουμε έρρορς άρα πολύ απλά γράφουμε connection.close(); state.close(); Αν βρει καποιο έρρορ παει κατευθείαν στο catch , τώρα προσθέτουμε και το εξής finally { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } Με το finally λέμε τι θα κάνει τελικά και αυτό που θέλουμε να κάνει τελικά στα σίγουρα , ειναι να κλείνει την σύνδεση , άρα έτσι εξηγείται το παραπάνω. Αυτό ήταν ολόκληρος ο κώδικας θα είναι έτσι Connection connection = null; PreparedStatement state = null; try { connection = L2DatabaseFactory.getInstance().getConnection(); state = connection.prepareStatement("UPDATE characters SET char_name='ADMINISTRATOR' WHERE accesslevel>0"); state.execute(); connection.close(); state.close(); } catch(Exception e) { e.printStackTrace(); } finally { try { connection.close(); } catch (Exception e) { e.printStackTrace(); } } Αυτό ήταν ένα καθαρό εύκολο παράδειγμα για το πως ανανεώνουμε (UPDATE) υπάρχον στοιχεία στην database μας. Τώρα πάμε να δούμε πώς θα διαβάζουμε απο την database Στο παράδειγμα θα διαβάσουμε πόσα pvp έχει ένας παίκτης με ονομα Unix για παράδειγμα. αρχίζουμε πάλι το ίδιο γράφουμε τα ίδια: Connection connection = null; PreparedStatement state = null; try { } catch(Exception e) { e.printStackTrace(); } finally { try { connection.close(); } catch (Exception e) { e.printStackTrace(); } } Και τώρα μέσα στο try πάμε για τον κύριο code, δεν εξηγώ τι κάνει το καθένα τώρα τα είπα παραπάνω. Δημιουργουμε το connection connection = L2DatabaseFactory.getInstance().getConnection(); Και τώρα το κύριο που αλλάζει είναι η πρόταση , το state . γράφουμε state = connection.prepareStatement("SELECT pvpkills FROM characters WHERE char_name='Unix'"); Έτσι διαλέγουμε ( select ) τα pvpkills απο το table characters(FROM characters) όπου ονομα ισούται με Unix(char_name='Unix') Τώρα δεν θα εκτελέσουμε τον κώδικα γιατί δεν έχει ουσία δε θα συμβεί τίποτα. Δημιουργούμε μια μεταβλητή int στην οποία θα αποθηκεύονται το πόσα pvp έχει. int pvps = 0 Τώρα για να πάρουμε το αποτέλεσμα της πρότασης (state) και να το αποθηκεύσουμε στην μεταβλητη pvps θα χρειαστεί να κάνουμε import μια νέα κλάσση με όνομα ResultSet import java.sql.ResultSet; η κλάση αυτή μας βοηθάει να πάρουμε το εκτελέσιμο αποτέλεσμα , εδώ συγκεκριμένα τα pvpkills του παίκτη Unix. Τώρα πάμε κάτω απο το αντικείμενο connection και δημιουργούμε και ένα αντικείμενο ResultSet με άδεια τιμή προς το παρόν ResultSet rset = null; Μετά πάμε εκεί που είχαμε μείνει και δίνουμε αξία στο αντικείμενο rset , γράφουμε rset = state.executeQuery(); Τώρα δώσαμε τιμή στο rset, με αυτην την εντολή λέμε στο rset να δωθεί στην ουσία το αποτέλεσμα της πρότασης (state) Ωραία , τώρα πως δίνουμε το αποτέλεσμα που είναι τα pvp kills στην μεταβλητη pvps? Γράφουμε while(rset.next()) { pvps = rset.getInt("pvpkills"); } Λιγο περίπλοκο ε?Είναι απλό . με το while(rset.next()) λέμε ουσιαστικά όσο το αντικείμενο rset ( που ειναι το αποτελεσμα ) έχει κάτι να μας δώσει, έχει ένα αποτέλεσμα (στην ουσία έχει 1 γιατί μονο απο 1 παικτη παιρνουμε τα pvps) τότε η μεταβλητη pvps να ισούται με την μεταβλητή pvpkills του rset , to pvpkills είναι αυτό που γράψαμε στην πρόταση μας. SELECT pvpkills , έτσι παίρνουμε την τιμή του. άρα τώρα αυτό ηταν, η μεταβλητή pvps δηλώνει πόσα pvps έχει ο παίκτης Unix. άρα λοιπόν τώρα κλείνουμε ότι πριν αλλά και το rset connection.close(); rset.close(); state.close(); Αυτά ήταν κάτι βασικά που πρέπει να ξέρετε, διαβάστε τα κάντε εξάσκηση και δέστε παραδείγματα απο διάφορα codes που χρησιμοποιούν συνδέσεις στην database, σίγουρα θα καταλαβαίνετε πολλά περισσότερα :D Quote
Darule Posted March 9, 2012 Posted March 9, 2012 Poly kalo guide +oti tha prepei na kseroun na ftiaxnoun sql queries kai episis poly simantiko kalo tha itan ta queries na ta ftiaxnete kai na ta dokimazete stin navicat apo to na kanete compile kai na deite meta oti exete sintaktiko lathos. Quote
UnixCode Posted March 10, 2012 Author Posted March 10, 2012 Fobero guide. Gj UnixCode. thanks bro Poly kalo guide +oti tha prepei na kseroun na ftiaxnoun sql queries kai episis poly simantiko kalo tha itan ta queries na ta ftiaxnete kai na ta dokimazete stin navicat apo to na kanete compile kai na deite meta oti exete sintaktiko lathos. euxaristw Quote
xFranky Posted December 12, 2013 Posted December 12, 2013 (edited) Ευχαριστώ πάρα πολύ ρε αδελφέ! Τώρα μπορώ να φτιάχνω τους δικούς μου κώδικες γρήγορα και εύκολα με της γνώσεις που έχω στο java! Edited December 12, 2013 by BadSystem™ Quote
xdem Posted December 12, 2013 Posted December 12, 2013 gtp einai ta code, outdated twra apla vazeis try( ) { } kai den xriazete na kaneis close se finally pou merikes fores petane npe Quote
arisPlC Posted December 12, 2013 Posted December 12, 2013 gtp einai ta code, outdated twra apla vazeis try( ) { } kai den xriazete na kaneis close se finally pou merikes fores petane npe malon den prosekses oti lei oti ftiaxtike martio tou 2012 tote etsi itane Quote
xdem Posted December 12, 2013 Posted December 12, 2013 malon den prosekses oti lei oti ftiaxtike martio tou 2012 tote etsi itane to try with resources vgike me tin java7 to 2011 trele, dld ena xrono peripou prin to guide Quote
arisPlC Posted December 12, 2013 Posted December 12, 2013 nai omos to il tis l2j litourgouse me java 6 kai nmz akoma me 6 doulevi Quote
xdem Posted December 12, 2013 Posted December 12, 2013 nai omos to il tis l2j litourgouse me java 6 kai nmz akoma me 6 doulevi asxeto Quote
xdem Posted December 12, 2013 Posted December 12, 2013 vasika stin eipe dikio exei emena mou tin ipe? Quote
Grax Posted December 12, 2013 Posted December 12, 2013 Can someone translate this to english ? Or make another topic.. Quote
Nightw0lf Posted December 16, 2013 Posted December 16, 2013 (edited) gtp einai ta code, outdated twra apla vazeis try( ) { } kai den xriazete na kaneis close se finally pou merikes fores petane npe ++ Edited December 16, 2013 by Nightw0lf Quote
BlackDevilDev Posted January 3, 2014 Posted January 3, 2014 oraios odigos file mou den to exw xanadei prosopika egw ... Tha ithela na kanw mia erotisi tha mporousa na xrisimopoiisw auto ton tropo gia admin panel event live , diladi na kanw event live mesa ston server mou ? h tha ypirxe problima lags k.t.l? Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.