• Nenhum resultado encontrado

PromptFrame.this. dispose();

} }

} , , , , , , ,

Λ ί σ τ α 1 2 .1 2 Μ ια γενικ ή κ α τη γο ρ ία π λ α ισ ίω ν γ ια τις επ ιτροπ ές εισ α γω γή ς χρηστώ ν:

try {

Statement stmt = conn.createStatement();

ResultSet rows = stmt.executeQuery( query);

ResultSetMetaData metaData = rows.getMetaDq.ta();

int columnCount = metaData.getColumnCount();

String[] columnNames = new String [columnCount];

for ( int i= 0; i < columnCount; ++i ) {

columnNames[i] = metaData.getColumnName( (i + 1.) );

}

results.add( columfiNames);

while ( rows.next() ) {

String[J values =new String [columnCountJ;

for ( int i ~ 0; i < columnCount; ++i ) {

values[i] =rows.getstring( (i+l));

}

results.add( values);

} }

catch( SQLException sqlX ) {

results = null;

string msg = "Failed to execute query.\n"

+ sqlExceptionReader.readException( sqlX );

JOptionPane.showMessageDialog( querypanel, rosg,

"Query Failure", Joptionpane.ERROR_MESSAGE );

}

return (results);

}

private Connection conn =null;

private Querypanel querypanel = new Querypanel();

private final static int ROWS = 10;

private final static int COLS =50;

private final static String QUERY_CMD = "Run Query";

class Querypanel extends Jpanel {

Querypanel () {

setLayout( new BorderLayout() );

add( new JLabel( "SQL Query:" ), BorderLayout.NORTH );

sqlArea.setRowS( ROWS);

sqlArea.setColumns( COLS );

sqlArea.setLineWrap( true);

add( sqlArea, BorderLayout.SOUTH );

}

string getQuery() {

return (SqlArea.getText());

}

private JTextArea sqlArea = new JTextArea() ; }

} . , , ,

Λ ί σ τ α 1 2 .1 3 Ο εκ π ρόσω π ος στόχου ερώ τη ση ς SQ L

«<>1 Qu b i v:

5=i fcr. 1 - -

< ' i

‘- n u h K O l·.·'· tl i ,■ ·n i|

j ' . ftur» O u e r y ' - · ' ; |

Σ χ ή μ α 1 2 .3 Έ ν α γ ρ ή γο ρ ο π λα ίσ ιο π ου χ ρ η σ ιμ ο π ο ιείτα ι από το στόχο ερώ τη σ η ς SQ L

i m s s · κ : f i i i l

ieo w ti . ' 7 7 / . A . ; · · ■:

i f 1 ' V :

fifjyyr •■ wrrw vw

v

! ...' '■... ■ ■ ■■■ ■ ' ,· .... ·.■■■; .1.

Σ χ ή μ α 1 2 .4 Τ ο π λα ίσιο α π οτελεσ μ ά τω ν στόχου S Q L

Ο στόχος στηλών επίδειξης

Για διοικ η τικ ού ς κ αι λ ό γου ς α νά π τυξης, η π ρόσβ α ση στη λ ώ ν ενός π ίνα κ α είναι συ χνά χρήσιμ η.

Ε ίναι α κ ριβ ώ ς τύ π ο ς π ρ όσ β α σ η ς π ου οι επ όμ ενες υ π οσ τη ρ ίξεις στόχ ω ν μας. Ό π ω ς μ π ο ρ ο ύ ν να δουν στη λ ίσ τα 12.14, η εφ α ρμ ογή τη ς S h ow C o lu m n s π ύ λη ς το ίδιο σ χ έδιο π ου χ ρ η σ ιμ ο π ο ιείτα ι γ ια τη ν ερώ τηση ta S k SQL. Ο ι διεπ αφ ές κ α ι A c tio n L is te n e r είναι, η μ έθ οδος π ου κ αθ ορίζεται, και ένα P rom p tF ra m e χ ρ η σ ιμ ο π ο ιείτα ι γ ια να λ ά β ει τη ν π ρόσθετη εισ α γω γή από το χ ρ ή στη -ένα π ίνα κ α ονόμ α σε α υ τή ν τη ν π ερίπ τω ση . Η Β άση Δ εδο μ ένω ν η σχετική εργα σία είνα ι κλειστή μ έθοδος, κ α ι τα α π οτελέσ μ α τα εκ θ έτοντα ι ως π ίνακας.

