יום חמישי, 23 בנובמבר 2017

פרויקט דמו בג'אווה - קליטה ושינוי מה SQL Server

תקשורת בטוחה עם בסיס הנתונים - קריאה ועדכון

הפרויקט של עמית:
-להורדה-


לימדו אותו היטב.





משימה:
- לקבל את כל השורות של הטבלה "Categories" מבסיס הנתונים "NORTHWND" לתוך רשימה (מסוג ArrayList) של אובייקטים שמכילים את כל העמודות של הטבלה.
- לשנות את אחד מאיברי הרשימה, בלי לשנות את ה-id.
- לכתוב פונקציה שמקבלת את הרשימה ששינינו ומעדכנת את הטבלה ב-NORTHWND על פי אותה רשימה.
- לבדוק ב SQL Server שאכן הטבלה Categories עברה שינוי.







פתרון שלי:
-להורדה-




או...

קוד:

המחלקה main

import java.util.ArrayList;
import java.util.List;
/**
 * @author noamn
 */
public class TheMainClass {
    /*
    * שימו לב
    * Categories לפני ביצוע התוכנית הוספתי רשומה תשיעית לטבלה
    * זאת כדי לא לשנות את הרשומות המקוריות במהלך הקוד
    *
    * תוכן הרשומה לא משנה
    */

        public static void main(String[] args) {
        List<Category> CategoryList = null;
        SqlServerConnection SQL_CON = new SqlServerConnection();
        // אובייקט מהמחלקה שיצרנו לתקשורת עם השרת
        
        Category tmpCategory = new Category();
        tmpCategory.setAll(9,"Some name", "Test", null);
        
        try
        {
        CategoryList = SQL_CON.GetListOfCategoryObjects(0); // קבלת רשימה מהטבלה
        CategoryList.set(8, tmpCategory); // כלומר האיבר התשיעי  8 שינוי האיבר עם האינדקס 
        SQL_CON.updateCategories(CategoryList); // שינוי הטבלה בבסיס הנתונים עם הרשימה המעודכנת
        }
        catch(Exception e){
            System.out.println("Exeption: " + e);
        }
        
        if(CategoryList != null){
           for (Category item : CategoryList){ // הדפסת כל איברי הרשימה
               System.out.println("CategoryID:    "+item.getCategoryID());
               System.out.println("CategoryName:  "+item.getCategoryName());
               System.out.println("Description:   "+item.getDescription());
               System.out.println("CategoryID:    "+item.getPicture());
               System.out.println("\n");
           }
        }
        System.out.println("The End!   -   Good night.");    
    }





המחלקה SqlServerConnection

public class SqlServerConnection {
    String userName = "Game_User";
    String password = "12345";
    String dbName = "NORTHWND";
    
    
    // לקבל קישור לבסיס נתונים
    public Connection getConnection() throws Exception {
        String url = "jdbc:sqlserver://DESKTOP-RCEHUJ1;databaseName="+dbName;
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        Connection conn;
        conn = DriverManager.getConnection(url,userName,password);
        return conn;
    }
    
    
    //  numberOfLines להחזיר רשימה של הקטגוריות הראשונות כמספר
    // אפס משמעותו להביא את כל הקטגוריות
    public List<Category> GetListOfCategoryObjects(int numberOfLines) throws Exception
    {
        List<Category> CategoryList = new ArrayList<Category>(); // יצירת ואתחול רשימה
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        String selectString;

        if(numberOfLines == 0){ // את כל הרשומות
            selectString =
                "SELECT * FROM [NORTHWND].[dbo].[Categories]";
        }
        else{ //רשומות כמספר שקיבלנו
            selectString =
                "SELECT TOP " + numberOfLines
                + " * FROM [NORTHWND].[dbo].[Categories]"; 
        }
        
        try // נפתח בלוק טריי רק כדי לעשות שימוש בפיינלי
        {
           con = getConnection();
           st = con.createStatement();
           rs = st.executeQuery(selectString);
           
           while(rs.next()) // ריצה על התוצאות
           {
               Category tmp = new Category();
               tmp.setCategoryID(rs.getInt("CategoryID"));
               tmp.setCategoryName(rs.getString("CategoryName"));
               tmp.setDescription(rs.getString("Description"));
               tmp.setPicture(rs.getBytes("Picture"));
               
               CategoryList.add(tmp); //הוספה לרשימה 
           }
        }
        // לא עושים תפיסה של שגיאות כי משליכים אותן הלאה לפונקציה שקראה
        finally { // צריך לעשות סגירה של החיבור גם אם נפלנו באקספטשן
            if (st != null){ // כי אם נפלנו בהתחלה זה יהיה נאל
                st.close();
            }
            
            if (con != null){
                if (!con.isClosed()){  // לדוגמה אם נפל החשמל
                    con.close();
                }
            }
        }
        return CategoryList;
    }
   
    
    //Using Prepared Statements
    //https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

