Java
Duyệt các bài viết được gắn thẻ Java
106 bài viết

JDBC – người tiền sử trong kỷ Java
Bài viết được sự cho phép của tác giả Kiên Nguyễn 1. JDBC – người nguyên thủy. Trước tiên, nhắc tới JDBC (Java Database Connectivity) , ai trong số các bạn cũng liên tưởng về một API xưa cổ dùng để connect tới database và query dữ liệu. Nói nó xưa cổ là vì JDBC là công cụ thô sơ nhất, mộc mạc nhất dùng để kết nối tới cơ sở dữ liệu. Cái chân chất mộc mạc này tuy chán, nhưng lại là kiến thức nền tảng quan trọng cần phải nắm thật vững. Hướng dẫn kết nối cơ sở dữ liệu với Java JDBC Hibernate là gì? Sao phải dùng nó thay JDBC? Xem thêm các việc làm Java lương cao trên Station D Hiểu thật rõ về bản chất của JDBC có thể giúp ta vững vàng tìm hiểu thêm các frameworks mới và mạnh mẽ như Hibernate, JPA . Tất cả chúng, tựu chung đều sử dụng JDBC để thực hiện kết nối và lấy dữ liệu. Hình : Vị trí của JDBC trong application Bài viết này mình sẽ chú trọng tới bản chất và mô hình của JDBC . Mong rằng bài viết này sẽ giúp đỡ các bạn nhiều!. 2. JDBC – cái nhìn tổng quan qua ví dụ hàng hóa. Để hiểu JDBC, chúng ta cùng xem xét ví dụ thường gặp trong đời sống là lấy hàng từ kho. Một khách hàng muốn thực hiện lấy hàng từ một trong số các kho (Oracle, MySql, Sql Server, …), các bước tiến hành của anh ta như sau: Khởi tạo connection (liên lạc viên): trước tiên, khi muốn lấy hàng từ bất cứ kho hàng nào, điều đầu tiên luôn cần phải làm là thực hiện kết nối (getConnection) tới kho hàng....

Hướng dẫn sử dụng Set trong Java chi tiết
Set là một cấu trúc dữ liệu giao diện trong Java đại diện cho một tập hợp các phần tử duy nhất, không sắp xếp và không được đánh chỉ mục. Nói cách khác, Set là một tập hợp các đối tượng mà trong đó mỗi đối tượng chỉ xuất hiện một lần. Trong Java, Set được định nghĩa trong gói java.util. Có nhiều lớp triển khai Set khác nhau, bao gồm: HashSet, TreeSet và LinkedHashSet. Các khái niệm cơ bản về Set trong Java Trước khi đi vào cách sử dụng Set trong Java , hãy cùng Station D đi sơ lược các khái niệm cơ bản về Set. Đầu tiên , Set là một tập hợp các phần tử duy nhất, điều này có nghĩa là mỗi phần tử chỉ được lưu trữ một lần trong Set. Thứ hai , các phần tử trong Set không được sắp xếp theo bất kỳ thứ tự nào và thứ tự của chúng có thể thay đổi khi bạn thêm hoặc xóa các phần tử. Cuối cùng , bạn không thể truy cập các phần tử trong Set bằng chỉ mục, điều này khác với List trong Java. >>> Xem thêm: Sử dụng List để quản lý dữ liệu trong Java Cách sử dụng Set trong Java Để tạo một đối tượng Set, bạn có thể sử dụng các lớp triển khai cụ thể. Ví dụ: Set set = new HashSet(); Trong ví dụ trên, chúng ta đã tạo một đối tượng Set kiểu String bằng cách sử dụng lớp HashSet. Bạn cũng có thể sử dụng các lớp triển khai khác như TreeSet hoặc LinkedHashSet tùy thuộc vào nhu cầu của bạn. >>> Xem thêm: Các phương thức cơ bản của HashSet trong Java Phương thức thêm và xóa phần...

