Namecard

In this chapter, we will practice the namecard management program.

Write Namecard.java and NamecardDao.java classes like below.

Namecard.java
package net.java_school.namecard;

public class Namecard {
  private int no;
  private String name;
  private String mobile;
  private String email;
  private String company;
	
  public Namecard() {}
	
  public Namecard(String name, String mobile, 
      String email, String company) {
    this.name = name;
    this.mobile = mobile;
    this.email = email;
    this.company = company;
  }
	
  public Namecard(int no, String name, 
      String mobile, String email, String company) {
    this.no = no;
    this.name = name;
    this.mobile = mobile;
    this.email = email;
    this.company = company;
  }
	
  public int getNo() {
    return no;
  }

  public void setNo(int no) {
    this.no = no;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getMobile() {
    return mobile;
  }

  public void setMobile(String mobile) {
    this.mobile = mobile;
  }

  public String getEmail() {
    return email;
  }

  public void setEmail(String email) {
    this.email = email;
  }

  public String getCompany() {
    return company;
  }

  public void setCompany(String company) {
    this.company = company;
  }
	
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("[NO: ");
    sb.append(no);
    sb.append("] ");
    sb.append(name);
    sb.append(" ,Mobile: ");
    sb.append(mobile);
    sb.append(" ,Email: ");
    sb.append(email);
    sb.append(" ,Company: ");
    sb.append(company);
		
    return sb.toString();
  }
	
}
NamecardDao.java
package net.java_school.namecard;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class NamecardDao {
	
  static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
  static final String USER = "scott";
  static final String PASSWORD = "tiger";
	
  public NamecardDao() {
    try {
      Class.forName("oracle.jdbc.driver.OracleDriver");
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }
	
  private Connection getConnection() throws SQLException {
    return DriverManager.getConnection(URL, USER, PASSWORD);
  }
	
  private void close(ResultSet rs, PreparedStatement pstmt, Connection con) {
    if (rs != null) {
      try {
        rs.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    if (pstmt != null) {
      try {
        pstmt.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    if (con != null) {
      try {
        con.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }
	
  public void insert(Namecard card) {
    Connection con = null;
    PreparedStatement pstmt = null;
		
    String sql = "INSERT INTO namecard VALUES (seq_namecard_no.nextval, ?, ?, ?, ?)";

    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setString(1, card.getName());
      pstmt.setString(2, card.getMobile());
      pstmt.setString(3, card.getEmail());
      pstmt.setString(4, card.getCompany());
      pstmt.executeUpdate();
    } catch (SQLException e) {
      e.printStackTrace();
      System.out.println(sql);
    } finally {
      close(null, pstmt, con);
    }
  }
	
  //Remove the Namecard	
  public void delete(int no) {
    //TODO
  }
	
  //Find the Namecard by no
  public Namecard selectOne(int no) {
    return null;
  }
	
  //Find the Namecard by keyword
  public ArrayList<Namecard> selectByKeyword(String keyword) {
    ArrayList<Namecard> matched = new ArrayList<Namecard>();
    //TODO		
    return matched;
  }
	
  //Get All Namecards
  public ArrayList<Namecard> selectAll() {
    ArrayList<Namecard> all = new ArrayList<Namecard>();
    //TODO		
    return all;
  }		
	
  //Modify the Namecard
  public void update(Namecard card) {
    //TODO
  }

}

NamecardDao.java is not yet complete. Complete //TODO parts of NamecardDao.java. If you have implemented all the methods in NamecardDao.java, create the following class for testing.

Test.java
package net.java_school.namecard;

import java.util.ArrayList;

public class Test {

  public static void main(String[] args) {
    NamecardDao dao = new NamecardDao();
    //1.insert(Namecard) test: Adding a namecard
    Namecard alison = new Namecard("Alison","011-1111-1111", "alison@ggmail.org", "Salesman");
    dao.insert(alison); //After execution, check in SQL*PLUS.
		
/* 
    //2.selectAll() test: Get all namecards 
    ArrayList<Namecard> list = dao.selectAll();
    int size = list.size();
    for (int i = 0; i < size; i++) {
      Namecard namecard = list.get(i);
      System.out.println(namecard);
    }
*/

/* 
    //3.selectByKeyword(String) test: Find a namecard by keyword
    ArrayList<Namecard> matched = dao.selectByKeyword("Alison");
    int length = matched.size();
    for (int i = 0; i < length; i++) {
      Namecard namecard = matched.get(i);
      System.out.println(namecard);
    }
*/

/* 
    //4.selectOne(int) test : Find a namecard by no
    Namecard card = dao.selectOne(1);
    System.out.println(card);
*/

/* 
    //5.delete(int) test : Remove a namecard
    dao.delete(1);
    ArrayList<Namecard> all = dao.selectAll();
    int cardNum = all.size();
    for (int i = 0; i < cardNum; i++) {
      Namecard namecard = all.get(i);
      System.out.println(namecard);
    }
*/	

/*		
    //6. update(Namecard) test : Modify a namecard
    Namecard card = dao.selectOne(3);
    System.out.println(card);
    card.setEmail("alison@ggmail.org");
    card.setMobile("222-2222-2222");
    dao.update(card);
*/
  }

}

Test the insert() method of NamecardDao.
Run SQL * PLUS to see if Alison's information exists.
After SQL * PLUS exits, you better run the JDBC program.
Because different commit modes of JDBC programs and SQL * PLUS can cause bottlenecks.

Test it one by one.
For example, if you test #2, comment out #1, #3, #4, #5, and #6.

After you have done all the tests, create a user interface class. --Here, the interface means receiving the user's command and delivering the result back to the user--

Think different.
With a database, you do not need to store card instances in an array or ArrayList.

NamecardUi.java
package net.java_school.namecard;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class NamecardUi {
	
  private NamecardDao dao = new NamecardDao();
	
  public NamecardUi() {}

  private String readCommandLine() throws IOException {
    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader br = new BufferedReader(isr);
    String input = br.readLine();
    return input;
  }
	
  public void showMenu() {
    String menu = null;
		
    do {
      System.out.println("Please select menu");
      System.out.println("1.Namecard registration");
      System.out.println("2.List of Namecards");
      System.out.println("3.Delete Namecard");
      System.out.println("4.Edit Namecards");
      System.out.println("5.Search Namecard");
      System.out.println("q.Quit");
			
      try {
        menu = readCommandLine();	
			
        if (menu.equals("1")) {
          System.out.println("Please enter a name>>");
          String name = readCommandLine();
          System.out.println("Please enter a mobile>>");
          String mobile = readCommandLine();
          System.out.println("Please enter a email>>");
          String email = readCommandLine();
          System.out.println("Please enter a company>>");
          String company = readCommandLine();
          Namecard card = new Namecard(name, mobile, email, company);
          dao.insert(card);
        } else if (menu.equals("2")) {
          ArrayList<Namecard> all = dao.selectAll();
          for(int i = 0; i < all.size(); i++) {
            System.out.println(all.get(i));
          }
        } else if (menu.equals("3")) {
          System.out.println("Please enter the name to delete>>");
          String name = readCommandLine();
          ArrayList<Namecard> matched = dao.selectByKeyword(name);
          if (matched.size() > 0) {
            for (int i = 0; i < matched.size(); i++) {
              System.out.println(matched.get(i));
            }
            System.out.println("Please enter the NO to delete>>");
            int id = Integer.parseInt(readCommandLine());
            dao.delete(id);
          }
        } else if (menu.equals("4")) {
          System.out.println("Enter the name of the namecard to edit>>");
          String name = readCommandLine();
          ArrayList<Namecard> matched = dao.selectByKeyword(name);
          if (matched.size() > 0) {
            for (int i = 0; i < matched.size(); i++) {
              System.out.println(matched.get(i));
            }
            System.out.println("Please enter the number of namecard to edit>>");
            int id = Integer.parseInt(readCommandLine());
            Namecard card = dao.selectOne(id);
            System.out.println("To edit a name, enter the name to change>>");
            name = readCommandLine();
            if (!name.equals("")) {
              card.setName(name);
            }
            System.out.println("To edit a mobile, enter the mobile to change>>");
            String mobile = readCommandLine();
            if (!mobile.equals("")) {
              card.setMobile(mobile);
            }	
            System.out.println("To edit an email, enter the email to change>>");
            String email = readCommandLine();
            if (!email.equals("")) {
              card.setEmail(email);
            }
            System.out.println("To edit a company, enter the company to change>>");
            String company = readCommandLine();
            if (!company.equals("")) {
              card.setCompany(company);
            }
            dao.update(card);
          }
        } else if (menu.equals("5")) {
          System.out.println("Please enter a name to search>>");
          String name = readCommandLine();
          ArrayList<Namecard> matched = dao.selectByKeyword(name);
          for(int i = 0; i < matched.size(); i++) {
            System.out.println(matched.get(i));
          }
        }
      } catch (Exception e) {
        System.out.println(e.getMessage());
      }
    } while(!menu.equals("q"));
  }
	
  public static void main(String[] args) {
    new NamecardUi().showMenu();
  }

}