Ό π ω ς μ ε το στόχ ο π λ η ρ ο φ ο ρ ιώ ν βά σεω ν δεδομ ένω ν, είμ α σ τε δια θ έσ ιμ οι μ έσω ενός αντικειμ ένου βά σεω ν δ εδομ ένω ν (D aw b a seM etaD ata). Α υ τή η ευκολία, επ ικ α λο ύ μ α σ τε μ έθοδος, η οποία επ ιστρ έφ ει ένα α ντικ είμ ενο R esu ltS et οι του οπ οίου σειρές κ α θ ο ρ ίζο υ ν κ ά θ ε στήλη σ τον α ντίστοιχο π ίνα κ α το "σχέδιο % ” π ου π α ρ έχ ετα ι ως τέτα ρ τη π α ρ ά μ ετρ ος σ ε g etC olu m n s() τα ιρ ιά ζει μ ε ο π οιοδή π οτε όνομ α στηλών. Για κ ά θ ε στήλη, λ α μ β ά ν ο υ μ ε το όνομ α, το ν τύ π ο M ySQ L, το μ έγεθ ος στηλών, κ αι το ν κ ώ δ ικ α τύ π ω ν J D B C επ ιπ λέον, εξά γο υ μ ε μ ια αξία π ου δ είχ νει εά ν μ ια στήλη δέχ εται μ ια Μ Η ΔΕ Ν ΙΚ Η αξία.

Δ εδομ ένου ότι ο τύ π ο ς J D B C π α ρ έχ ετα ι ω ς κ ώ δ ικ α ς α κ έρ α ιω ν αριθμ ώ ν, η α να γνω σ ιμ ότη τά τη ς α φ ή νει το π ρ ά γμ α για να επ ιδιω χτεί. Για να α ντιμ ετω π ίσ ει αυτό το ζήτημ α, ο κ ώ δικ α ς τύ π ω ν JD B C χ α ρ τογρ α φ είτα ι σ ε ένα α ντίστοιχο όνομ α τύ π ω ν χ ρ η σ ιμ ο π ο ιώ ντα ς τη ν κ α τη γο ρ ία J d b c T Y P e s π ου π α ρ ο υ σ ιά ζετα ι στη λ ίσ τα 12.15. Α υ τή η κ α τη γο ρ ία είναι α κριβώ ς ένα λ επ τό π ερ ιτύ λιγμ α γύ ρ ω από ένα H ash M ap π ου π α ρ έχ ει μ ια χ α ρτογρά φ η ση μ ετα ξύ τω ν ονομ ά τω ν κ αι τω ν κ ω δ ίκ ω ν π ου κ α θ ο ρ ίζο ντα ι από τη ν κ α τη γο ρ ία ja va .s q l.T Y P e s. Τ ο σχ ή μ α 12.5 π α ρ ο υ σ ιά ζει ένα δείγμ α τω ν α π οτελεσ μ ά τω ν π ου π α ρ ά γοντα ι από α υ τόν το ν στόχο.

package mysqljava;

import java.sql.*;

import java.util.*;

import java.awt.*;

import j ava.awt.event.*;

import javax.swing.*;