Generate keystore với PKCS12 format sử dụng công cụ keytool của Java
Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh PKCS12 là một trong những định dạng chuẩn của chứng chỉ SSL với khả năng bảo mật cao. Công cụ keytool của Java ngoài việc giúp chúng ta có thể generate JKS keystore dành riêng cho Java thì nó còn hỗ trợ chúng generate chứng chỉ PKCS12 này. 10 Java Web Framework tốt nhất 10 tips để trở thành Java Developer xịn hơn Xem thêm các chương trình tuyển dụng Java hấp dẫn trên Station D Cụ thể thì các bạn có thể command sau để generate chứng chỉ PKCS12 với keytool: keytool -genkeypair -alias <alias> -keyalg <keyalg> -keystore <keystore> -storetype PKCS12 Ý nghĩa của từng tham số trên, các bạn có thể tham khảo thêm ở bài viết Sử dụng keytool để generate keystore trong Java . Chỉ có khác biệt ở đây là chúng ta phải khai báo thêm tham số -storetype với giá trị là PKCS12. Extension của tập tin chứng chỉ PKCS12 có thể là .p12 hoặc .pfx các bạn nhé! Ví dụ, mình có thể generate chứng chỉ PKCS12 với câu lệnh sau: keytool -genkeypair -alias <alias> -keyalg <keyalg> -keystore <keystore> -storetype PKCS12 Kết quả: Các bạn cần nhập password để đảm bảo tính toàn vẹn của tập tin keystore (xem thêm option -storepass trong bài viết Sử dụng keytool để generate keystore trong Java ) rồi nhấn Enter: Nhập lại password rồi nhấn Enter tiếp: Trả lời một số câu hỏi rồi xác nhận. Nếu đúng hết thì nhập yes nhé các bạn! Sau khi generate xong, các bạn có thể vào thư mục được truyền trong câu lệnh (của mình là /Users/Khanh/Documents), nhập câu lệnh sau: keytool -list -keystore <keystore> -storepass <storepass> Ví dụ của mình như sau: Bài viết gốc...

Một số Patterns hay sử dụng trong React
Trong lập trình chúng ta thường sẽ gặp phải một số vấn đề chung lặp đi lặp lại trong các dự án khác nhau và sẽ có những kỹ thuật (lời giải) tương tự nhau để giải quyết bài toán đó. Khái niệm pattern chỉ những “mẫu” lời giải đó, nó thường được tổng hợp và khuyên dùng trong lập trình để xử lý và tránh các lỗi có thể gặp phải. Với React , chúng ta có một vài pattern được khuyên sử dụng và bài viết hôm nay chúng ta cùng tìm hiểu về chúng cùng các ví dụ cụ thể nhé. Higher-Order Function/Component Higher-Order functions là một hàm nhận một hàm khác dưới dạng đối số hoặc trả về một hàm dưới dạng đầu ra. Chúng ta có ví dụ dưới đây: function greaterThan ( n ) { return ( m ) => m > n ; } const greaterThan10 = greaterThan ( 10 ); console . log ( greaterThan10 ( 11 )); // true Ở ví dụ trên, hàm greaterThan trả về 1 function so sánh giá trị truyền vào với đối số xác định trước, cụ thể với hàm greaterThan10 thì đối số là 10. Từ đó chúng ta có thể tạo ra các function khác nhau bằng cách call function greaterThan và đối số truyền vào. Đấy chính là lợi ích của higher-order function. Hệ thống 23 mẫu Design Patterns Bridge Pattern trong Java – Code ví dụ Composite Pattern Từ khái niệm trên, trong React chúng ta cũng có khái niệm Higher-Order component (HOC), đó là 1 component mà: Nhận đầu vào 1 component và trả về 1 component mới Biến đổi 1 component thành 1 component khác Chúng ta có ví dụ dưới đây: const withColor = Element => props => <...