    // id שינוי טבלה בבסיס הנתונים על פי ה
    //  של איברי רשימה שאנחנו מקבלים
    public void updateCategories(List<Category> Categories )
        throws SQLException, Exception
    {
        
        Connection con = null;
        PreparedStatement stUpdateLetter = null;
        // נועד לשאילתות שמקבלות משתנים
        // שומר שלא נקבל משתנה שמשנה את המשמעות הרצויה של השאילה
        // לא נרצה שזה יפעיל פקודה זדונית "delete All DB" לדוגמה אם שם המשתמש הוא

        String updateString = 
            "UPDATE [" + dbName + "].[dbo].[Categories]"
                + " SET [CategoryName] = ? "
                + ", [Description] = ? "
                + ", [Picture] = ?"
                + " WHERE [CategoryID] = ?"; 
        // PreparedStatement סימני השאלה בקרוב יתמלאו בערכים על פי התחביר של
        try {
            con  = getConnection();
            stUpdateLetter = con.prepareStatement(updateString);
            for (Category item : Categories) {
                stUpdateLetter.setString(1,item.getCategoryName());
                stUpdateLetter.setString(2,item.getDescription());
                stUpdateLetter.setBytes(3,item.getPicture());
                stUpdateLetter.setInt(4,item.getCategoryID());
                
                stUpdateLetter.executeUpdate();
            }
        }

        finally {
            if (stUpdateLetter != null){ // כי אם נפלנו בהתחלה זה יהיה נאל
                stUpdateLetter.close();
            }
            if (con != null){
                if (!con.isClosed()){  // לדוגמה אם נפל החשמל
                    con.close();
                }
            }    
        }
    }
}





המחלקה Category

// מייצג את ערכי שורה אחת בטבלה
public class Category {
     private int mCategoryID;
     private String mCategoryName;
     private String mDescription;
     private byte[] mPicture;
     
     public int getCategoryID()
    {
        return mCategoryID;
    }
    public void setCategoryID(int value)
    {
      mCategoryID = value;  
    }
     public String getCategoryName()
    {
        return mCategoryName;
    }
    public void setCategoryName(String value)
    {
      mCategoryName = value;  
    }
    public String getDescription()
    {
        return mDescription;
    }
    public void setDescription(String value)
    {
      mDescription = value;  
    }
        public byte[] getPicture()
    {
        return mPicture;
    }
    public void setPicture(byte[] value)
    {
      mPicture = value;  
    }
    public void setAll(int id, String name, String info, byte[] pic)
    {
        mCategoryID = id;
        mCategoryName = name;
        mDescription = info;
        mPicture = pic;
    }
}






לקריאה נוספת: ResultSet interface (באנגלית)
בהצלחה!


3 תגובות:

  1. אני לא מצליח לקרוא את העבודה שלך ששלחת לעמית

    השבמחק
  2. הוא מוריד קובץ ZIP שאין לי מושג איך פותחים אותו

    השבמחק
    תשובות
    1. קליק ימני על הקובץ ואז "חלץ אל" ותרשום שם לאן אתה רוצה שהוא יחלץ לך ועדיף שתשים את הקובץ המחולץ במקום שנראה לך הגיוני

      מחק