public class ShowColumns implements TaskDelegate, ActionListener {

public ShowColumns() {}

public boolean execute ( Connection conn) {

this. conn = conn;

new PromptFrame( "Table Name", SHOW_CMD, tablePanel, this);

return (true);

}

public void actionPerformed( ActionEvent ae ) {

if ( ae.getActionCommand() . equals ( SHOW_CMD ) ) {

Vector results =handleLookup( tablePanel.getTableName() );

if ( results != null) {

ResultsTablePanel table =new ResultsTablePanel( results);

new ResultsFrame(“Table Columns” , table);

} } }

private Vector handleLookup( String tableName )

{

Vector results = new Vector();

try {

DatabaseMetaData metaData =conn.getMetaData();

String[] columnNames = new String [TABLE_COLS];

columnNames[O] = "Name";

columnNames[l] = "MySQL Type";

columnNarnes[2] = "Size";

columnNames[3] = "Is Nullable";

columnNames[4] = "JDBC Type Code";

columnNames[5] = "JDBC Type Name";

results.add( columnNames );

ResultSet colData = metaData.getColurnns( null, null, tableName, "%" );

while ( colData.next() ) {

String[] values = new String [TABLE_COLS];

values [0] = colData.getString( "COLUMN_NAME" );

values [1] = colData.getString( "TYPE_NAME" );

values [2] = String.valueOf( cOlData.getInt( "COLUMN_SIZE" ) );

values [3] = colData.getString( "IS_NULLABLE" );

int jdbcTypeCode = colData.getShort( "DATA_TYPE" );

values [4] = String.valueOf( jdbcTypeCode );

values [5] = JdbcTypes.getName( jdbcTypecode );

results.add( values);

} }

catch( SQLException sqlX ) {

results = null;

String msg = "Failed to lookup columns.\n"

+ SglEXceptionReader.readException( sqlX );

Joptionpane.showMeSSageDialog( tablepanel, msg,

"Show Columns Failure", Joptionpane.ERROR_MESSAGE );

}

return (results);

}

private Connection conn = null;

private TablePanel tablePanel = new TablePanel();

private final static int TABLE_COLS = 6;

private final static String SHOW_CMD = "Show Columns";

class TablePanel extends Jpanel {

TablePanel () {

setLayout( new BorderLayout() );

add ( new JLabel ( "Table Name: " ), BorderLayout. WEST );

tableNameField.setColumns( FIELD_COLS );

add( tableNameField, BorderLayout.EAST );

}

String getTableName() {

return (tableNameField.getText(); }

private JTextField tableNameField = new JTextField() ; private final static int FIELD_COLS = 20;

} } , , , , ,

Λ ί σ τ α 1 2 .1 4 Ο εκ π ρόσω π ος στόχου στη λ ώ ν επ ίδειξη ς Package mysqljava;

Import java.util.*;

Import java.sql.*;

Public class JdbcTypes {

private final static int CAPACITY = 41;

private static HashMap codeToName;

static {

codeToName = new HashMap( CAPACITY);

codeToName.put( new Integer( Types.ARRAY ), "ARRAY" );

codeToName.put( new Integer ( Types.BIGINT ), "BIGINT" );

codeToName.put( new Integer ( Types.BINARY ), "BINARY" );

codeToName.put( new Integer( Types.BIT ), "BIT" );

codeToName.put( new Integer( Types.BLOB ), "BLOB" );

codeToName.put( new Integer( Types.CHAR ), "CHAR" );

codeToName.put( new Integer ( Types.CLOB ), "CLOB" );

codeToName.put( new Integer ( Types.DATE ), "DATE" );

codeToName.put( new Integer ( Types.DECIMAL ), "DECIMAL" ); codeToName.put( new Integer ( Types.DISTINCT ), "DISTINCT" ); codeToName.put( new Integer( Types.DOUBLE ), "DOUBLE" );

codeToName.put( new Integer ( Types.FLOAT ), "FLOAT" );

codeToName.put( new Integer ( Types.INTEGER ), "INTEGER" );

codeToName.put( new Integer ( Types.JAVA_OBJECT ), "JAVA_OBJECT" );

codeToName.put( new Integer ( Types.LONGVARBINARY ), "LONGVARBINARY" );

codeToName.put( new Integer ( Types.LONGVARCHAR ), "LONGVARCHAR" );

codeToName.put( new Integer( Types.NULL ), "NULL" );

codeToName.put( new Integer( Types.NUMERIC ), "NUMERIC" ); cOdeToName.put( new Integer(

Types.OTHER ), "OTHER" );

codeToName.put( new Integer( Types.REAL ), "REAL" );

codeToName .put ( new Integer ( Types .REF ), "REF" );

cOdeToName.put( new Integer( Types.SMALLINT ), "SMALLINT" ); codeToName. put ( new Integer ( Types.

STRUCT ), "STRUCT" );

codeToName.put( new Integer ( Types.TIME ), "TIME" );

codeToName.put( new Integer ( Types.TIMESTAMP ), "TIMESTAMP" );

codeToName .put ( new Integer ( Types. TINYINT ), "TINYINT" ); codeToName.put( new Integer ( Types.VARBINARY ), "VARBINARY" );

codeToName . put ( new Integer ( Types. VARCHAR ), "VARCHAR" );

}

static public String getName( int jdbcType ) {

return ((String) (codeToName.get( new Integer ( jdbcType ) )));

} . , ,

Λ ί σ τ α 1 2 .1 5

Ο χάρτης τύπων JDBC

$0 pæj m r■

i H l i r i t e I g E l b i j V : · . ; ' ■ M x l

: N a m e ! . M ySQ L Type I : Size ; is N u llab le JD B C Type Code I T

m c

^

n w

» I - | ;

ID int ΙΪ1 I

v e s

4 IN T E G E R Ί j

n am e ivarchar 12!: lY E S 12 V A R C H A R ! j ;

accou nt int 11 ;Y E 3 4 IN T E G E R | :

print ;blob IS5535 :Y E S -3 ! V A R B IN A R Y !

Σ χ ή μ α 12.5

Ο στόχος στηλών επίδειξης οδηγεί πλαίσιο

Ο στόχος σειρών ένθετων

Για το τελευταίο παράδειγμά μας, ρίχνουμε μια ματιά σε έναν στόχο που τροποποιεί μια βάση δεδομένων παρά απλά να ανακτήσει τις πληροφορίες. Η μέθοδος που υιοθετείται στην εφαρμογή του εκπροσώπου για αυτόν τον στόχο, όπως φαίνεται στη λίστα 12.16, διαφέρει με μερικούς τρόπους από αυτόν που χρησιμοποιείται για τους προηγούμενους στόχους. Κατ' αρχάς, ο χρήστης προτρέπεται για την εισαγωγή δύο φορές, μια φορά για να λάβει το επιτραπέζιο όνομα και μια φορά για να λάβει τις τιμές σειρών. Δεύτερον, δεδομένου ότι ένα ένθετο δεν παράγει την παραγωγή κατάλληλη για την επίδειξη σε έναν πίνακα, τα απλά πλαίσια διαλόγου χρησιμοποιούνται για να παρουσιάσουν το αποτέλεσμα.

Όταν ο στόχος αρχίζει, ένα πλαίσιο υπαγόρευoης(PromptFrame) χρησιμοποιείται για να ζητήσει το όνομα του πίνακα στον οποίο μια σειρά πρόκειται να παρεμβληθεί. Με το επιτραπέζιο όνομα στη διάθεση, η πύλη χρησιμοποιεί την ίδια τεχνική που παρουσιάζεται για το στόχο στηλών επίδειξης να ληφθούν τα ονόματα στηλών που συνδέονται με τον πίνακα. Αυτό το βήμα αντιμετωπίζεται με τη μέθοδο στήλη ονόματος (getColumnNames). Τα ονόματα στηλών χρησιμοποιούνται έπειτα όπως ετικέτες για ένα δεύτερο πλαίσιο υπαγόρευσης (second PromptFrame) που ζητά από τις τιμές για να εισαχθεί στη νέα σειρά ένα παράδειγμα αυτού του πλαισίου παρουσιάζεται στο σχήμα 12.6.

Μόλις υποβάλει ο χρήστης τις τιμές σειρών, η μέθοδος getValuesAsSq() επικαλείται για να

παραγάγει τη σχετική μερίδα της δήλωσης ένθετων SQL. Την κατασκευή της δήλωσης ένθετων

ολοκληρώνεται έπειτα και περνούν στη μέθοδο insertRow. Αυτή η μέθοδος δημιουργεί ένα

α ντικ είμ ενο δή λω ση ς απ ό το π α ρ εχ όμ ενο α ντικ είμ ενο σύ νδεση ς κ α ι επ ικ α λ είτα ι τη μ έθοδο execu teU p d ate() τη ς δήλω σης, π ου π ερ νά τη δή λω ση ένθ ετω ν S Q L π ου π α ρ ά γετα ι από τη ν εισαγω γή του χρήστη. Τ έλος, ένα π λα ίσιο δια λόγου π ου υ π ο β ά λ λ ει το α π οτέλεσμ α τη ς α π οπ ειρ α θ είσ α ς λ ειτου ρ γία ς ένθ ετω ν π α ρ ο υ σ ιά ζετα ι στο χρήστη.

package mysqljava; . import java.sql.*;

import java.util.*;

import java.awt.*;

import j ava.awt.event.*;

import j avax.swing.*;

public class InsertRow implements TaskDelegate, ActionListener {

public InsertRow () {}

public boolean execute( Connection conn) {

this.conn ; conn;

new PromptFrame( "Table Name", SELECT_CMD, tablepanel, this);

return (true);

}

public void actionPerformed( ActionEvent ae ) {

String cmd ;

ae.getActionCommand();

if ( cmd.equals( SELECT_CMD ) ) {

tableName ;

tablePanel.getT ableName();

String[] columnNames ; getColumnN ames();

if ( columnNames 1; null) {

valuepanel ;

new Value Panel ( columnNames );

new PromptFrame( "Row Value Input", INSERT_CMD, value Panel , this);

} } else

if ( cmd.equals( INSERT_CMD ) ) {

String insertSql ;

"INSERT INTO" + tableName + " " + valuePanel.getValuesAsSql();

sertRow( insertSql );

} }

private String[] getColumnNames() {

String xMsg = "";

Vector columnNames = new Vector() ; try

{

DatabaseMetaData metaData = conn.getMetaData();

ResultSet colData = metaData.getColumns( null, null, tableName, " %" );

while ( colData.next() ) {

columnNames.add( colData.getString( "COLUMN_NAME" ) );

}

if ( columnNames.size() == 0 ) {

columnNames = null;

} }

catch( SQLException sqlX ) {

columnNames = null;

xMsg = sqlExceptionReader.readException( sqlX );

}

if ( columnNames == null )

{

String msg = "Failed to access table (" + tableName + ")\n" + xMsg; Joptionpane.showMeSSageDialog(

tablePanel, msg,

"Insert Row Failure",

Joptionpane.ERROR_MESSAGE );

return (null);

} else {

return ((string[]) (columnNames.toArray( new String [0] )));

} }

private void insertRoW( String insertSql ) {

try {

Statement stmt = conn.createStatement();

int count = stmt.executeUpdate( insertSql );

if ( count != 1 ) {

String msg = "Row insert failed. Returned " + count + ". " ; JOptionPane.showMessageDialog(

null, msg,

"Insert Failure", JOptionPane.ERROR_MESSAGE );

} else {

String msg = "Row insert successful.";

JOptionPane.showMessageDialog(

null, msg,

"Insert Success", JoptionPane.!NFORMATION_MESSAGE );

} }

catch ( SQLException sglX ) {

String msg = "Failed to insert row.\n"

+ SglExceptionReader. readException ( sqlX );

JOptionpane.showMessageDialog( null, msg,

"Insert Failure", JOptiohPane.ERROR_MESSAGE );

} }

private string tableName = null;

private Connection conn = null;

private Valuepanel value panel = null;

private Tablepanel tablePanel= new TablePanel();

private final static String SELECT_CMD = "Select Table";

private final static String INSERT_CMD = "Insert Row";

class T ablePanel extends JPanel {

Tablepanel () {

setLayout( new BorderLayout() );

add ( new JLabel ( "Table Name: " ), BorderLayout. WEST ); tableNameField.setColumns( FIELD_COLS );

add( tableNameField, BorderLayout.EAST );

}

String getTableName() {

return (tableNameField.getText());

}

private JTextField tableNameField = new JTextField() ; private final static int FIELD_COLS = 20;

}

class Valuepanel extends Jpanel {

ValuePanel( String[] columnNames ) {

int columnCount = columnNames.length;

setLayout( new GridLayout( columnCount, 2 ) )i valueFields = new JTextField [columnCount] i for ( int i = 0; i < columnCount; ++i )

{

add( new JLabel( columnNames[i] + ":" ) );

valueFields[i] = new JTextField( FIELD_COLS ); add( valueFields[i] );

}

this.columnNames = columnNames;

String getValuesAsSql() {

StringBuffer cols = new StringBuffer( "(,, ) i StringBuffer vals = new StringBuffer( "VALDES(" );

boolean isFirst = true;

for ( int i = 0; i < columnNames.length; ++i ) {

String value = valuel'ield.s[i] .getText();

if (value.length() == 0 ) {

continue;

}

if ( ! isFirst ) {

eols. append ( " " ); val s . C\ppend (' "," );

} else {

isFirst '" fal"e;

}

eols.append( eolumnNames[i] );

vals.append( "\"" ) .append{ value) . append ( "\"" ); } eol s . append ( ")" ); val s . append ( ")" );

return (eols. toString () + " " + vals. toString () ) ; }

private String[] eolumnNames; private JTextField[] valueFields;

private final static int FIELD_COLS '" 20;

}

} , , , , ,

Λ ί σ τ α 1 2 .1 6 Ο εκ π ρόσω π ος στόχου σειρ ώ ν ένθ ετω ν

ID: ' ' : :: : 2 9 3 1

n a m e ; : : . . . . : : J o e S m i t h j

a c c o u n t : 9 3 8 3 9 4 8 5 4 !

print: n u ll j

1 I n s e r t R o w j

Σ χ ή μ α 1 2 .6 Τ ο γρ ή γορ ο π λα ίσ ιο στόχου σειρ ώ ν ένθ ετω ν

Διοίκηση βάσεων δεδομένων

Η M yS Q L είναι ένα π ερ ιεκ τικ ό συ γγενικ ό σύ στη μ α δια χ είριση ς βάσεω ν δεδομ ένω ν και π ρέπ ει να κ α τορθ ω θ εί για να επ ιτύ χ ει τη βέλτιστη λειτου ργία . Μ ερικά από τα ζη τή μ α τα που π ρέπ ει να κ α τα λά β ετε π ερ ιλα μ β ά νο υ ν π ώς να π ρ οσ θ έσ ου ν το υ ς χ ρ ή στες και να ο ργα νώ σ ου ν τις άδειες, π ώς να εισ α γά γου ν τα μ εγάλα π οσά στοιχείω ν στου ς διά φ ορου ς π ίνακες, όταν και π ώ ς να κ άνουν τα στηρίγμ α τα , και π ώς να α να διπ λώ σ ου ν τα στοιχεία, μ εταξύ ά λλω ν λειτου ργιώ ν. Α υ τό το κ εφ ά λ α ιο π αρέχ ει σ ε σας ένα ν οδη γό στη διοίκη ση βάσεω ν δεδομ ένω ν σε μ ια α νά π τυξη ή ένα οργα νώ νοντα ς π εριβάλλον. Για ένα π α ρα γω γή -ισ ό π εδ ο σύστη μ α, συ σ τή νο υ μ ε ότι χ ρ η σ ιμ ο π ο ιείτε έναν επ α γγελμ α τικ ό διοικη τή βά σεω ν δεδομ ένων.