Cài đặt transaction in memory cho Java
Bài viết được sự cho phép của tác giả Trần Văn Dem Khi xây dựng hệ thống backend chúng ta thường xuyên phải làm việc với transaction – đây là một khái niệm rất quen thuộc với các lập trình viên backend . Việc nắm bắt và sử dụng thành thạo các loại này là việc cần thiêt để xây dựng một hệ thống backend tốt. Tuy nhiên trong nhiều trường hợp database chúng ta sử dụng lại không hỗ trợ transaction hoặc việc insert vào các loại cơ sở dữ liệu quan hệ được xử lý bởi các hệ thống acsync điều này khiến chúng ta phải xử lý các transaction trên logic trong application của mình. Những hệ thống trước đây tôi xây dựng đều phải xử lý điều này và sau khi tìm được một cách hay ho có thể sử dụng lại thì tôi quết định viết bài chia sẻ cho mọi người. Cách sử dụng Transaction trong SQL hiệu quả Transaction Processing – Everything must know Cài đặt transaction in memory Ta sẽ chú ý ví dụ lưu các sản phẩm khách hàng mua thành công trên RAM sau: import blog.common.transaction.element.TxnHashMap; import java.util.ArrayList; import java.util.List; public class TestTransaction { private TxnHashMap<String, List<String>> userData; public TestTransaction () { this .userData = new TxnHashMap<>(); } private void buySuccess (String userName, String productName) { if (!userData.contain(userName)) { userData.put(userName, new ArrayList<>()); } userData.get(userName).add(productName); } private void buyFail () { throw new RuntimeException( " something is error" ); } public TxnHashMap<String, List<String>> getUserData() { return userData; } public void setUserData (TxnHashMap<String, List<String>> userData) { this .userData = userData; } public static void main (String[] args) { TestTransaction test = new TestTransaction(); TxnManager manager = new TxnManager(); manager.executeTransaction(() -> { test.buySuccess( "demtv" , "iphone" ); test.buySuccess( "demtv" , "ipad" ); test.buySuccess(...

Tạo random số và chuỗi ngẫu nhiên trong Java
Bài viết được sự cho phép của tác giả Giang Phan Trong thế giới lập trình, việc tạo số ngẫu nhiên là một yêu cầu cơ bản và quan trọng, ảnh hưởng trực tiếp đến chất lượng và tính ngẫu nhiên của dữ liệu. Java, với sự đa dạng và mạnh mẽ của mình, cung cấp nhiều cách để sinh số ngẫu nhiên. Bài viết này sẽ giới thiệu ba phương pháp chính để tạo số ngẫu nhiên trong Java. Hướng dẫn tạo số ngẫu nhiên bằng Java chi tiết Để tạo một trình tạo số ngẫu nhiên (generator), đơn giản chỉ việc tạo một new instance của Random . Random generator = new Random(); Khi sử dụng hàm tạo này, bạn sẽ nhận ra rằng các trình tạo số ngẫu nhiên thuật toán không thực sự ngẫu nhiên , chúng thực sự là các thuật toán tạo ra một chuỗi số cố định nhưng trông ngẫu nhiên. Khi tạo một generator, nó sẽ khởi tạo chuỗi của nó từ một giá trị được gọi là “ seed ” của nó. Khi chúng ta sử dụng constructor không có tham số, nó sẽ tạo seed có một giá trị khác biệt với bất kỳ lời gọi nào khác của constructor này. Nhưng chúng ta không kiểm soát được giá trị đó là gì, hoặc thậm chí đảm bảo hoàn toàn rằng nó sẽ khác với seed được sử dụng bởi các lời gọi khác trên constructor này. Nếu thích, chúng ta cũng có thể chỉ định một giá trị bất kỳ thuộc kiểu “ long ” để khởi tạo cho seed. Ví dụ: Random generator = new Random( 19900828 ); Sau khi đã có generator, gọi các phương thức nextXxx() để tạo các giá trị ngẫu nhiên: nextInt() : trả...

Hướng dẫn Java Design Pattern – Builder
Các hàm xây dựng ( constructor ) trong Java được sử dụng để tạo đối tượng và có thể lấy các tham số cần thiết để tạo đối tượng. Vấn đề khi một đối tượng có thể được tạo ra với nhiều tham số ( param ), một số có thể là bắt buộc và một số khác có thể là tùy chọn tuỳ theo từng yêu cầu của người dùng, tuỳ vào hoàn cảnh của ứng dụng. Chúng ta, có thể tạo ra nhiều constructor theo từng nhu cầu hoặc gán giá trị null cho các param không cần thiết. Tuy nhiên, code rất khó đọc, khó bảo trì, người sử dụng có thể gán nhầm giá trị nếu một loạt các tham số có cùng kiểu. Chúng ta cũng có thể sử dụng một giải pháp khác là sử dụng setter() để thay thế cho constructor. Tuy nhiên, nếu muốn đối tượng này là immutable thì không thể. Do vậy, người ta mong muốn giao công việc này cho một đối tượng chịu trách nhiêm khởi tạo và chia việc khởi tạo đối tượng riêng lẽ, từng bước, để có thể tiến hành khởi tạo riêng biệt ở các hoàn cảnh khác nhau. Và giải pháp được đưa ra là sử dụng Builder Pattern như một người xây dựng. Builder Pattern là gì? Builder is a creational design pattern that separate the construction of a complex object from its representation so that the same construction process can create different representations. Builder pattern là một trong những Creational pattern . Builder pattern là mẫu thiết kế đối tượng được tạo ra để xây dựng một đối tượng phức tạp bằng cách sử dụng các đối tượng đơn giản và sử dụng tiếp cận từng bước, việc xây dựng các...

Java Enum là gì? Tại sao nên sử dụng enum?
Bài viết được sự cho phép của tác giả Kiên Nguyễn Trước khi bắt đầu, để hiểu rõ tại sao Senior Dev lại luôn sử dụng Java Enum , các bạn có thể tham khảo bài viết này. 10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java Kiểu Enum trong C/C++ (Code ví dụ Enumeration trong C/C++) Xem thêm các việc làm Java lương cao trên Station D 1. Enum là gì? 1.1 Định nghĩa. Định nghĩa thì nhàm chán , nhưng không đọc không được. =))) A Java Enum is a special Java type used to define collections of constants. More precisely, a Java enum type is a special kind of Java class. An enum can contain constants, methods etc. Java enums were added in Java 5. Java Enum là một kiểu đặc biệt sử dụng để định nghĩa một collections of constants (tập các giá trị cố định). Chính xác hơn, kiểu enum là một lớp Java đặt biệt. Enums có thể chứa các giá trị constants, method, … Java enums được thêm vào từ Java 5. 1.2 Ví dụ. Ví dụ kinh điển của Java, lụm từ W3Schools . // Trình trong trình độ. Chứ đ*o phải trinh. enum Trinh { LOW, MEDIUM, HIGH } public class HocCuaGai { public static void main(String[] args) { // Trình còi, cưa gái không nổi. Trinh cuagai = Trinh.LOW; // Chả muốn viết dòng này. System.out.println(cuagai); } } 2. Đôi điều thú vị. public class DoDen { public final String nuocBai; public static final DoDen CO = new DoDen("CƠ"); public static final DoDen RO = new DoDen("RÔ"); public static final DoDen CHUON = new DoDen("CHUỒN"); public static final DoDen BICH = new DoDen("BÍCH"); private DoDen(String nuocBai) { this.nuocBai = nuocBai; } public String...

Sử dụng phương thức flatMap() của đối tượng Stream trong Java
Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh Khi làm việc với đối tượng Stream trong Java , đôi khi chúng ta sẽ có những đối tượng Stream của những đối tượng List, Set hay là Array. Ví dụ như: List<String> students1 = new ArrayList<>(); students1.add("Khanh"); List<String> students2 = new ArrayList<>(); students2.add("Thanh"); students2.add("Dung"); List<List<String>> students = Arrays.asList(students1, students2); Stream<List<String>> stream = students.stream(); Ở đây, chúng ta có đối tượng List chứa những đối tượng List của những đối tượng String và khi convert đối tượng này qua đối tượng Stream, chúng ta có đối tượng Stream chứa đối tượng List của những đối tượng String. Java Stream – Collectors và Statistics Khi đó, nếu chúng ta cần thao tác trên đối tượng Stream này ví dụ như filter chẳng hạn thì chúng ta không thể làm được. Ví dụ như: Xem thêm nhiều việc làm Java hấp dẫn trên Station D Để giải quyết vấn đề này, chúng ta có thể sử dụng phương thức flatMap () trong đối tượng Stream trước khi chúng ta cần thao tác điều gì đó trên đối tượng Stream. Sử dụng phương thức flatMap() chúng ta có thể chuyển đổi đối tượng Stream của những đối tượng List, Set or Array thành đối tượng Stream của những đối tượng đơn giản hơn. Ví dụ như: List<String> students1 = new ArrayList<>(); students1.add("Khanh"); List<String> students2 = new ArrayList<>(); students2.add("Thanh"); students2.add("Dung"); List<List<String>> students = Arrays.asList(students1, students2); Stream<List<String>> stream = students.stream(); Stream<String> flatMap = stream.flatMap(l -> l.stream()); Tìm hiểu cơ chế Lazy Evaluation của Stream trong Java 8 Bây giờ, chúng ta có thể sử dụng phương thức flapMap() để giải quyết vấn đề trên: Bài viết gốc được đăng tải tại huongdanjava.com Xem thêm: Javascript sự khác biệt map và weakmap. What make...

Cài Đặt Các Công Cụ Phát Triển Cho Java
Bài viết được sự cho phép của tác giả Nhựt Danh Các bạn đều biết rằng, để có thể code được Java, nhất định cần phải xây dựng một môi trường lập trình cho nó. Với một môi trường lập trình như vậy, bạn sẽ có trong tay đầy đủ các công cụ cần thiết để có thể bắt tay vào xây dựng các dòng code cho riêng mình. Vậy thì một môi trường lập trình cho Java sẽ phải cần đến những công cụ gì? Xây dựng chúng như thế nào? Chúng ta hãy cùng bắt tay vào tìm hiểu cách xây dựng từng công cụ nhé! Cài Đặt JDK Tương tự như phần hướng dẫn cài đặt JDK ở bên bài học Android , nếu bạn nào đã làm theo hướng dẫn đó rồi thì có thể bỏ qua phần này mà đến thẳng việc cài đặt InteliJ bên dưới, vì 2 phần hướng dẫn của 2 bài giống nhau. Còn nếu chưa cài đặt JDK bao giờ thì bạn hãy vào trang của Oracle để download file cài đặt, bạn có thể vào bằng đường dẫn này đây (bạn cũng có thể search Google với từ khóa JDK Download ). Sau khi mở link, bạn sẽ thấy danh sách các gói cài đặt như hình sau (hình ảnh có thể khác với máy của bạn ở thời điểm hiện tại do trang web này luôn được làm mới thường xuyên). Ứng tuyển các vị trí việc làm Java lương cao trên Station D Nhiều gói JDK cho bạn cài đặt Bạn hãy chọn gói theo hệ điều hành mà bạn đang dùng rồi down về thôi. Sau khi download JDK về thì bạn tiến hành cài đặt nhé. Hướng dẫn cấu hình JDK (Java) cho Jenkins Thiết...

Các phần mềm giả lập Java dành cho máy tính tốt nhất
Java là một ngôn ngữ lập trình hỗ trợ đa nền tảng, nhất là trên các thiết bị di động, chúng ta có thể dễ dàng viết ứng dụng bằng Java sau đó build source code thành những tập tin .jar và chạy được trên điện thoại. Để có thể thử nghiệm các ứng dụng viết ra trực tiếp trên máy tính, các lập trình viên có thể sử dụng các phần mềm giả lập Java cho máy tính để có thể kiểm tra, thử nghiệm và tiết kiệm được thời gian. Bài viết hôm nay mình cũng các bạn tìm hiểu về các phần mềm giả lập Java phổ biến hiện nay nhé. Phần mềm giả lập là gì? Phần mềm giả lập là một chương trình cho phép hệ thống bắt chước giống như một hệ thống khác, chẳng hạn như phần mềm giả lập một điện thoại chạy trên máy tính. Chương trình giả lập cho phép các hoạt động bên trong nó chạy tương tự với trên thiết bị thật, có thể sử dụng các thiết bị ngoại vi được thiết kế riêng. Chúng ta có thể dễ gặp các phần mềm giả lập nổi tiếng như: giả lập console để chơi các tựa game console trên máy tính, giả lập điện thoại để chạy được các ứng dụng smartphone trên máy tính,…. Lợi ích của việc sử dụng phần mềm giả lập: Cho phép lập trình viên kiểm tra ứng dụng viết ra trên thiết bị “giống” thật nhất có thể để chỉnh sửa lại ứng dụng nếu cần Phần mềm giả lập cho phép lựa chọn nhiều thiết lập về màn hình, phần cứng,… khác nhau, điều mà mỗi thiết bị thật chỉ cung cấp được 1 lựa chọn duy nhất. Từ đó có...

Lưu ý cho Lock trong Java
Bài viết được sự cho phép của tác giả Trần Văn Dem Concurrent in Java Note Khi lập trình đa luồng việc đảm bảo tính threadsafe , visiable ,… là rất quan trọng. Để đạt được mục đích này, Java cung cấp rất nhiều phương pháp trong package java.util.concurrent Bài viết này sẽ cung cấp cho các bạn đầy đủ những kiến thức về lớp này để có thể áp dụng vào các project của mình. 1. Reentrant là gì? Khi lập trình hoặc các tài liệu về concurrent thường sẽ đề cập đến khái niệm Reentrant , Reentrant Lock . Vậy cụ thể tính Reentrant là gì? Xét ví dụ sau: public class ReentrantTest { private final Object object = new Object(); public void setA () { synchronized (object) { System.out.println( "setA" ); setB(); } } public void setB () { synchronized (object) { System.out.println( "setB" ); } } public static void main (String[] args) { ReentrantTest t = new ReentrantTest(); t.setA(); } } Nếu Lock được sử dụng trong hàm main() bên trên không phải dạng Reentrant thì sẽ gây ra deadlock và không thể kết thúc được chương trình. Trong Java có các loại reentrant lock sau : synchronized Các lock kế thừa từ class ReentrantLock.java . Trong quá trình làm việc của mình thì chỉ có một Lock không Reentrant đó là StampedLock Class trong Java là gì? Object trong Java là gì? Record class trong Java 2. FairSync vs NonfairSync Xét ví dụ khai báo ReentrantLock : var lock = new ReentrantLock(); . Click vào trong lớp ReentrantLock.java ta thấy được hàm khởi tạo sau ta sẽ thấy FairSync và NonfairSync /** * Creates an instance of { @code ReentrantLock}. * This is equivalent to using { @code ReentrantLock(false)}. */ public ReentrantLock () { sync=...