Bài giảng Lập Trình Hướng Đối Tượng

96 27 0
Bài giảng Lập Trình Hướng Đối Tượng

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

1.1. Những khái niệm cơ bản của lập trình hướng đối tượng 1.1.1. Phương pháp tiếp cận của lập trình truyền thống Để hiểu rõ tại sao lại phải học lập trình hướng đối tượng thì chúng ta sẽ xem xét các phương pháp lập trình truyền thống, từ đó sẽ thấy được các ưu và nhược điểm của từng phương pháp. Nội dung chúng ta sẽ tìm hiểu các phương pháp sau: Lập trình truyền thống đã trải qua hai giai đoạn: Giai đoạn sơ khai, khi khái niệm lập trình mới ra đời, là lập trình tuyến tính. Giai đoạn tiếp theo, là lập trình hướng cấu trúc.

UBND TỈNH THANH HÓA TRƯỜNG ĐẠI HỌC HỒNG ĐỨC TRỊNH THỊ PHÚ BÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Thanh Hóa, năm 2020 MỤC LỤC MỤC LỤC Chương 1: MỞ ĐẦU 1.1 Những khái niệm lập trình hướng đối tượng 1.1.1 Phương pháp tiếp cận lập trình truyền thống 1.1.2 Phương pháp tiếp cận lập trình hướng đối tượng 1.1.3 Các khái niệm lập trình hướng đối tượng 1.1.4 Xu hướng phát triển lập trình hướng đối tượng 1.2 Ngơn ngữ lập trình hướng đối tượng JAVA 1.2.1 Các ngơn ngữ lập trình hướng đối tượng 1.2.2 Giới thiệu JAVA 1.2.3 Các thành phần ngơn ngữ lập trình Java 1.2.4 Các cấu trúc điều khiển 16 1.2.5 Nhập xuất JAVA 23 Chương 2: LỚP VÀ ĐỐI TƯỢNG 26 2.1 LỚP VÀ ĐỐI TƯỢNG 26 2.1.1 Khái niệm lớp đối tượng 26 2.1.2 Khai báo/định nghĩa lớp 26 2.1.3 Tạo đối tượng lớp 27 2.1.4 Thuộc tính lớp 27 2.1.5 Hàm – phương thức class 28 2.1.6 Từ khóa this 30 2.1.7 Phương thức setter getter 35 2.1.8 Constructor 37 2.2 GÓI (PACKAGES) 38 2.2.1 Tính đóng gói Java 38 2.2.2 Khái niệm gói (package) 39 2.2.3 Tạo package Java 39 2.2.4 Cách biên dịch Java package 39 2.2.5 Từ khóa import Java 40 2.2.6 Sử dụng class 42 CHƯƠNG 3: THỪA KẾ VÀ ĐA HÌNH 45 3.1 THỪA KẾ 45 3.1.1 Quan hệ thừa kế 45 3.1.2 Cài đặt quan hệ thừa kế 45 3.1.3 Các kiểu kế thừa Java 47 3.1.4 Thành viên final 49 3.2 ĐA HÌNH 50 3.2.1 Upcast downcast 50 3.2.2 Static Binding Dynamic Binding 51 3.2.3 Overriding 52 3.2.4 Overloading 55 3.2.5 Tốn tử móc xích lớp kế thừa this() super() 56 3.3 INTERFACE VÀ INNER CLASS 58 3.3.1 Interface 58 3.3.2 Inner Class 60 3.4 LỚP TRỪU TƯỢNG 61 3.4.1 Lớp trừu tượng (abstract) 61 3.4.3 So sánh abstract class interface 62 3.4.4 Lớp final 63 3.6 MỘT SỐ LỚP CƠ BẢN TRONG JAVA 63 3.6.1 Các lớp Wapper (Integer, Double, Float, ) Array 63 3.6.2 Các lớp Collection (Collection, Set, List, Map, ArrayList, Vector, Hashtable, Hashset, HashMap) 64 3.6.3 Nhóm lớp String (String, StringBuffer, StringBuilder) 65 3.6.4 Các lớp tiện ích khác (StringTokenizer, Date, Calendar, SimpleDateFormat, Arrays) 66 3.6.5 RegularExpression 67 Chương 4: Các luồng vào liệu với file – Xử lý ngoại lệ 69 4.1 CÁC LUỒNG VÀO/RA TRONG JAVA 69 4.1.1 Khái niệm luồng 69 4.1.2 Luồng vào/ra tệp 69 4.2 Vào thiết bị chuẩn 73 4.2.1 Xuất liệu hình 74 4.2.2 Đọc liệu từ bàn phím vào chương trình 74 4.3 Xử lý ngoại lệ 75 4.3.1 Khái niệm 75 4.3.2 Sử dụng khối try … catch để xử lý ngoại lệ 75 4.3.3 Dùng try có nhiều catch 76 4.3.4 Xử lý ngoại lệ java – Sử dụng từ khóa throws 77 4.3.5 Xử lý ngoại lệ java – Tự tạo exception 78 Chương 5: LẬP TRÌNH CƠ SỞ DỮ LIỆU 79 5.1 Giới thiệu JDBC – ODBC 79 5.2 Kiến trúc JDBC 79 5.3 Kết nối đến CSDL 79 5.4 Các thao tác CSDL 80 Chương 1: MỞ ĐẦU 1.1 Những khái niệm lập trình hướng đối tượng 1.1.1 Phương pháp tiếp cận lập trình truyền thống Để hiểu rõ lại phải học lập trình hướng đối tượng xem xét phương pháp lập trình truyền thống, từ thấy ưu nhược điểm phương pháp Nội dung tìm hiểu phương pháp sau: Lập trình truyền thống trải qua hai giai đoạn: - Giai đoạn sơ khai, khái niệm lập trình đời, lập trình tuyến tính - Giai đoạn tiếp theo, lập trình hướng cấu trúc Lập trình tuyến tính Đặc trưng lập trình tuyến tính tư theo lối Chương trình thực từ đầu đến cuối, lệnh lệnh kết thúc chương trình Đặc trưng: Lập trình tuyến tính có hai đặc trưng: - Đơn giản: chương trình tiến hành đơn giản theo lối tuần tự, không phức tạp - Đơn luồng: có luồng (thread) cơng việc nhất, công việc thực luồng Tính chất: - Ưu điểm: Do tính đơn giản, lập trình tuyến tính có ưu điểm chương trình đơn giản, dễ hiểu Lập trình tuyến tính ứng dụng cho chương trình đơn giản - Nhược điểm: Với ứng dụng phức tạp, người ta khơng thể dùng lập trình tuyến tính để giải Ngày nay, lập trình tuyến tính tồn phạm vi mô đun nhỏ phương pháp lập trình khác Ví dụ chương trình lập trình cấu trúc, lệnh thực theo từ đầu đến cuối chương trình Lập trình cấu trúc Trong lập trình hướng cấu trúc, chương trình chia nhỏ thành chương trình chương trình thực cơng việc xác định Chương trình gọi đến chương trình theo giải thuật, cấu trúc xác định chương trình Các ngơn ngữ lập trình cấu trúc phổ biến Pascal, C C++ Riêng C++ việc có đặc trưng lập trình cấu trúc kế thừa từ C, cịn có đặc trưng lập trình hướng đối tượng Cho nên C++ gọi ngơn ngữ lập trình nửa cấu trúc, nửa hướng đối tượng Đặc trưng: Đặc trưng lập trình cấu trúc thể mối quan hệ: Chương trình = Cấu trúc liệu + Giải thuật Trong đó: - Cấu trúc liệu (CTDL) cách tổ chức liệu, cách mơ tả tốn dạng ngơn ngữ lập trình, - Giải thuật quy trình để thực cơng việc xác định Trong chương trình, giải thuật có quan hệ phụ thuộc vào CTDL: - Một CTDL phù hợp với số hạn chế giải thuật - Nếu thay đổi CTDL phải thay đổi giải thuật cho phù hợp - Một giải thuật thường phải kèm với CTDL định Tính chất: - Mỗi chương trình gọi thực nhiều lần chương trình - Các chương trình gọi đến để thực theo thứ tự bất kỳ, tuỳ thuộc vào giải thuật chương trình mà không phụ thuộc vào thứ tự khai báo chương trình - Các ngơn ngữ lập trình cấu trúc cung cấp số cấu trúc lệnh điều khiển chương trình Ưu điểm: - Chương trình sáng sủa, dễ hiểu, dễ theo dõi - Tư giải thuật rõ ràng Nhược điểm: - Lập trình cấu trúc khơng hỗ trợ việc sử dụng lại mã nguồn: Giải thuật ln phụ thuộc chặt chẽ vào CTDL, đó, thay đổi CTDL, phải thay đổi giải thuật, nghĩa phải viết lại chương trình - Khơng phù hợp với phần mềm lớn: tư cấu trúc với giải thuật phù hợp với toán nhỏ, nằm phạm vi mơ đun chương trình Với dự án phần mềm lớn, lập trình cấu trúc tỏ không hiệu việc giải mối quan hệ vĩ mô mô đun phần mềm Vấn đề Vấn đề lập trình cấu trúc cách để phân chia chương trình thành chương trình cho phù hợp với yêu cầu, chức mục đích toán 1.1.2 Phương pháp tiếp cận lập trình hướng đối tượng Xuất phát từ hai hạn chế phương pháp lập trình cấu trúc:  Khơng quản lí thay đổi liệu có nhiều chương trình thay đổi biến chung Vấn đề đặc biệt nghiêm trọng ứng dụng ngày lớn, người ta khơng thể kiểm sốt truy nhập đến biến liệu chung  Không tiết kiệm tài nguyên người: Giải thuật gắn liền với cấu trúc liệu, thay đổi cấu trúc liệu, phải thay đổi giải thuật, đó, phải viết lại mã chương trình từ đầu Để khắc phục hai hạn chế giải toán lớn, người ta xây dựng phương pháp tiếp cận mới, phương pháp lập trình hướng đối tượng, với hai mục đích chính: • Đóng gói liệu để hạn chế truy nhập tự vào liệu, khơng quản lí • Cho phép sử dụng lại mã nguồn, hạn chế việc phải viết lại mã từ đầu cho chương trình Việc đóng gói liệu thực theo phương pháp trừu tượng hoá đối tượng thành lớp từ thấp lên cao sau: • Thu thập thuộc tính đối tượng, gắn thuộc tính vào đối tượng tương ứng • Nhóm đối tượng có thuộc tính tương tự thành nhóm, loại bỏ bớt thuộc tính cá biệt, giữ lại thuộc tính chung Đây gọi q trình trừu tượng hố đối tượng thành lớp • Đóng gói liệu đối tượng vào lớp tương ứng Mỗi thuộc tính đối tượng trở thành thuộc tính lớp tương ứng • Việc truy nhập liệu thực thông qua phương thức trang bị cho lớp Không truy nhập tự trực tiếp đến liệu • Khi có thay đổi liệu đối tượng, ta cần thay đổi phương thức truy nhập thuộc tính lớp, mà không cần phải thay đổi mã nguồn chương trình sử dụng lớp tương ứng Việc cho phép sử dụng lại mã nguồn thực thông qua chế kế thừa lập trình hướng đối tượng Theo đó: • Các lớp kế thừa để tận dụng thuộc tính, phương thức • Trong lớp dẫn xuất (lớp kế thừa) sử dụng lại phương thức lớp sở (lớp bị lớp khác kế thừa) mà không cần thiết phải cài đặt lại mã nguồn • Ngay lớp dẫn xuất định nghĩa lại phương thức cho mình, lớp sở khơng bị ảnh hưởng khơng phải sửa lại đoạn mã nguồn Ngơn ngữ lập trình hướng đối tượng phổ biến Java C++ Tuy nhiên, C++ có đặc trưng lập trình hướng đối tượng khơng phải ngơn ngữ lập trình hướng đối tượng Java thật ngơn ngữ lập trình hướng đối tượng Đặc trưng Lập trình hướng đối tượng có hai đặc trưng bản: • Đóng gói liệu: liệu ln tổ chức thành thuộc tính lớp đối tượng Việc truy nhập đến liệu phải thông qua phương thức đối tượng lớp • Sử dụng lại mã nguồn: việc sử dụng lại mã nguồn thể thông qua chế kế thừa Cơ chế cho phép lớp đối tượng kế thừa từ lớp đối tượng khác Khiđó, lớp kế thừa, sử dụng phương thức (mã nguồn) lớp bị kế thừa, mà không cần phải định nghĩa lại Ưu điểm Lập trình hướng đối tượng có số ưu điểm bật: • Khơng cịn nguy liệu bị thay đổi tự chương trình Vì liệu đóng gói vào đối tượng Nếu muốn truy nhập vào liệu phải thông qua phương thức cho phép đối tượng • Khi thay đổi cấu trúc liệu đối tượng, không cần thay đổi đổi mã nguồn đối tượng khác, mà cần thay đổi số hàm thành phần đối tượng bị thay đổi Điều hạn chế ảnh hưởng xấu việc thay đổi liệu đến đối tượng khác chương trình • Có thể sử dụng lại mã nguồn, tiết kiệm tài nguyên Vì nguyên tắc kế thừa cho phép lớp kế thừa sử dụng phương thức kế thừa từ lớp khác phương thức nó, mà khơng cần thiết phải định nghĩa lại • Phù hợp với dự án phần mềm lớn, phức tạp 1.1.3 Các khái niệm lập trình hướng đối tượng Class: Một class tập hợp đối tượng (objects) mô tả đối tượng có chung thuộc tính hành động Nó chứa đặc tính đối tượng thuộc tính (attributes), hành động hành vi (behaviors) Đối tượng (Object): Một đối tượng thực thể giới thực có thuộc tính trạng thái hành vi Trong thuật ngữ OOP, tính chất gọi thuộc tính Class (Class Properties) Attributes đối tượng Bike Phương thức (Method): Phương thức hành vi đối tượng Ví dụ, bạn coi “Bike” class hành vi lấy thơng tin màu sắc, động cơ, vận tốc… Tính đóng gói (Encapsulation): Tính đóng gói quy trình giữ che giấu nhiều thành phần với gói vật lý logic Trong phương pháp lập trình hướng đối tượng, ngăn truy cập vào chi tiết triển khai bên đối tượng hay thư viện Tính đóng gói triển khai cách sử dụng từ khóa định truy cập (access specifiers) Một định truy cập định nghĩa phạm vi ẩn thành phần class Các từ khóa bao gồm public, private, protected, internal… Tính trừu tượng (Abstraction): Tính trừu tượng xử lý đưa thông tin đối tượng giới thực ẩn toàn chi tiết đối tượng Nó dựa chia tách interface triển khai interface Ví dụ tiếp tục với “Bike” ví dụ, không truy cập trực tiếp vào pit-tông, sử dụng nút START để khởi động pit-tơng Hãy tưởng tượng có nhà máy sản xuất xe máy cho phép truy xuất trực tiếp vào pit-tơng, khó để điều khiển hành động pit-tơng Đó lý nhà sản xuất xe máy chia tách chi tiết máy nội khỏi giao diện người dùng Che giấu thông tin (Information Hiding): Che giấu thông tin khái niệm giới hạn trực tiếp phơi bày liệu Dữ liệu truy cập gián tiếp sử dụng chế an toàn, phương thức lập trình hướng đối tượng Hãy xem lại ví dụ phần trừu tượng Tính kế thừa (Inheritance): Tính kế thừa OOP cho phép tạo class sử dụng class có sẵn mở rộng chúng Khái niệm liên quan đến ví dụ thực tế Hãy tạo ví dụ Bike Một nhà sản xuất xe máy sử dụng chế phiên xe có sẵn lúc chuẩn bị mắt phiên xe Ví dụ dùng máy 110 Wave thêm số tính tiện ích đồng thời thay vỏ để tạo dòng xe WaveS Điều cho phép nhà sản xuất tiết kiệm thời gian cơng sức Lợi ích việc mở rộng class cung cấp cách thức tiện lợi để sử dụng lập đoạn code kiểm thử lần trước giúp tiết kiệm nhiều thời gian cơng sức Tính đa hình (Polymorphism): Từ đa hình(Polymorphism) nghĩa có nhiều khn mẫu Tổng quan, đa hình xuất có danh sách class chúng có liên quan đến thông qua kế thừa Hãy lấy ví dụ Bike, Bike có khn mẫu xe đề xe đạp Chúng ta định phương thức vận hành muốn sử dụng để khởi động (nghĩa lúc chạy) Có kiểu đa hình:  Đa hình thời điểm biên dịch (Compile time polymorphism): Đây kiểu đa hình mà trình biên dịch nhận dạng khn mẫu thực thời điểm biên dịch gọi compile time polymorphism hay gọi early binding Ví dụ gọi Nạp chống phương thức (Method Overloading) Nạp chồng toán tử (Operator Overloading) Method Overloading nghĩa có nhiều phương thức có tên khác số lượng tham số class khác class – Lợi ích: Thực thi nhanh tất phương thức nhận dạng thời điểm biên dịch – Điểu yếu: Không mềm dẻo Chú ý: Khi nạp chống phương thức, quy tắc tuân theo nạp chống phương thức phải so sánh số lượng đối số kiểu liệu đối số Chúng ta xem Method Overriding ví dụ việc đa hình thời điểm biên dịch gọi trực tiếp đối tượng khởi tạo  Đa hình thời điểm thực thi (Runtime polymorphism): Trong kiểu đa hình này, trình biên dịch nhận dạng khn mẫu đa hình thực thi thời điểm chạy thời diểm biên dịch gọi đa hình thời điểm thực thi late binding Ví dụ early binding Method Overriding Method Overriding nghĩa có hai phương thức với tên signature, phương thức class Base, phương thức class Child Nó yêu cầu thay đổi hành vi phương thức class Base class sử dụng – Lợi ích: Nó mềm dẻo đề điều chỉnh kiểu đối tượng thời điểm thực thi – Hạn chế: Thực thi chậm phải thời gian lấy thơng tin phương thức thời điểm chạy 1.1.4 Xu hướng phát triển lập trình hướng đối tượng Lập trình hướng thành phần (Component-oriented programming-COP) Xuất phát từ lập trình hướng đối tượng, tư lập trình hướng thành phần theo ý tưởng: Giải toán cách xây dựng tập thành phần (component) có tính độc lập tương Mỗi thành phần đảm nhiệm phần cơng việc định Sau đó, người ta ghép thành phần với để thu phần mềm thoả mãn tập yêu cầu xác định Với lập trình hướng thành phần, người ta tiến hành lập trình theo phương pháp sau: Xây dựng thư viện thành phần, thành phần thực công việc xác định Khi cần phát triển phần mềm cụ thể, người ta cần chọn thành phần có sẵn thư viện để ghép lại với Người lập trình phải phát triển thêm thành phần cần mà chưa có thư viện Phương pháp có ưu điểm lớn: Lập trình viên chia sẻ với thành phần xây dựng cho nhiều người khác dùng chung Khi cần, lập trình viên lắp ghép thành phần có sẵn khác để tạo thành chương trình có chức khác Tất cần dựa công nghệ lắp ghép thành phần, tiết kiệm nhiều cơng sức lập trình Trong xu hướng lập trình hướng thành phần, số phương pháp lập trình khác nảy sinh phát triển mạnh mẽ: Lập trình hướng tác nhân (Agent-Oriented Programming) Lập trình hướng khía cạnh (Aspect-Oriented Programming-AOP) Lập trình hướng tác nhân (Agent-Oriented Programming) Lập trình hướng agent xem mức trừu tượng cao lập trình hướng thành phần Trong đó, agent thành phần có khả họat động độc lập, tự chủ để hoàn thành cơng việc Hơn nữa, agent có khả chủ động liên lạc với agent khác để phối hợp, cộng tác hay cạnh tranh để hồn thành nhiệm vụ Lập trình hướng agent có hai đặc trưng bản: Thứ khả tự chủ agent để hoàn thành nhiệm vụ riêng Thứ hai tính tổ chức xã hội agent, cho phép agent phối hợp, cộng tác, cạnh tranh để hoàn thành nhiệm vụ chung tồn hệ thống Lập trình hướng khía cạnh (Aspect-Oriented Programming-AOP) Phương pháp lập trình hướng khía cạnh phương pháp lập trình phát triển tư tách biệt mối quan tâm khác thành mô đun khác Ở đây, mối quan tâm thường chức nghiệp vụ cụ thể đóng gói mà khía cạnh (thuộc tính) chung mà nhiều mơ đun phần mềm hệ thống nên có, ví dụ lưu vết thao tác lỗi (error logging) Với AOP, cài đặt mối quan tâm chung cắt ngang hệ thống mô đun đặc biệt gọi aspect thay dàn trải chúng mơ đun nghiệp vụ liên quan Các aspect sau tự kết hợp với mô đun nghiệp vụ khác trình gọi đan (weaving) biên dịch đặc biệt AspectJ công cụ AOP cho ngôn ngữ lập trình Java Trình biên dịch AspectJ đan xen chương trình Java với aspect thành tập tin bytecode chạy máy ảo Java 1.2 Ngôn ngữ lập trình hướng đối tượng JAVA 1.2.1 Các ngơn ngữ lập trình hướng đối tượng Nội dung phần trình bày số ngơn ngữ lập trình hướng đối tượng thơng dụng nay: • Ngơn ngữ lập trình C++ • Ngơn ngữ lập trình ASP.NET C#.NET • Ngơn ngữ lập trình Java C++ C++, đời vào năm 1980, ngơn ngữ lập trình hướng đối tượng mở rộng từ ngôn ngữ lập trình cấu trúc C Cho nên, C++ ngơn ngữ lập trình nửa hướng đối tượng, nửa hướng cấu trúc Những đặc trưng hướng đối tượng C++ • Cho phép định nghĩa lớp đối tượng • Cho phép đóng gói liệu vào lớp đối tượng Cho phép định nghĩa phạm vi truy nhập liệu lớp từ khố phạm vi • Cho phép kế thừa lớp với kiểu kế thừa khác tuỳ vào từ khố dẫn xuất • Cho phép lớp kế thừa sử dụng phương thức lớp bị kế thừa (trong phạm vi quy định) • Cho phép định nghĩa chồng phương thức lớp kế thừa Những vi phạm hướng đối tượng C++ Những vi phạm kết kế thừa từ ngôn ngữ C, ngơn ngữ lập trình cấu trúc • Cho phép định nghĩa sử dụng biến liệu tự • Cho phép định nghĩa sử dụng hàm tự • Ngay liệu đóng gói vào lớp, liệu truy nhập trực tiếp liệu tự hàm bạn, lớp bạn (friend) C++ ASP.NET C#.NET Các ngơn ngữ lập trình NET (cịn gọi NET Frameworks) MicroSoft đời vào cuối năm 1990 để cạnh tranh với ngôn ngữ lập trình Java .NET ngơn ngữ hồn tồn hướng đối tượng, nữa, cịn cung cấp giao diện lập trình đồ họa thân thiện đẹp mắt với truyền thống lập trình kéo thả MicroSoft Một số đặc điểm ngơn ngữ NET: • Là ngơn ngữ hồn tồn hướng đối tượng: Tất thành phần, thực thể chương trình mơ hình dạng lớp định Khơng có liệu tự hàm tự chương trình • Cung cấp giao diện lập trình đồ họa: lập trình viên cần kéo thả đối tượng đồ họa cho ứng dụng • Cho phép lập trình viên tự tạo thư viện UserControl Đây thư viện bao gồm thành phần người dùng tự thiết kế giao diện, viết mã nguồn, đóng gói sử dụng lại nhiều ứng dụng khác nhau, tuỳ theo chức thành phần Java Java ngơn ngữ lập trình Sun Microsystems giới thiệu vào tháng năm 1995 Java xây dựng tảng C C++: Java sử dụng cú pháp C đặc trưng hướng đối tượng C++ Một số đặc điểm Java: • Java ngơn ngữ lập trình hồn tồn hướng đối tượng: Tất thực thể coi đối tượng, thể cụ thể lớp xác định Khơng có liệu tự hàm tự Java, tất đóng gói vào lớp xác định • Java ngơn ngữ vừa biên dịch vừa thông dịch Đầu tiên mã nguồn biên dịch thành dạng bytecode; sau thực thi loại máy nhờ trình thơng dịch Điều tạo khả họat động độc lập với tảng phần cứng ứng dụng Java • Java cho phép người dùng tự tạo đối tượng thư viện JavaBeans (tương tự thành phần UserControl NET) Các đối tượng Bean sử dụng lại thành phần có sẵn ứng dụng khác Điều mở khả to lớn để tiết kiệm công sức viết mã nguồn khả xây dựng kỹ thuật cho công nghiệp lắp ráp phần mềm 1.2.2 Giới thiệu JAVA Java ngơn ngữ lập trình máy tính có tính chất hướng đối tượng, dựa lớp, thường sử dụng cho hệ thống có tính độc lập cao Nó sử dụng để hướng tới lập trình viên viết ứng dụng "write one, run everywhere" (viết lần, chạy nơi, nghĩa đoạn code Java sau biên dịch chạy tất tảng hỗ trợ Java mà không cần phải biên dịch lại Các ứng dụng Java sau biên dịch thành bytecode chạy máy ảo Java (Java virtual machine) Java viết James Gosling Sun MicroSystems phát hành năm 1995 Cú pháp ban đầu Java dựa nhiều vào cú pháp ngôn ngữ C C++ Cho đến năm 2015, Java ngôn ngữ dùng phổ biến giới, đặc biệt cho úng dựng web client- server Theo thống kê giới có khoảng triệu lập trình viên Java Các quy tắc viết Java: Đơn giản, hướng đối tượng, thân thiện Mạnh mẽ có tính bảo mật Có kiến trình hài hịa có tính chất di động Là ngơn ngữ có hiệu cao Thơng dịch, đa tiến trình, linh động Java gì? Java Ngơn ngữ lập trình Platform Ngơn ngữ lập trình: Java ngơn ngữ lập trình có tính bảo mật cao, hướng đối tượng, bậc cao mạnh mẽ Platform: Bất môi trường phần cứng phần mền mà chương trình chạy, biết đến Platform Với môi trường runtime riêng cho JRE API, Java gọi Platform Ví dụ Java Bạn theo dõi ví dụ đơn giản sau để in Hello World, phần giải thích chi tiết trình bày chương class Simple{ public static void main(String args[]){ System.out.println("Hello World"); } } Nơi Java sử dụng? Có nhiều thiết bị sử dụng Java Bao gồm:  Desktop App media player, antivirus, reader, …  Web App irctc.co.in, javatpoint.com, …  Enterprise App ứng dụng xử lý nghiệp vụ ngân hàng, …  Trên thiết bị Mobile Các loại Java App Có loại ứng dụng mà tạo sử dụng ngơn ngữ lập trình Java: Standalone App Nó cịn biết đến với tên gọi khác Destop App Windows-based App Một ứng dụng mà cần cài đặt thiết bị media player, antivirus, … AWT Swing sử dụng Java để tạo Standalone App Web App Một ứng dụng mà chạy Server Side tạo Dynamic Page, gọi Web App Hiện tại, công nghệ Servlet, JSP, Struts, JSF, … sử dụng để tạo Web App Java Enterprise App Một ứng dụng dạng Banking App, có lợi tính bảo mật cao, cân tải (load balancing) clustering Trong java, EJB sử dụng để tạo Enterprise App Mobile App Đây loại ứng dụng tạo cho thiết bị mobile Hiện Android Java ME sử dụng để tạo loại ứng dụng 1.2.3 Các thành phần ngơn ngữ lập trình Java a) Bảng chữ: JAVA phân biệt chữ hoa, chữ thường b) Định danh (Identifier) Java: Tất thành phần Java yêu cầu tên Tên sử với class, biến phương thức gọi Định danh (Identifier) Trong Java, có vài điểm quan trọng bạn phải ghi nhớ với Định danh (Identifier):  Tất idenfier nên bắt đầu với chữ (A tới Z a tới z), ký tự ($) ký tự gạch (_)  Sau kí tự ký tự  Những key word Java sử dụng identifier  Các identifier phân biệt chữ hoa thường  Các trường hợp hợp lệ: tuoi, $ten, giatri, 1_giatri  Các trường hợp không hợp lệ: 123abc, -hocphi c) Biến Java - Biến vùng nhớ dùng để lưu trữ giá trị chương trình - Mỗi biến gắn liền với kiểu liệu định danh gọi tên biến - Tên biến thông thường chuỗi ký tự (Unicode), ký số - Tên biến phải bắt đầu chữ dấu gạch hay dấu dollar - Tên biến khoảng trắng tên - Trong java, biến khai báo nơi đâu chương trình - Tên biến khơng trùng với từ khóa Java (Ví dụ từ khóa : abstract, assert, boolean, break, byte, case, catch, char, class, const, continue, default, do, double, else, enum, extends final, finally, float, for,goto, if , implements , import, instanceof, int, interface, long, native, new, package, private, protected, public, return, short , static, strictfp, super, switch, synchronized, this throw, throws, transient, try, void, volatile, while.) - Ví dụ:  Tên biến đúng: a , _a, A, _b, _B, $d, hoTen, _giaTri, sinhVien1, sinhVien2 Tên biến sai: 5a , hoc sinh, 1gia tri, if, try - Lưu ý: Trong Java phân biệt chữ hoa chữ thường, cần lưu ý đặt tên cho biễn, đối tương liệu xử lý chương trình Khai báo biến Java Cấu trúc câu lệnh khai báo biến java sau: [Kiểu liệu] [tên biến]; Ví dụ: int giaTri; // Khái báo biến có tên “giaTri”, kiểu liệu int – kiểu số nguyên String hoTen; //Khai báo biến có tên “hoTen”, kiểu liệu String – Là chuỗi ký tự - Ngồi cịn có thêm từ khóa (public, private, ….) trước dòng khai báo biến (vd: private String hoTen), phần nói sang phần hướng đối tượng Java - Để gán giá trị cho biến ta việc dùng cú pháp Tên biến = giá trị, gán trình khai báo Ví dụ: int giaTri; giaTri = 5; Hoặc int giaTri = 5; Để in chuỗi văn giá trị hình Console ta dùng lệnh dạng sau: System.out.print(“Giá trị biến là: ”+ giaTri1 + giaTri2); // giaTri1 giaTri2 biến khai báo gán giá trị d) Kiểu liệu Java Trong Java có nhóm kiểu liệu, thứ kiểu liệu nguyên thủy (dữ liệu sở) thứ nhóm kiểu liệu mở rộng: Trước vào giới thiệu chi tiết kiểu liệu, bạn theo dõi bảng tóm tắt sau: Kiểu liệu Giá trị mặc định Kích cỡ mặc định boolean false bit char '\u0000' byte byte byte short byte int byte long 0L byte float 0.0f byte 10 Giờ bạn sẵn sàng làm việc với Database ( Oracle, MySQL, SQL Server) 3- Connection Trong tài liệu hướng dẫn hướng dẫn cách kết nối vào loại database:  MySQL  SQLServer  Oracle Trong thực hành, bạn cần làm việc với loại DB mà bạn quen thuộc Chúng ta tạo class ConnectionUtils để lấy đối tượng Connection kết nối với Database 82 ConnectionUtils.java ? 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 package org.o7planning.tutorial.jdbc; import java.sql.Connection; import java.sql.SQLException; public class ConnectionUtils { public static Connection getMyConnection() throws SQLException, ClassNotFoundException { // Sử dụng Oracle // Bạn thay Database return OracleConnUtils.getOracleConnection(); } // // Test Connection // public static void main(String[] args) throws SQLException, ClassNotFoundException { System.out.println("Get connection "); // Lấy đối tượng Connection kết nối vào database Connection conn = ConnectionUtils.getMyConnection(); System.out.println("Get connection " + conn); System.out.println("Done!"); } } OracleConnUtils.java ? 10 11 12 13 14 package org.o7planning.tutorial.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class OracleConnUtils { // Kết nối vào ORACLE public static Connection getOracleConnection() throws SQLException, ClassNotFoundException { String hostName = "localhost"; String sid = "db11g"; String userName = "simplehr"; 83 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 String password = "simplehr"; return getOracleConnection(hostName, sid, userName, password); } public static Connection getOracleConnection(String hostName, String sid, String userName, String password) throws ClassNotFoundException, SQLException { // Khai báo class Driver cho DB Oracle // Việc cần thiết với Java // Java6 tự động tìm kiếm Driver thích hợp // Nếu bạn dùng Java6, ko cần dịng Class.forName("oracle.jdbc.driver.OracleDriver"); // Cấu trúc URL Connection dành cho Oracle // Ví dụ: jdbc:oracle:thin:@localhost:1521:db11g String connectionURL = "jdbc:oracle:thin:@" + hostName + ":1521:" + sid; Connection conn = DriverManager.getConnection(connectionURL, userName, password); return conn; } } MySQLConnUtils.java ? 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 package org.o7planning.tutorial.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class MySQLConnUtils { // Kết nối vào MySQL public static Connection getMySQLConnection() throws SQLException, ClassNotFoundException { String hostName = "localhost"; String dbName = "simplehr"; String userName = "root"; String password = "1234"; return getMySQLConnection(hostName, dbName, userName, password); } public static Connection getMySQLConnection(String hostName, String dbName, String userName, String password) throws SQLException, ClassNotFoundException { // Khai báo class Driver cho DB MySQL // Việc cần thiết với Java // Java6 tự động tìm kiếm Driver thích hợp // Nếu bạn dùng Java6, ko cần dòng Class.forName("com.mysql.jdbc.Driver"); // Cấu trúc URL Connection dành cho Oracle // Ví dụ: jdbc:mysql://localhost:3306/simplehr String connectionURL = "jdbc:mysql://" + hostName + ":3306/" + dbName; Connection conn = DriverManager.getConnection(connectionURL, userName, password); return conn; } } SQLServerConnUtils_JTDS.java ? 10 package org.o7planning.tutorial.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SQLServerConnUtils_JTDS { 84 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 // Kết nối vào SQLServer // (Sử dụng thư viện điều khiển JTDS) public static Connection getSQLServerConnection() throws SQLException, ClassNotFoundException { String hostName = "localhost"; String sqlInstanceName = "SQLEXPRESS"; String database = "simplehr"; String userName = "sa"; String password = "1234"; return getSQLServerConnection(hostName, sqlInstanceName, database, userName, password); } // Trường hợp sử dụng SQLServer // Và thư viện JTDS public static Connection getSQLServerConnection(String hostName, String sqlInstanceName, String database, String userName, String password) throws ClassNotFoundException, SQLException { // Khai báo class Driver cho DB SQLServer // Việc cần thiết với Java // Java6 tự động tìm kiếm Driver thích hợp // Nếu bạn dùng Java6, ko cần dịng Class.forName("net.sourceforge.jtds.jdbc.Driver"); // Cấu trúc URL Connection dành cho SQLServer // Ví dụ: // jdbc:jtds:sqlserver://localhost:1433/simplehr;instance=SQLEXPRESS String connectionURL = "jdbc:jtds:sqlserver://" + hostName + ":1433/" + database + ";instance=" + sqlInstanceName; Connection conn = DriverManager.getConnection(connectionURL, userName, password); return conn; } } SQLServerConnUtils_SQLJDBC.java ? 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 package org.o7planning.tutorial.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SQLServerConnUtils_SQLJDBC { // Kết nối vào SQLServer // (Sử dụng thư viện điều khiển SQLJDBC) public static Connection getSQLServerConnection() throws SQLException, ClassNotFoundException { String hostName = "localhost"; String sqlInstanceName = "SQLEXPRESS"; String database = "simplehr"; String userName = "sa"; String password = "1234"; return getSQLServerConnection(hostName, sqlInstanceName, database, userName, password); } // Trường hợp sử dụng SQLServer // Và thư viện SQLJDBC public static Connection getSQLServerConnection(String hostName, String sqlInstanceName, String database, String userName, String password) throws ClassNotFoundException, SQLException { // Khai báo class Driver cho DB SQLServer // Việc cần thiết với Java // Java6 tự động tìm kiếm Driver thích hợp // Nếu bạn dùng Java6, ko cần dòng Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); // Cấu trúc URL Connection dành cho SQLServer // Ví dụ: // jdbc:sqlserver://ServerIp:1433/SQLEXPRESS;databaseName=simplehr String connectionURL = "jdbc:sqlserver://" + hostName + ":1433" 85 38 39 40 41 42 43 44 45 + ";instance=" + sqlInstanceName + ";databaseName=" + database; Connection conn = DriverManager.getConnection(connectionURL, userName, password); return conn; } } ODBCConnUtils.java ? 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 package org.o7planning.tutorial.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class ODBCConnUtils { // Lấy kết nối vào ODBC Data Source có tên "simplehr-ds" public static Connection getJdbcOdbcConnection() throws SQLException, ClassNotFoundException { String odbcDataSourceName = "simplehr-ds"; String userName = "simplehr"; String password = "simplehr"; return getJdbcOdbcConnection(odbcDataSourceName, userName, password); } public static Connection getJdbcOdbcConnection(String odbcDataSourceName, String userName, String password) throws SQLException, ClassNotFoundException { // Khai báo class Driver (Cầu nối Jdbc-Odbc) // Việc cần thiết với Java // Java6 tự động tìm kiếm Driver thích hợp // Nếu bạn dùng Java6, ko cần dịng Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Cấu trúc URL Connection dành cho JDBC-ODBC String connectionURL = "jdbc:odbc:" + odbcDataSourceName; Connection conn = DriverManager.getConnection(connectionURL, userName, password); return conn; } } Bạn thay đổi Class ConnectionUtils để sử dụng kết nối tới Database quen thuộc Và chạy class để test kết nối Chú ý: Nếu bạn sử dụng MySQL SQL Server mặc định Database chặn không cho phép kết nối vào từ IP khác Bạn cần cấu hình phép điều Bạn xem hướng dẫn tài liệu cài đặt cấu hình MySQL, SQL Server o7planning Cài đặt cấu hình MySQL Community:  Hướng dẫn cài đặt cấu hình MySQL Community Cài đặt cấu hình SQL Server:  Hướng dẫn cài đặt cấu hình SQL Server Express 2014 4- Sử dụng JDBC API truy vấn liệu Đây hình ảnh liệu bảng Employee Chúng ta xem cách Java lấy liệu thơng qua ví dụ: 86 ResultSet đối tượng Java, trả bạn truy vấn (query) liệu Sử dụng ResultSet.next() để di chuyển trỏ tới ghi (Di chuyển dịng) Tại ghi bạn sử dụng method ResultSet.getXxx() để lấy giá trị cột Các cột đánh với thứ tự 1,2,3, ** ResultSet ** ? 10 11 12 13 public String getString(int columnIndex) throws SQLException; public boolean getBoolean(int columnIndex) throws SQLException; public int getInt(int columnIndex) throws SQLException; public double getDouble(int columnIndex) throws SQLException; public String getString(String columnLabel) throws SQLException; public boolean getBoolean(String columnLabel) throws SQLException; public int getInt(String columnLabel) throws SQLException; public double getDouble(String columnLabel) throws SQLException; Ví dụ minh họa: QueryDataExample.java ? 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 package org.o7planning.tutorial.jdbc.basic; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.o7planning.tutorial.jdbc.ConnectionUtils; public class QueryDataExample { public static void main(String[] args) throws ClassNotFoundException, SQLException { // Lấy đối tượng Connection kết nối vào DB Connection connection = ConnectionUtils.getMyConnection(); // Tạo đối tượng Statement Statement statement = connection.createStatement(); String sql = "Select Emp_Id, Emp_No, Emp_Name from Employee"; // Thực thi câu lệnh SQL trả đối tượng ResultSet ResultSet rs = statement.executeQuery(sql); // Duyệt kết trả while (rs.next()) {// Di chuyển trỏ xuống ghi int empId = rs.getInt(1); String empNo = rs.getString(2); String empName = rs.getString("Emp_Name"); System.out.println(" "); System.out.println("EmpId:" + empId); System.out.println("EmpNo:" + empNo); System.out.println("EmpName:" + empName); 87 35 36 37 38 39 40 } // Đóng kết nối connection.close(); } } Kết chạy ví dụ: 5- Các kiểu ResultSet Bạn làm quen với ResultSet với ví dụ phía Mặc định ResultSet duyệt liệu chạy từ xuống dưới, từ trái sang phải Điều có nghĩa với ResultSet mặc định bạn gọi:  ResultSet.previous() : Lùi lại ghi  Trên ghi gọi ResultSet.getXxx(4) gọi ResultSet.getXxx(2) Việc cố tình gọi bị Exception ? public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException; // Ví dụ: Statement statement = connection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); // ResultSet cuộn (tiến lùi, sang trái sang phải) ResultSet rs = statement.executeQuery(sql); resultSetType Ý nghĩa TYPE_FORWARD_ONLY - ResultSet cho phép duyệt từ xuống dưới, từ trái sang phải Đây kiểu mặc định ResultSet TYPE_SCROLL_INSENSITIVE - ResultSet cho phép cuộn tiến lùi, sang trái, sang phải, không nhạy với thay đổi liệu DB Nghĩa trình duyệt qua ghi lúc duyệt lại ghi đó, khơng lấy liệu ghi mà bị thay đổi TYPE_SCROLL_SENSITIVE - ResultSet cho phép cuộn tiến lùi, sang trái, sang phải, nhạy cảm với thay đổi liệu resultSetConcurrency Ý nghĩa CONCUR_READ_ONLY - Khi duyệt liệu với ResultSet kiểu bạn đọc liệu CONCUR_UPDATABLE - Khi duyệt liệu với ResultSet kiểu bạn thay đổi liệu nơi trỏ đứng, ví dụ update giá trị cột ScrollableResultSetExample.java ? package org.o7planning.tutorial.jdbc.basic; import java.sql.Connection; import java.sql.ResultSet; 88 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 import java.sql.SQLException; import java.sql.Statement; import org.o7planning.tutorial.jdbc.ConnectionUtils; public class ScrollableResultSetExample { public static void main(String[] args) throws ClassNotFoundException, SQLException { // Lấy đối tượng Connection kết nối tới DB Connection connection = ConnectionUtils.getMyConnection(); // Tạo đối tượng Statement // Có thể cuộn liệu, không nhậy với thay đổi DB // Con trỏ có khả đọc, khơng có khả update liệu q trình duyệt Statement statement = connection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); String sql = "Select Emp_Id, Emp_No, Emp_Name from Employee"; // Thực thi câu lệnh SQL trả đối tượng ResultSet ResultSet rs = statement.executeQuery(sql); // Nhẩy trỏ tới cuối boolean last = rs.last(); System.out.println("last : "+ last); if(last) { // Ghi thông tin ghi cuối System.out.println("EmpId:" + rs.getInt(1)); System.out.println("EmpNo:" + rs.getString(2)); System.out.println("EmpName:" + rs.getString(3)); } System.out.println(" "); // Nhẩy trỏ lùi lại lần boolean previous =rs.previous(); System.out.println("Previous 1: "+ previous); // Nhẩy lùi trỏ lần previous =rs.previous(); System.out.println("Previous 2: "+ previous); // Duyệt kết trả while (rs.next()) { // Lấy liệu cột String empNo = rs.getString(2); // Rồi lấy liệu cột int empId = rs.getInt(1); String empName = rs.getString("Emp_Name"); System.out.println(" "); System.out.println("EmpId:" + empId); System.out.println("EmpNo:" + empNo); System.out.println("EmpName:" + empName); } // Đóng kết nối connection.close(); } } Kết chạy ví dụ: 89 6- Ví dụ Insert liệu InsertDataExample.java ? package org.o7planning.tutorial.jdbc.basic; 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import org.o7planning.tutorial.jdbc.ConnectionUtils; public class InsertDataExample { public static void main(String[] args) throws ClassNotFoundException, SQLException { // Lấy kết nối tới sở liệu Connection connection = ConnectionUtils.getMyConnection(); Statement statement = connection.createStatement(); String sql = "Insert into Salary_Grade (Grade, High_Salary, Low_Salary) " + " values (2, 20000, 10000) "; // Thực thi câu lệnh // executeUpdate(String) sử dụng cho loại lệnh Insert,Update,Delete int rowCount = statement.executeUpdate(sql); // In số dòng trèn vào câu lệnh System.out.println("Row Count affected = " + rowCount); } } Kết chạy ví dụ: 7- PreparedStatement PreparedStatement Interface Statement PreparedStatement sử dụng để chuẩn bị trước câu lệnh SQL, tái sử dụng nhiều lần, giúp cho chương trình thực nhanh PrepareStatementExample.java ? package org.o7planning.tutorial.jdbc.pareparedstatement; 90 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.o7planning.tutorial.jdbc.ConnectionUtils; public class PrepareStatementExample { public static void main(String[] args) throws ClassNotFoundException, SQLException { // Lấy kết nối tới sở liệu Connection connection = ConnectionUtils.getMyConnection(); // Tạo câu SQL có tham số (?) String sql = "Select emp.Emp_Id, emp.Emp_No, emp.Emp_Name, emp.Dept_Id from Employee emp " + " where emp.Emp_Name like ? and emp.Dept_Id = ? "; // Tạo đối tượng PreparedStatement PreparedStatement pstm = connection.prepareStatement(sql); // Sét đặt giá trị tham số thứ (Dấu ? thứ nhất) pstm.setString(1, "%S"); // Sét đặt giá trị tham số thứ hai (Dấu ? thứ hai) pstm.setInt(2, 20); ResultSet rs = pstm.executeQuery(); while (rs.next()) { System.out.println(" "); System.out.println("EmpId : " + rs.getInt("Emp_Id")); System.out.println("EmpNo : " + rs.getString(2)); System.out.println("EmpName : " + rs.getString("Emp_Name")); } System.out.println(); System.out.println("Set other parameters "); // Tái sử dụng PreparedStatement // Sét đặt tham số khác pstm.setString(1, "KI%"); pstm.setInt(2,10); // Thực thi câu lệnh truy vấn rs = pstm.executeQuery(); while (rs.next()) { System.out.println(" "); System.out.println("EmpId : " + rs.getInt("Emp_Id")); System.out.println("EmpNo : " + rs.getString(2)); System.out.println("EmpName : " + rs.getString("Emp_Name")); } } } Kết chạy ví dụ: 91 8- CallableStatement CallableStatement xây dựng để gọi thủ tục (procedure) hàm (function) SQL ? // Câu lệnh gọi thủ tục SQL Java String sql = "{call procedure_name(?,?,?)}"; // Câu lệnh gọi hàm SQL Java String sql ="{? = call function_name(?,?,?)}"; Để làm ví dụ với CallableStatement cần hàm thủ tục DB Với Oracle, MySQL SQLServer bạn tạo nhanh thủ tục đây:  ORACLE Get_Employee_Info ? 10 11 12 13 14 15 16 Thủ tục lấy thông tin nhân viên, Truyền vào tham số p_Emp_ID (Integer) Có tham số đầu v_Emp_No, v_First_Name, v_Last_Name, v_Hire_Date Create Or Replace Procedure Get_Employee_Info(p_Emp_Id Integer ,v_Emp_No Out Varchar2 ,v_First_Name Out Varchar2 ,v_Last_Name Out Varchar2 ,v_Hire_Date Out Date) Is Begin v_Emp_No := 'E' || p_Emp_Id; -v_First_Name := 'Michael'; v_Last_Name := 'Smith'; v_Hire_Date := Sysdate; End Get_Employee_Info;  MySQL Get_Employee_Info ? 10 11 12 13 14 15 16 Thủ tục lấy thông tin nhân viên, Truyền vào tham số p_Emp_ID (Integer) Có tham số đầu v_Emp_No, v_First_Name, v_Last_Name, v_Hire_Date CREATE PROCEDURE get_Employee_Info(p_Emp_ID Integer, out v_Emp_No out v_First_Name Out v_Last_name Out v_Hire_date BEGIN set v_Emp_No = concat( 'E' , Cast(p_Emp_Id as char(15)) -set v_First_Name = 'Michael'; set v_Last_Name = 'Smith'; set v_Hire_date = curdate(); END  SQL Server Get_Employee_Info ? Thủ tục lấy thông tin nhân viên, Truyền vào tham số p_Emp_ID (Integer) 92 Varchar(50) , Varchar(50) , Varchar(50) , Date) ); 10 11 12 13 14 15 16 17 18 Có tham số đầu v_Emp_No, v_First_Name, v_Last_Name, v_Hire_Date CREATE PROCEDURE Get_Employee_Info @p_Emp_Id Integer , @v_Emp_No Varchar(50) OUTPUT, @v_First_Name Varchar(50) OUTPUT, @v_Last_Name Varchar(50) OUTPUT, @v_Hire_Date Date OUTPUT AS BEGIN set @v_Emp_No = 'E' + CAST( @p_Emp_Id as varchar) -set @v_First_Name = 'Michael'; set @v_Last_Name = 'Smith'; set @v_Hire_date = getdate(); END ; CallableStatementExample.java ? 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 package org.o7planning.tutorial.jdbc.callablestatement; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.Date; import java.sql.SQLException; import org.o7planning.tutorial.jdbc.ConnectionUtils; public class CallableStatementExample { public static void main(String[] args) throws ClassNotFoundException, SQLException { // Lấy kết nối tới sở liệu Connection connection = ConnectionUtils.getMyConnection(); // Câu lệnh gọi thủ tục (***) String sql = "{call get_Employee_Info(?,?,?,?,?)}"; // Tạo đối tượng CallableStatement CallableStatement cstm = connection.prepareCall(sql); // Truyền tham số vào hàm (p_Emp_ID) // (Là dấu chấm hỏi thứ câu lệnh sql ***) cstm.setInt(1, 10); // Đăng ký nhận giá trị trả dấu hỏi thứ // (v_Emp_No) cstm.registerOutParameter(2, java.sql.Types.VARCHAR); // Đăng ký nhận giá trị trả dấu hỏi thứ // (v_First_Name) cstm.registerOutParameter(3, java.sql.Types.VARCHAR); // Đăng ký nhận giá trị trả dấu hỏi thứ // (v_Last_Name) cstm.registerOutParameter(4, java.sql.Types.VARCHAR); // Đăng ký nhận giá trị trả dấu hỏi thứ // (v_Hire_Date) cstm.registerOutParameter(5, java.sql.Types.DATE); // Thực thi câu lệnh cstm.executeUpdate(); String empNo = cstm.getString(2); String firstName = cstm.getString(3); String lastName = cstm.getString(4); Date hireDate = cstm.getDate(5); System.out.println("Emp No: " + empNo); System.out.println("First Name: " + firstName); System.out.println("Last Name: " + lastName); System.out.println("Hire Date: " + hireDate); } } Kết chạy ví dụ: 93 9- Điều khiển giao dịch (Transaction) Giao dịch (Transaction) khái niệm quan trọng SQL Ví dụ người A chuyển khoản tiền 1000$ vào tài khoản người B Database diễn trình:  Trừ số dư tài khoản người A 1000$  Thêm vào số dư tài khoản người B 1000$ Và giao dịch gọi thành công bước thành công Ngược lại cần hai bước hỏng coi giao dịch không thành công, phải rollback lại trạng thái ban đầu TransactionExample.java ? 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 package org.o7planning.tutorial.transaction; import java.sql.Connection; import java.sql.SQLException; import org.o7planning.tutorial.jdbc.ConnectionUtils; public class TransactionExample { private static void doJob1(Connection conn) { // Làm // Insert update liêu } private static void doJob2(Connection conn) { // Làm // Insert update liêu } public static void main(String[] args) throws ClassNotFoundException, SQLException { // Lấy kết nối tới sở liệu Connection connection = ConnectionUtils.getMyConnection(); // Sét đặt chế độ tự động Commit thành false // Để tự quản lý việc commit chương trình connection.setAutoCommit(false); try { // Làm việc liên quan tới DB doJob1(connection); // Lamf nhiệm vụ thứ doJob2(connection); // Gọi method commit liệu xuống DB connection.commit(); } // Có vấn đề lỗi xẩy catch (Exception e) { e.printStackTrace(); // Rollback liệu connection.rollback(); } // Đóng Connection connection.close(); } } 10- Thực thi lô lệnh (Batch) BatchExample.java 94 ? 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 package org.o7planning.tutorial.transaction; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import org.o7planning.tutorial.jdbc.ConnectionUtils; public class BatchExample { public static void main(String[] args) throws SQLException, ClassNotFoundException { Connection conn = ConnectionUtils.getMyConnection(); try { // Create statement object Statement stmt = conn.createStatement(); // Set auto-commit to false conn.setAutoCommit(false); // Create SQL statement // Tạo câu lệnh Insert liệu vào bảng Employee String sql1 = "Update Employee emp set emp.Salary = emp.Salary + 100 " + " where emp.Dept_Id = 10 "; // Add above SQL statement in the batch // Thêm câu lệnh SQL vào lô stmt.addBatch(sql1); // Create one more SQL statement String sql2 = "Update Employee emp set emp.Salary = emp.Salary + 20 " + " where emp.Dept_Id = 20 "; // Add above SQL statement in the batch // Thêm vào lô stmt.addBatch(sql2); // Create one more SQL statement String sql3 = "Update Employee emp set emp.Salary = emp.Salary + 30 " + " where emp.Dept_Id = 30 "; // Add above SQL statement in the batch // Thêm vào lô stmt.addBatch(sql3); // Create an int[] to hold returned values int[] counts = stmt.executeBatch(); System.out.println("Sql1 count = " + counts[0]); System.out.println("Sql2 count = " + counts[1]); System.out.println("Sql3 count = " + counts[2]); // Explicitly commit statements to apply changes conn.commit(); } catch (Exception e) { e.printStackTrace(); conn.rollback(); } } } Kết chạy ví dụ: BatchExample2.java ? package org.o7planning.tutorial.transaction; 95 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.UUID; import org.o7planning.tutorial.jdbc.ConnectionUtils; public class BatchExample2 { public static void main(String[] args) throws ClassNotFoundException, SQLException { Connection conn = ConnectionUtils.getMyConnection(); try { String sql = "Insert into Timekeeper(Timekeeper_Id, Date_Time, In_Out, Emp_Id) " + " values (?,?,?,?) "; // Create statement object PreparedStatement stmt = conn.prepareStatement(sql); // Set auto-commit to false conn.setAutoCommit(false); // Sét đặt tham số stmt.setString(1, UUID.randomUUID().toString()); stmt.setDate(2, new Date(System.currentTimeMillis())); stmt.setString(3, "I"); stmt.setInt(4, 7839); // Thêm vào lô stmt.addBatch(); // Sét đặt giá trị tham số khác stmt.setString(1, UUID.randomUUID().toString()); stmt.setDate(2, new Date(System.currentTimeMillis())); stmt.setString(3, "I"); stmt.setInt(4, 7566); // Thêm vào lô stmt.addBatch(); // Create an int[] to hold returned values int[] counts = stmt.executeBatch(); System.out.println("counts[0] = " + counts[0]); System.out.println("counts[1] = " + counts[1]); } // Explicitly commit statements to apply changes conn.commit(); } catch (Exception e) { e.printStackTrace(); conn.rollback(); } } Kết chạy ví dụ: 96 ... ngữ lập trình hướng đối tượng phổ biến Java C++ Tuy nhiên, C++ có đặc trưng lập trình hướng đối tượng ngôn ngữ lập trình hướng đối tượng Java thật ngơn ngữ lập trình hướng đối tượng Đặc trưng Lập. .. lập trình hướng đối tượng JAVA 1.2.1 Các ngơn ngữ lập trình hướng đối tượng Nội dung phần trình bày số ngơn ngữ lập trình hướng đối tượng thơng dụng nay: • Ngơn ngữ lập trình C++ • Ngơn ngữ lập. .. trình hướng đối tượng 1.1.4 Xu hướng phát triển lập trình hướng đối tượng 1.2 Ngơn ngữ lập trình hướng đối tượng JAVA 1.2.1 Các ngơn ngữ lập trình hướng đối tượng

Ngày đăng: 12/03/2022, 19:58

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan