ورود

View Full Version : راهنمایی برای نوشتن یک برنامه AddressBook در جاوا



unix_svr4
چهارشنبه 13 شهریور 1387, 14:56 عصر
با سلام

می خواهم یک برنامه Address Book همانند برنامه موجود در ویندوز بنویسم. با این تفاوت که برنامه من باید به یک بانک اطلاعاتی MySQL و یا SQL Server متصل شود. می خواستم بدانم چگونه می توانم فایل دیتابیس خودم رو به برنامه ام Attach کنم. مانند Attach کردن دیتابیس در #C.
از نظر دوستان آیا این کار شدنی است؟؟؟ اگر هست لطفا یک مثال بزنید. اگر هم نیست، آیا راه دیگری وجود دارد؟؟؟

متشکرم.

saeedIRHA
چهارشنبه 13 شهریور 1387, 23:44 عصر
این Source Code نشون ميده که چطوری به ديتابيس Connect, Mysql کنی و Query ت رو اجرا کنی.


/*
* Database Query test
* useful link: http://www.exampledepot.com/egs/java.sql/pkg.html
*
*/

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class frmQueryTest extends javax.swing.JFrame {

private final static String user = "root";
private final static String pass = "*****";
private final static String Host = "192.168.1.5";
private final static String db = "Test";
private final static String url = "jdbc:mysql://" + Host + "/" + db + "?user=" + user + "&password=" + pass;

static Connection conn = null;
static Statement stmt = null;
static ResultSet result = null;
/** Creates new form frmQueryTest */
public frmQueryTest() {
initComponents();

try {

System.out.println("Database Connection URL: " + url);
//initializing the MySQL database driver
Class.forName("com.mysql.jdbc.Driver").newInstance();
//establishing communication with MYSQL server
conn = DriverManager.getConnection(url);
lblResult.setText("Connection to Database was Successful :-)");
//Executing the query, with changing capabilities
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITI VE, ResultSet.CONCUR_UPDATABLE);
//stmt.executeQuery("SELECT * FROM phonebook");
//result = stmt.getResultSet();
result = stmt.executeQuery("SELECT * FROM phonebook");
//Setting the posintion to the first row
result.next();
txtID.setText(result.getString("ID"));
txtName.setText(result.getString("Name"));
txtLastName.setText(result.getString("LastName"));
txtPhone.setText(result.getString("PhoneNo"));
txtEmail.setText(result.getString("Email"));
txtCountryCode.setText(result.getString("Country"));

System.out.println("Query execution was successfull.");

} catch (ClassNotFoundException ex) {
System.out.println("Exception: " + ex.getMessage());
}catch(InstantiationException ex){
System.out.println("Exception: " + ex.getMessage());
}catch(IllegalAccessException ex){
System.out.println("Exception: " + ex.getMessage());
}catch(SQLException ex){
System.out.println("Exception: " + ex.getMessage());
}
}

/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {

jTextField4 = new javax.swing.JTextField();
jPanel1 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jLabel4 = new javax.swing.JLabel();
jLabel5 = new javax.swing.JLabel();
jLabel6 = new javax.swing.JLabel();
txtID = new javax.swing.JTextField();
txtName = new javax.swing.JTextField();
txtLastName = new javax.swing.JTextField();
txtPhone = new javax.swing.JTextField();
txtEmail = new javax.swing.JTextField();
txtCountryCode = new javax.swing.JTextField();
jSeparator1 = new javax.swing.JSeparator();
btnPrevious = new javax.swing.JButton();
btnNext = new javax.swing.JButton();
jSeparator2 = new javax.swing.JSeparator();
btnUpdate = new javax.swing.JButton();
btnDelete = new javax.swing.JButton();
lblResult = new javax.swing.JLabel();

jTextField4.setText("jTextField4");

setDefaultCloseOperation(javax.swing.WindowConstan ts.DO_NOTHING_ON_CLOSE);
setTitle("Query Test");

jPanel1.setBorder(javax.swing.BorderFactory.create EtchedBorder());

jLabel1.setText("First Name:");

jLabel2.setText("Last Name:");

jLabel3.setText("ID:");

jLabel4.setText("Phone Number:");

jLabel5.setText("Email Address:");

jLabel6.setText("Country:");

txtID.setEnabled(false);

btnPrevious.setText("< previous");
btnPrevious.setEnabled(false);
btnPrevious.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnPreviousActionPerformed(evt);
}
});

btnNext.setText("Next >");
btnNext.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnNextActionPerformed(evt);
}
});

jSeparator2.setOrientation(javax.swing.SwingConsta nts.VERTICAL);

btnUpdate.setText("Update");
btnUpdate.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnUpdateActionPerformed(evt);
}
});

btnDelete.setText("Delete");
btnDelete.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnDeleteActionPerformed(evt);
}
});

javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.Grou pLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax. swing.GroupLayout.Alignment.TRAILING, false)
.addComponent(jLabel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jLabel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jLabel3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jLabel4, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jLabel6, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jLabel5, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.UNRELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax. swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createParallelGroup(javax. swing.GroupLayout.Alignment.LEADING, false)
.addComponent(txtEmail)
.addComponent(txtPhone)
.addComponent(txtLastName)
.addComponent(txtName, javax.swing.GroupLayout.PREFERRED_SIZE, 220, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(txtID, javax.swing.GroupLayout.PREFERRED_SIZE, 57, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(txtCountryCode, javax.swing.GroupLayout.PREFERRED_SIZE, 57, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(40, Short.MAX_VALUE))
.addComponent(jSeparator1, javax.swing.GroupLayout.DEFAULT_SIZE, 354, Short.MAX_VALUE)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax. swing.GroupLayout.Alignment.TRAILING, false)
.addComponent(btnNext, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(btnPrevious, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED)
.addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax. swing.GroupLayout.Alignment.LEADING, false)
.addComponent(btnDelete, 0, 0, Short.MAX_VALUE)
.addComponent(btnUpdate, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap(174, Short.MAX_VALUE))
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.Grou pLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax. swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel3)
.addComponent(txtID, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax. swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1)
.addComponent(txtName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax. swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel2)
.addComponent(txtLastName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax. swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel4)
.addComponent(txtPhone, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax. swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel5)
.addComponent(txtEmail, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax. swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel6)
.addComponent(txtCountryCode, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED)
.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax. swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(btnUpdate)
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(btnDelete))
.addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(btnPrevious)
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED)
.addComponent(btnNext))
.addComponent(jSeparator2, javax.swing.GroupLayout.DEFAULT_SIZE, 52, Short.MAX_VALUE))
.addContainerGap())
);

lblResult.setHorizontalAlignment(javax.swing.Swing Constants.CENTER);
lblResult.setText("Not Connected");
lblResult.setBorder(javax.swing.BorderFactory.crea teTitledBorder("Last Results:"));

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout .Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.G roupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(lblResult, javax.swing.GroupLayout.DEFAULT_SIZE, 358, Short.MAX_VALUE))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout .Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(lblResult)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_S IZE, Short.MAX_VALUE))
);

pack();
}// </editor-fold>//GEN-END:initComponents

private void btnNextActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNextActionPerformed
try {
btnPrevious.setEnabled(true);

if (!result.isLast())
{
result.next();
txtID.setText(result.getString("ID"));
txtName.setText(result.getString("Name"));
txtLastName.setText(result.getString("LastName"));
txtPhone.setText(result.getString("PhoneNo"));
txtEmail.setText(result.getString("Email"));
txtCountryCode.setText(result.getString("Country"));
lblResult.setText("Current Row number is: " + result.getRow());

}else{
result.first();
//result.previous();
txtID.setText(result.getString("ID"));
txtName.setText(result.getString("Name"));
txtLastName.setText(result.getString("LastName"));
txtPhone.setText(result.getString("PhoneNo"));
txtEmail.setText(result.getString("Email"));
txtCountryCode.setText(result.getString("Country"));
lblResult.setText("Current Row number is: " + result.getRow());

}
} catch (SQLException ex) {
System.out.println("Exception: " + ex.getMessage());//GEN-LAST:event_btnNextActionPerformed
}
}

private void btnPreviousActionPerformed(java.awt.event.ActionEv ent evt) {//GEN-FIRST:event_btnPreviousActionPerformed
// TODO add your handling code here:
try {
if (!result.isFirst())
{
result.previous();
txtID.setText(result.getString("ID"));
txtName.setText(result.getString("Name"));
txtLastName.setText(result.getString("LastName"));
txtPhone.setText(result.getString("PhoneNo"));
txtEmail.setText(result.getString("Email"));
txtCountryCode.setText(result.getString("Country"));
lblResult.setText("Current Row number is: " + result.getRow());

}else{
result.last();
//result.next();
txtID.setText(result.getString("ID"));
txtName.setText(result.getString("Name"));
txtLastName.setText(result.getString("LastName"));
txtPhone.setText(result.getString("PhoneNo"));
txtEmail.setText(result.getString("Email"));
txtCountryCode.setText(result.getString("Country"));
lblResult.setText("Current Row number is: " + result.getRow());
}
} catch (SQLException ex) {
System.out.println("Exception: " + ex.getMessage());
}

}//GEN-LAST:event_btnPreviousActionPerformed

