יום רביעי, 4 באפריל 2018

ירושה של מחלקת ה-SQL לכל טבלה - Java

הדגמה של מחלקה כללית לענייני טבלאות SQL ממנה יורשות המחלקות של כל הטבלאות



אחרי שהבנו את הבסיס כאן וכאן, הגיע הזמן לשימוש מעשי.
נדגים על בסיס הנתונים "NORTHWND" על הטבלה "Employees".


תזכורות:
לא לשכוח להוסיף את הדרייבר.
 * protected = רק היורשים יכולים להשתמש
 * final = לא ניתן לשינוי
 * abstract class = מחלקה שניתן לרשת אותה אבל לא ניתן ליצור מופע שלה






מחלקה לייצוג שגיאה:
public class CustomError {
    public String CustomMessage;
    public String SystemMessage;
    public Boolean isThereError;
    public CustomError(){
        CustomMessage = "Good";
        SystemMessage = "Good";
        isThereError = false;
    }
}




מחלקה לייצוג עובד:

public class Employee {
    private int EmployeeID;
    private String LastName;
    private String FirstName;
    private String City;
    // (יש עוד מאפיינים לעובד אבל לצורך הדוגמה נסתפק באלו)
    
    
    
    // פונקציה בונה עם ברירת המחדל של השדות
    public Employee(){
        EmployeeID = 0;
        LastName = "No LastName";
        FirstName = "No FirstName";
        City = "No City";
    }
    
    // פונקציה בונה שמקבלת ערכים
    public Employee(int EmployeeID, String LastName, String FirstName, String City) {
        this.EmployeeID = EmployeeID;
        this.LastName = LastName;
        this.FirstName = FirstName;
        this.City = City;
    }
    
    
    
    
    
    public int getEmployeeID() {
        return EmployeeID;
    }

    public void setEmployeeID(int EmployeeID) {
        this.EmployeeID = EmployeeID;
    }

    public String getLastName() {
        return LastName;
    }

    public void setLastName(String LastName) {
        this.LastName = LastName;
    }

    public String getFirstName() {
        return FirstName;
    }

    public void setFirstName(String FirstName) {
        this.FirstName = FirstName;
    }

    public String getCity() {
        return City;
    }

    public void setCity(String City) {
        this.City = City;
    }
    
    
    @Override
    public String toString() {
        return "Employee{" + "EmployeeID=" + EmployeeID + ", LastName=" +
                LastName + ", FirstName=" + FirstName + ", City=" + City + '}';
    }
}








ממחלקה זו כל המחלקות של הטבלאות יורשות:
public abstract class SQLMaster {
    private final String userNameOfDB;
    private final String passwordOfDB;
    private final String serverName;
    protected final String dbName;
    
    
    // פונקציה בונה
    public SQLMaster(){
        userNameOfDB = "Game_User";
        passwordOfDB = "12345";
        dbName = "NORTHWND";
        serverName = "DESKTOP-RCEFUJ4";
    }
    
    
    // לקבל קישור לבסיס נתונים
    protected Connection getConnection() throws ClassNotFoundException, SQLException {
        String url = "jdbc:sqlserver://"+serverName+";databaseName="+dbName;
        
        // רישום לקלאס של הדרייבר
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        Connection conn;
        conn = DriverManager.getConnection(url,userNameOfDB,passwordOfDB);
        return conn;
    }
    
    
    
    // סגירה בטוחה של החיבור
    protected void closeStatementAndConnection(Connection con, Statement st){
        // סגירה של החיבורים
        try {  // רק בגלל שהסגירה עלולה להוציא שגיאה הגאווה מכריח לעשות את בלוק הטריי הזה
            if (st != null) { // כי אם נפלנו בהתחלה זה יהיה נאל
                st.close();
            }
            if (con != null) {
                if (!con.isClosed()) {  // לדוגמה אם נפל החשמל
                    con.close();
                }
            }
            
        } catch (Exception e) {
            // אין מה לכתוב כאן כי כל הבלוק טריי מיותר
        }
    }
    
}










מחלקה לטבלת העובדים:
public class SQLTable_Employees extends SQLMaster{
    
        private String TableName;
        
        // פונקציה בונה
        public SQLTable_Employees(){
        super(); // הפעלת הפונקציה הבונה של המחלקה ממנה ירשנו
        TableName = "Employees";
        }
        
        
    // numberOfLines להחזיר רשימה של כל העובדים הראשונים כמספר
    // אפס משמעותו להביא את כל הקטגוריות
    // Out_EmployeesList = רשימה שמקבלים כפרמטר שצריך להשפיע עליו ועל ידי כך להשפיע על המקור
    // הרשימה שמקבלים חייבת להיות מאותחלת כבר כדי שיהיה ניתן להשתמש בה
    public CustomError GetListOfEmployees(final int numberOfLines,
            ArrayList<Employee> Out_EmployeesList)
    {
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        String selectString;
        CustomError CE = new CustomError();

        
        
        // בדיקה שהרשימה שקיבלנו מאותחלת
        if(Out_EmployeesList == null){
            CE.CustomMessage = "Error in 'GetListOfEmployees': Out_EmployeesList = null";
            CE.isThereError = true;
            return CE;
        }
        
        
        if(numberOfLines == 0){ // את כל הרשומות
            selectString =
                "SELECT * FROM ["+dbName+"].[dbo].["+TableName+"] ";
        }
        else{ //רשומות כמספר שקיבלנו 
            selectString =
                "SELECT TOP " + numberOfLines
                + " * FROM ["+dbName+"].[dbo].["+TableName+"] ";
        }
        
        
        try
        {
           con = getConnection();
           st = con.createStatement();
           rs = st.executeQuery(selectString);
           
           while(rs.next()) // ריצה על התוצאות
           {
               Employee tmp = new Employee();
               tmp.setEmployeeID(rs.getInt("EmployeeID"));
               tmp.setLastName(rs.getString("LastName"));
               tmp.setFirstName(rs.getString("FirstName"));
               tmp.setCity(rs.getString("City"));
               
               Out_EmployeesList.add(tmp); //הוספה לרשימה 
           }
        }
        
        catch(Exception e)
        {
            CE.CustomMessage = "Error in 'GetListOfEmployees'";
            CE.SystemMessage = e.getMessage();
            CE.isThereError = true;
        }
        
        finally { // צריך לעשות סגירה של החיבור גם אם נפלנו באקספטשן
            closeStatementAndConnection(con, st);
        }
        return CE;
    }
    
}









המחלקה הראשית (main):
public class SQL_Simple_Inheritance {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        CustomError CE;
        
        SQLTable_Employees SQLT_Emp = new SQLTable_Employees();
        ArrayList<Employee> EmployeesList = new ArrayList<Employee>();
        CE = SQLT_Emp.GetListOfEmployees(0, EmployeesList);
        
        if(CE.isThereError == true){
            System.out.println("Error:");
            System.out.println("Custom Message: " + CE.CustomMessage);
            System.out.println("System Message: " + CE.SystemMessage);
        }
        else{
            // הדפסת כל העובדים
            for (Employee emp : EmployeesList){
               System.out.println(emp); // (toString)
               System.out.println("\n");
           }
        }
        
        
        System.out.println("End");
    }
    
}



להורדה של כל התוכנית: כאן, או כאן.













רצוי שתבינו כל שורה בקוד הזה. בהצלחה...

אין תגובות:

הוסף רשומת תגובה