private void btnUpdateActionPerformed(java.awt.event.ActionEven t evt) {//GEN-FIRST:event_btnUpdateActionPerformed
try {
// TODO add your handling code here:
result.updateString("Name", txtName.getText());
result.updateString("LastName", txtLastName.getText());
result.updateString("PhoneNo", txtPhone.getText());
result.updateString("Email", txtEmail.getText());
result.updateString("Country", txtCountryCode.getText());
//Running the new update changes!
result.updateRow();
System.out.println("Row Number: " + result.getRow() +
" was successfully updated");

} catch (SQLException ex) {
System.out.println("Exception: " + ex.getMessage());
Logger.getLogger(frmQueryTest.class.getName()).log (Level.SEVERE, null, ex);
}


}//GEN-LAST:event_btnUpdateActionPerformed

private void btnDeleteActionPerformed(java.awt.event.ActionEven t evt) {//GEN-FIRST:event_btnDeleteActionPerformed
try {
// TODO add your handling code here:
int rowNum =result.getRow();
result.deleteRow();
System.out.println("Row was deleted successfully :-(");
btnPreviousActionPerformed(evt);

} catch (SQLException ex) {
Logger.getLogger(frmQueryTest.class.getName()).log (Level.SEVERE, null, ex);
}

}//GEN-LAST:event_btnDeleteActionPerformed

public static void CleanExit(){
try {
result.close();
stmt.close();
conn.close();
System.out.println("Connection Closed!");
} catch (SQLException ex) {
System.out.println("Exception: " + ex.getMessage());
}
System.exit(0);
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
// java.awt.EventQueue.invokeLater(new Runnable() {
// public void run() {
// new frmQueryTest().setVisible(true);
// }
// });
frmQueryTest myapp = new frmQueryTest();
myapp.addWindowListener(
new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e){
System.out.println("Exiting...");
CleanExit();
}
});

myapp.setVisible(true);

}

// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnDelete;
private javax.swing.JButton btnNext;
private javax.swing.JButton btnPrevious;
private javax.swing.JButton btnUpdate;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JPanel jPanel1;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JSeparator jSeparator2;
private javax.swing.JTextField jTextField4;
private javax.swing.JLabel lblResult;
private javax.swing.JTextField txtCountryCode;
private javax.swing.JTextField txtEmail;
private javax.swing.JTextField txtID;
private javax.swing.JTextField txtLastName;
private javax.swing.JTextField txtName;
private javax.swing.JTextField txtPhone;
// End of variables declaration//GEN-END:variables

}


این هم يک Sample ديتابس برای تست کردنش این رو تو mysql copy/paste کن



create table `phonebook` (
`ID` double ,
`Name` varchar (150),
`LastName` varchar (150),
`PhoneNo` varchar (60),
`Email` varchar (150),
`Country` varchar (9)
);
insert into `phonebook` (`ID`, `Name`, `LastName`, `PhoneNo`, `Email`, `Country`) values('2','myName','Surename','0098-00-10008 (M)','s@yahoo.com','IR');
insert into `phonebook` (`ID`, `Name`, `LastName`, `PhoneNo`, `Email`, `Country`) values('4','sass','saas','0044-788788 (M)','eee@yahoo.com','UK');
insert into `phonebook` (`ID`, `Name`, `LastName`, `PhoneNo`, `Email`, `Country`) values('5','ttt','tttt','0011 51515 515','84884@sss.ac.uk','UK');

unix_svr4
پنج شنبه 14 شهریور 1387, 13:50 عصر
دوست عزيز

با تشكر از مثال كاملي كه زدين. ولي نگفتيد چگونه مي توانم فايل ديتابيس را به برنامه attach كنم. يعني برنامه فايل ديتابيس را از مسير جاري بخواند. و به My SQL مراجعه نكند.

متشكرم.

saeedIRHA
جمعه 15 شهریور 1387, 00:21 صبح
متاسفانه دقيقن متوجه منظورتون نميشم؟؟؟
مسير ديتابيس يک آدرس به سرور MySQL ما هست!

unix_svr4
شنبه 16 شهریور 1387, 17:35 عصر
دوست عزيزم

با تشكر از توجهي كه به مشكل من داريد. منظور من اين است كه مي خواهم فايل ديتابيسم را همراه برنامه ام بر روي ماشين ديگري اجرا كنم. و مجبور نباشم در سرور MySQL ماشين جديد فايل ديتابيس را دوباره بسازم. آيا راهي براي اين كار وجود دارد؟؟؟

متشكرم.

saeedIRHA
یک شنبه 17 شهریور 1387, 01:39 صبح
اگر منظورت رو درست متوجه شده باشم,
ديتابيس MySQL مثل (MS-Access( standalone نيست که بتونی فايل ديتابيس رو با برنامت جابجا کنی
بخاطر همين استفاده از MySQL برای چنين مواردی پيشنهاد نميشه!!
به نظر من از گزينه های ديگه برای ديتابيست استفاده کن مثل
MS-Access
XML
SQLite