Kết
Trên đây là một số khái niệm cơ bản về Hibernate mà Stringee muốn giới thiệu đến các bạn. Trong các bài viết tiếp theo chúng ta sẽ cùng tìm hiểu cách cài đặt và sử dụng các API của Hibernate.
Stringee Communication APIs là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 – 3 năm.
Bộ API giao tiếp của Stringee hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy, Adavigo, bTaskee…
Quý bạn đọc quan tâm xin mời đăng ký NHẬN TƯ VẤN TẠI ĐÂY:
Hibernate là gì? Thông tin chi tiết và cách sử dụng công cụ này
Kiến thức lập trình không bao giờ có giới hạn. Nếu bạn là một người hay có dịp làm việc cùng ngôn ngữ lập trình Java, hẳn bạn đã từng nghe đến cái tên Hibernate. Đương nhiên chúng ta đều biết Hibernate là một công cụ hỗ trợ đối với những phần mềm được phát triển từ Java. Tuy nhiên phải nắm rõ khái niệm Hibernate là gì cùng cấu tạo và cách sử dụng nó thì bạn mới có thể phát huy hoàn toàn ưu điểm của Hibernate được. Bài viết sau để của Teky sẽ giúp bạn khám phá các đặc điểm cơ bản nhất của Java Hibernate.
Sau đây là các lý do khiến ta chọn Hibernate thay vì JDBC.
Object Mapping
Với JDBC ta phải map các trường trong bảng với các thuộc tính của Java object một cách “thủ công”. Với Hibernate sẽ hỗ trợ ta map một cách “tự động” thông qua các file cấu hình map XML hay sử dụng các anotation. JDBC sẽ map Java object với table như sau.
//rs là ResultSet trả về từ câu query get dữ liệu bảng user. List
users=new ArrayList
(); while(rs.next()) { User user = new User(); user.setUserId(rs.getString("UserId")); user.setName(rs.getString("FirstName")); user.setEmail(rs.getString(“Email”)); users.add(user); }
Cũng với table user đó sử dụng các anotaion để Hibernate có thể map một cách “tự động” như sau.
@Entity @Table(name = "user") public class UserModel { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private BigInteger id; @NotEmpty @Column(name = "email", unique = true) private String email; @NotEmpty @Column(name = "name") private String name; public BigInteger getId() { return this.id; } public void setId(BigInteger id) { this.id = id; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } }
HQL
Hibernate cung cấp các câu lệnh truy vấn tương tự SQL, HQL của Hibernate hỗ trợ đầy đủ các truy vấn đa hình như, HQL “hiểu” các khái niệm như kế thừa (inheritance), đa hình (polymorphysm), và liên kết (association). Sau đây là ví dụ về câu lệnh HQL.
... Session session = null; try { session = sessionFactory.openSession(); Query query = session.createQuery("select s.empId, s.name, s.salary from Salary s "); Iterator sal = query.iterate(); System.out.println("EmpId \t Name \t Salary"); while(sal.hasNext()) { Object[] obj = (Object[]) sal.next(); System.out.println(obj[0]+" \t "+ obj[1]+ " \t "+ obj[2]); } } catch(Exception e) { System.out.println(e.getMessage()); } finally { session.close(); }
Database Independent
Code sử dụng Hibernate là độc lập với hệ quản trị cơ sở dữ liệu, nghĩa là ta không cần thay đổi câu lệnh HQL khi ta chuyển từ hệ quản trị CSDL MySQL sang Oracle, hay các hệ quản trị CSDL khác… Do đó rất dễ để ta thay đổi CSDL quan hệ, đơn giản bằng cách thay đổi thông tin cấu hình hệ quản trị CSDL trong file cấu hình.
//used MySQLcom.mysql.jdbc.Driver // used Oracleoracle.jdbc.driver.OracleDriver
Ví dụ khi ta muốn lấy 10 bản ghi dữ liệu của một table từ 2 CSDL khác nhau Với JDBC ta có câu truy vấn như sau.
#MySQL SELECT column_name FROM table_name ORDER BY column_name ASC LIMIT 10; #SQL Server SELECT TOP 10 column_name FROM table_name ORDER BY column_name ASC;
Với Hibernate câu truy vấn không thay đổi với cả 2 CSDL.
Session.CreateQuery("SELECT E.id FROM Employee E ORDER BY E.id ASC").SetMaxResults(10).List();
Minimize Code Changes
Khi ta thay đổi (thêm) cột vào bảng, Với JDBC ta phải thay đổi những gì:
- Thêm thuộc tính vào POJO class.
- Thay đổi method chứa câu truy vấn “select”, “insert”, “update” để bổ sung cột mới. Có thể có rất nhiều method, nhiều class chứa các câu truy vấn như trên. Với Hibernate ta chỉ cần:
- Thêm thuộc tính vào POJO class.
- Cập nhật Hibernate XML mapping file để thêm map column – property. Ta chỉ thay đổi duy nhất 2 file trên.
Lazy Loading
Với những ứng dụng Java làm việc với cơ sở dữ liệu lớn hàng trăm triệu bản ghi, việc có sử dụng Lazy loading trong truy xuất dữ liệu từ database mang lại lợi ích rất lớn. Nó giống như việc ta có thể bẻ từng chiếc đũa của bó đũa to thay vì bẻ cả bó đũa. Ví dụ những file tài liệu do người dùng upload được lưu ở bảng document. Bảng user có quan hệ một-nhiều với bảng document. Trong trường hợp này class User là class cha, class Document là class con. Bảng document nhanh chóng đầy lên theo thời gian. Mỗi khi ta lấy thông tin user và docment tương ứng từ database giả sử dữ liệu document là rất lớn, để ứng dụng không bị chậm vì phải mất nhiều bộ nhớ để chứa toàn bộ document của toàn bộ user, ta áp dụng Lazy loading cho từng user như sau.
// Declaring fetch type for one to many association in your POJO @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) private Set
documents = new HashSet
(); // To fetch user with document use initialize() method as follows User user = (User)session.get(User.class, new Integer(100)); //This code will fetch all products for user 100 from database 'NOW' documents = user.getDocuments();
Loại bỏ Try-Catch Blocks
Sử dụng JDBC nếu lỗi xảy khi tao tác với database thì sẽ có exception
SQLexception
bắn ra. Bởi vậy ta phải sử dụng try-catch block để xử lý ngoại lệ.
Hibernate xử lý việc này giúp bạn bằng cách nó override toàn bộ JDBC exception thành Uncheck xeption, và ta không cần viết try-catch trong code của mình nữa.
Quản lý commit/rollback Transaction
Transaction là nhóm các hoạt động (với database) của một tác vụ. Nếu một hoạt động không thành công thì toàn bộ tác vụ không thành công.
Với JDBC lập trình viên phải chủ động thực hiện
commit
khi toàn bộ hoạt động của tác vụ thành công, hay phải
rollback
khi có một hoạt động không thành công để kết thúc tác vụ.
Với Hibernate thì ta không cần quan tâm đến
commit
hay
rollback
, Hibernate đã quản lý nó giúp ta rồi.
Hibernate Caching
Hibernate cung cấp một cơ chế bộ nhớ đệm, giúp giảm số lần truy cập vào database của ứng dụng càng nhiều càng tốt. Điều này sẽ có tác dụng tăng performance đáng kể cho ứng dụng của bạn. Hibernate lưu trữ các đối tượng trong session khi transation được kích hoạt. Khi một query được thực hiện liên tục, giá trị được lưu trữ trong session được sử dụng lại. Khi một transaction mới bắt đầu, dữ liệu được lấy lại từ database và được lưu trữ session. Hibernate cung cấp hai cấp độ Cach, mình sẽ có bài chi tiết hơn về Cach trong Hibernate.
Tài liệu tham khảo
All rights reserved
Hibernate Framework là gì?
ORM
Như chúng ta đã biết, ORM (Object Relational Mapping) framework là một cơ chế cho phép người lập trình thao tác với database một cách hoàn toàn tự nhiên thông qua các đối tượng. Lập trình viên hoàn toàn không quan tâm đến loại database sử dụng SQL Server, MySQL, PostgreSQL, …
ORM giúp đơn giản hoá việc tạo ra dữ liệu, thao tác dữ liệu và truy cập dữ liệu. Đó là một kỹ thuật lập trình để ánh xạ đối tượng vào dữ liệu được lưu trữ trong cơ sở dữ liệu.
Peristence layer
Một ứng dụng có thể được chia làm 3 phần như sau: giao diện người dùng (presentation layer), phần xử lý nghiệp vụ (business layer) và phần chứa dữ liệu (data layer). Cụ thể ra, business layer có thể được chia nhỏ thành 2 layer con là business logic layer và persistence layer.
- Business logic layer: các tính toán logic nhằm thỏa mãn yêu cầu người dùng.
- Persistence layer: chịu trách nhiệm giao tiếp với data layer (thường là một hệ quản trị cơ sở dữ liệu quan hệ – Relational DBMS). Persistence sẽ đảm nhiệm các nhiệm vụ mở kết nối, truy xuất và lưu trữ dữ liệu vào các Relational DBMS.
Hibernate
Hibernate là một trong những ORM Framework. Hibernate framework là một framework cho persistence layer. Như vậy, nhờ có Hibernate framework mà giờ đây khi bạn phát triển ứng dụng bạn chỉ còn chú tâm vào những layer khác mà không phải bận tâm nhiều về persistence layer nữa.
Hibernate giúp lập trình viên viết ứng dụng Java có thể map các object (POJO) với hệ quản trị cơ sở dữ liệu quan hệ (database), và hỗ trợ thực hiện các khái niệm lập trình hướng đối tượng với cơ dữ liệu quan hệ.
Hibernate giúp lưu trữ và truy vấn dữ liệu quan hệ mạnh mẽ và nhanh. Hibernate cho phép bạn truy vẫn dữ liệu thông qua Java Persistence API (JPA) hoặc bằng ngôn ngữ SQL mở rộng của Hibernate (HQL) hoặc bằng SQL thuần (Native SQL).
Hibernate vốn là một thư viện sinh ra để làm việc với mọi loại database, nó không phụ thuộc vào bạn chọn loại database nào. Nếu Java là “Viết 1 lần chạy mọi nơi” thì Hibernate là “Viết 1 lần chạy trên mọi loại database”.
Lợi ích của Hibernate Framework
Hibernate Framework có các lợi ích như dưới đây:
- Mã nguồn mở và nhẹ: Hibernate Framework là mã nguồn mở có giấy phép LGPL và nhẹ.
- Hiệu suất nhanh: Hiệu suất của Hibernate Framework là nhanh bởi vì bộ nhớ cache được sử dụng trong nội bộ Hibernate Framework. Có hai loại bộ nhớ cache trong Hibernate Framework, gồm bộ nhớ cache cấp một (first level cache) và bộ nhớ cache cấp hai (second level cache). Bộ nhớ cache cấp một được enable mặc định.
- Truy vấn cơ sở dữ liệu độc lập: HQL (Hibernate Query Language) là phiên bản hướng đối tượng của SQL. Nó tạo ra các truy vấn cơ sở dữ liệu độc lập. Vì vậy, bạn không cần phải viết các truy vấn cơ sở dữ liệu cụ thể. Trước Hibernate, nếu dự án có cơ sở dữ liệu bị thay đổi, chúng ta cần phải thay đổi truy vấn SQL dẫn đến risk và dễ gây lỗi.
- Tạo bảng tự động: Hibernate framework cung cấp phương tiện để tạo ra các bảng cơ sở dữ liệu một cách tự động. Vì vậy, không cần phải tốn công sức tạo ra các bảng trong cơ sở dữ liệu thủ công.
- Đơn giản lệnh join phức tạp: Có thể lấy dữ liệu từ nhiều bảng một cách dễ dàng với Hibernate framework.
- Cung cấp thống kê truy vấn và trạng thái cơ sở dữ liệu: Hibernate hỗ trợ bộ nhớ cache truy vấn và cung cấp số liệu thống kê về truy vấn và trạng thái cơ sở dữ liệu.
Database
Hibernate hỗ trợ hầu hết tất cả RDBMS chính, chẳng hạn: Oracle, Microsoft SQL Server, PostgreSQL, MySQL, …
Học Viện Công Nghệ Teky được chọn là địa chỉ học lập trình uy tín nhất cho trẻ
TEKY là Học viện sáng tạo công nghệ với chương trình giảng dạy STEAM (Science – Technology – Engineering – Art – Mathematics) theo chuẩn Mỹ đầu tiên tại Việt Nam dành cho trẻ em từ 4 đến 18 tuổi.
Được thành lập vào tháng 6 năm 2016, TEKY quyết tâm thực hiện sứ mệnh mang đến cho thế hệ trẻ Việt Nam kiến thức toàn diện về STEAM, đặc biệt là các tư duy công nghệ, khoa học máy tính và kỹ năng thế kỷ 21 – 4Cs (Critical Thinking: Tư duy phản biện – Communication: Giao tiếp – Creativity: Sáng tạo – Collaboration: Làm việc nhóm).
Đây là chương trình không chỉ trang bị kiến thức lập trình mà còn rèn luyện nhóm kỹ năngTrẻ sẽ được:
- Học tư duy phản biện thông qua việc phân tích các vấn đề.
- Học tính sáng tạo tư duy Logic thông qua việc lắp đặt và lập trình robot th ông qua các mô hình Lego Mindstorm, app trò chơi. Giúp con học giỏi môn Toán trên lớp
- Kỹ năng hợp tác thông qua các trò chơi team-building, các dự án nhóm trên lớp.
- Phát huy khả năng giao tiếp hiệu quả bằng nhiều bài tập và hoạt động hấp dẫn.
Các bộ môn giảng dạy tại Teky gồm: Lập trình và phát triển ứng dụng, lập trình game, lập trình web với python Lập trình Scratch Robotics Engineering, Công nghệ 3D và MultiMedia. Chúng tôi tin rằng trẻ em Việt Nam có cơ hội phát triển mạnh mẽ trong một nền kinh tế số và cần được trang bị sẵn sàng để trở thành những doanh nhân công nghệ trong tương lai.
Liên hệ ngay học viện công nghệ sáng tạo TEKY để được tư vấn khóa học:
- Cam kêt 7 tuổi có thể lập trình
- Top 10 dự án giáo dục có tầm ảnh hưởng nhất Đông Nam Á 2017 & 2018
- Top 3 Dự án xuất sắc nhất, NextGen – Thụy Sĩ
- Hotline Hà Nội: 024-7109-6668 | 0975-241-015
- Hotline Hồ Chí Minh: 028-7109 9948 | 097-900-8642
Website https://teky.edu.vn | Email: [email protected] |
Những lý do khiến ta chọn Hibernate thay vì JDBC
Bài đăng này đã không được cập nhật trong 2 năm
JDBC là công cụ thô sơ nhất, mộc mạc nhất giúp ta kết nối CSDL trong ứng dụng Java. Và rồi Hibernate ra đời, nó mang trong mình nhiều công cụ hữu ích giúp cho việc kết nối với CSDL một cách thuận tiện, dễ dàng hơn.
Trước tiên tôi xin liệt kê một số “vấn đề” gặp phải khi sử dụng JDBC.
- Ta phải lặp đi lặp lại những dòng code giống nhau trong ứng dụng chỉ để lấy dữ liệu từ database.
- Chúng ta phải vất vả vởi việc map giữa Object Java với các table tương ứng trong database.
- Tốn nhiều công sức để thay đổi từ hệ quản trị CSDL này (MySQL) sang một hệ quản trị CSDL khác (Oracle).
- Khó khăn trong việc tạo các giao tiếp/liên hệ giữa các table, lập trình OOPs.
Nhưng với Hibernate ta có thể hóa giải được các “vấn đề” trên. Nhưng trước tiên ta xem lại các khái niệm cơ bản JDBC và Hibernate là gì?
Hibernate là gì?
Hibernate là một dạng khung ORM hoạt động phục vụ trong persistence layer. Sự phát triển của Hibernate giúp người dùng giảm bớt một số công việc liên quan đến persistence layer. Nhiệm vụ chính của Hibernate là viết mã bằng ngôn ngữ lập trình Java. Các mã này giúp cho các đối tượng – object (POJO) có thể map được với các hệ thống quản lý cơ sở dữ liệu quan hệ (database). Ngoài ra, nó cũng hỗ trợ cho người dùng phát triển các khái niệm lập trình hướng đối tượng bằng cách sử dụng cơ sở dữ liệu.
Lợi ích của Hibernate Framework
Hibernate Framework có các lợi ích như dưới đây:
1. Mã nguồn mở và nhẹ: Hibernate Framework là mã nguồn mở có giấy phép LGPL và nhẹ.
2. Hiệu suất nhanh: Hiệu suất của Hibernate Framework là nhanh bởi vì bộ nhớ cache được sử dụng trong nội bộ Hibernate Framework. Có hai loại bộ nhớ cache trong Hibernate Framework, gồm bộ nhớ cache cấp một và bộ nhớ cache cấp hai. Bộ nhớ cache cấp một được bật bằng lệnh mặc định.
3. Truy vấn cơ sở dữ liệu độc lập: HQL (Hibernate Query Language) là phiên bản hướng đối tượng của SQL. Nó tạo ra các truy vấn cơ sở dữ liệu độc lập. Vì vậy, bạn không cần phải viết các truy vấn cơ sở dữ liệu cụ thể. Trước Hibernate, nếu dự án có cơ sở dữ liệu bị thay đổi, chúng ta cần phải thay đổi truy vấn SQL dẫn đến sự cố bảo trì.
4. Tạo bảng tự động: Hibernate framework cung cấp phương tiện để tạo ra các bảng cơ sở dữ liệu tự động. Vì vậy, không cần phải tạo ra các bảng trong cơ sở dữ liệu bằng tay.
5. Đơn giản lệnh join phức tạp: Có thể lấy dữ liệu từ nhiều bảng một cách dễ dàng với Hibernate framework.
6. Cung cấp thống kê truy vấn và trạng thái cơ sở dữ liệu: Hibernate hỗ trợ bộ nhớ cache truy vấn và cung cấp số liệu thống kê về truy vấn và trạng thái cơ sở dữ liệu.
JDBC là gì?
JDBC là viết tắt của Java Database Connectivity, nó là ứng dụng mã nguồn mở cho Java, giúp ứng dụng Java thực hiện kết nối, làm việc với CSDL. Nó cho phép ta thực hiện các thao tác chuy xuất, update dữ liệu với CSDL quan hệ bằng việc sử dụng các câu lệnh SQL.
JDBC Workflow
Ứng dụng Java sử dụng JDBC làm việc với CSDL thông qua trình tự 7 bước như sau.
- Tạo kết nối đến database
- Gửi SQL query đến database sử dụng JDBC driver tương ứng
- JDBC driver kết nối đến database
- Thực thi câu lệnh query để lấy kết quả trả về (số bản ghi lấy được, số bản ghi được update/delete)
- Gửi dữ liệu đến ứng dụng thông qua Driver Manager
- Xử lý dữ liệu trả về
- Đóng (giải phóng) kế nối đến database
Database được hỗ trợ
Hibernate hỗ trợ hầu hết tất cả RDBMS chính. Dưới đây là danh sách vài cơ sở dữ liệu quan hệ được hỗ trợ bởi Hibernate.
- HSQL Database Engine
- DB2/NT
- MySQL
- PostgreSQL
- FrontBase
- Oracle
- Microsoft SQL Server Database
- Sybase SQL Server
- Informix Dynamic Server
Cấu tạo của Hibernate
Kiến trúc của Hibernate trong Java Application bao gồm nhiều đối tượng khác nhau, để hiểu rõ nhất về Hibernate bạn cần nắm chắc về cấu tạo của các đối tượng. Cụ thể:
Persistence Object
Persistent Object được hiểu là một kho dùng để lưu trữ dữ liệu. Nó giúp tập trung dữ liệu được tải từ cơ sở dữ liệu đến ứng dụng và ngược lại. Các đối tượng Persistence cũng là các đối tượng POJO mà Hibernate map với các hệ thống quản trị cơ sở dữ liệu quan hệ.
Configuration
Configuration là đối tượng đầu tiên được nhìn thấy khi khởi tạo một Hibernate. Người dùng chỉ cần tạo một lần là Configuration sẽ hiển thị mãi mãi trong ứng dụng. Configuration được hiểu là một tệp cấu hình có điều kiện hoặc thuộc tính mong muốn của Hibernate. Configuration bao gồm hai bộ phận như sau:
- Database Connection: đây là bộ phận để kết nối với cơ sở dữ liệu, Configuration sử dụng một hoặc nhiều tệp cấu hình có dạng hibernate.properties và hibernate.cfg.xml.
- Class Mapping Setup: đây là bộ phận chịu trách nhiệm tạo kết nối giữa Hibernate và cơ sở dữ liệu (database)
Session Factory
Sessionfactory là giao diện kết nối với cơ sở dữ liệu thông qua việc đọc Configuration. Mỗi cơ sở dữ liệu đều có yêu cầu về một Sessionfactory riêng biệt. Vì vậy, nếu bạn muốn sử dụng nhiều cơ sở dữ liệu như MySQL hay Oracle cùng một lúc, bạn nên tạo một Sessionfactory riêng cho MySQL và một Sessionfactory khác cho Oracle. Tuy nhiên, Sessionfactory có đặc điểm là năng và an toàn vậy nên Sessionfactory thương được tạo trong quá quá trình khởi động Hibernate và lưu trữ lại để dùng sau khi cần.
Hibernate Session
Vì Sessionfactory là một đối tượng nặng và khó có thể sử dụng thường xuyên. Chính vì vậy mà Sessionfactory sẽ chủ động tạo ra các Hibernate với các thuộc tính đơn giản được sử dụng để thiết lập kết nối vật lý với cơ sở dữ liệu. Mặc dù vậy, Hibernate Session không an toàn khi sử dụng nên người dùng chỉ nên tạo chúng khi cần và đóng ngay sau khi đã hoàn thành công việc.
Transaction
Transaction được sử dụng như đại diện cho một đơn vị công việc trong cơ sở dữ liệu. Các transaction chịu trách nhiệm hoạt động bảo vệ tính toàn vẹn của các thao tác của cơ sở dữ liệu. Tất cả các tác vụ sẽ tự động chạy lại nếu quá trình không may bị lỗi. Transaction có thể được sử dụng làm giao diện hoặc mã code.
Query
Query lấy thông tin từ cơ sở dữ liệu và khởi tạo đối tượng thông qua SQL (Native SQL) hay Hibernate Query Language (HQL).
Criteria
Quá trình lấy dữ liệu từ cơ sở dữ liệu cũng cần một số điều kiện nhất định. Các tiêu chí được sử dụng làm đối tượng để tạo và thực hiện các yêu cầu truy vấn.
Có thể bạn quan tâm:
- Exception là gì? Một số điều về Exception có lẽ bạn chưa biết
- Jira là gì? Sử dụng Jira để tối ưu quy trình như thế nào?
Tại sao nên sử dụng Hibernate?
Hibernate được sử dụng phổ biến bởi chúng mang nhiều ưu điểm tuyệt vời khác. Cụ thể:
- Ưu điểm đầu tiên của Hibernate đó là mã nguồn mở và nhẹ. Hệ thống được cấp phép bởi LGPL để công nhận lợi ích này.
- Hibernate có bộ nhớ đệm bên trong nên hiệu quả công việc rất cao. Hai loại bộ nhớ cache cấp 1 và cache cấp 2 giúp thao tác nhanh và ngắn.
- Hibernate có tính độc lập rất mạnh. Vì vậy, người dùng không phải lo lắng về việc viết lại các truy vấn khi thay đổi cơ sở dữ liệu. Ưu điểm này cũng giúp hạn chế lỗi xảy ra trong quá trình bảo trì khi cần thay đổi truy vấn.
- Hibernate giúp quá trình thao tác với cơ sở dữ liệu dễ dàng hơn rất nhiều. Bạn có thể thay thế các bước thủ công và tự động tạo bảng dữ liệu. Hibernate cũng đơn giản hóa việc truy cập dữ liệu và tải các lệnh.
- Hibernate đạt độ tin cậy cao qua thử nghiệm. Kết quả cho thấy quá trình truy vấn của Hibernate hầu như không có lỗi.
Hibernate trong Java là gì?
1.ORM
Như chúng ta đã biết, ORM (Object Relational Mapping) framework là một cơ chế cho phép người lập trình thao tác với database một cách hoàn toàn tự nhiên thông qua các đối tượng. Lập trình viên hoàn toàn không quan tâm đến loại database sử dụng SQL Server, MySQL, PostgreSQL,…
ORM giúp đơn giản hoá việc tạo ra dữ liệu, thao tác dữ liệu và truy cập dữ liệu. Đó là một kỹ thuật lập trình để ánh xạ đối tượng vào dữ liệu được lưu trữ trong cơ sở dữ liệu.
1.Persistence layer
Một ứng dụng có thể được chia làm 3 phần như sau: giao diện người dùng (presentation layer), phần xử lý nghiệp vụ (business layer) và phần chứa dữ liệu (data layer). Cụ thể ra, business layer có thể được chia nhỏ thành 2 layer con là business logic layer và persistence layer.
– Business logic layer: các tính toán logic nhằm thỏa mãn yêu cầu người dùng.
– Persistence layer: chịu trách nhiệm giao tiếp với data layer (thường là một hệ quản trị cơ sở dữ liệu quan hệ – Relational DBMS). Persistence sẽ đảm nhiệm các nhiệm vụ mở kết nối, truy xuất và lưu trữ dữ liệu vào các Relational DBMS.
1.Hibernate
Hibernate là một trong những ORM Framework. Hibernate framework là một framework cho persistence layer. Như vậy, nhờ có Hibernate framework mà giờ đây khi bạn phát triển ứng dụng bạn chỉ còn chú tâm vào những layer khác mà không phải bận tâm nhiều về persistence layer nữa.
Hibernate giúp lập trình viên viết ứng dụng Java có thể map các object (POJO) với hệ quản trị cơ sở dữ liệu quan hệ (database), và hỗ trợ thực hiện các khái niệm lập trình hướng đối tượng với cơ dữ liệu quan hệ.
Hibernate giúp lưu trữ và truy vấn dữ liệu quan hệ mạnh mẽ và nhanh. Hibernate cho phép bạn truy vấn dữ liệu thông qua Java Persistence API (JPA) hoặc bằng ngôn ngữ SQL mở rộng của Hibernate (HQL) hoặc bằng SQL thuần (Native SQL).
Hibernate vốn là một thư viện sinh ra để làm việc với mọi loại database, nó không phụ thuộc vào bạn chọn loại database nào. Nếu Java là “Viết 1 lần chạy mọi nơi” thì Hibernate là “Viết 1 lần chạy trên mọi loại database”.
Hibernate mang lại cho chúng ta nhiều lợi ích sau đây:
– Mã nguồn mở và nhẹ: Hibernate Framework là mã nguồn mở có giấy phép LGPL và nhẹ.
– Hiệu suất nhanh: Hiệu suất của Hibernate Framework là nhanh bởi vì bộ nhớ cache được sử dụng trong nội bộ Hibernate Framework. Có hai loại bộ nhớ cache trong Hibernate Framework, gồm bộ nhớ cache cấp một (first level cache) và bộ nhớ cache cấp hai (second level cache). Bộ nhớ cache cấp một được enable mặc định.
– Truy vấn cơ sở dữ liệu độc lập: HQL (Hibernate Query Language) là phiên bản hướng đối tượng của SQL. Nó tạo ra các truy vấn cơ sở dữ liệu độc lập. Vì vậy, bạn không cần phải viết các truy vấn cơ sở dữ liệu cụ thể. Trước Hibernate, nếu dự án có cơ sở dữ liệu bị thay đổi, chúng ta cần phải thay đổi truy vấn SQL dẫn đến risk và dễ gây lỗi.
– Tạo bảng tự động: Hibernate framework cung cấp phương tiện để tạo ra các bảng cơ sở dữ liệu một cách tự động. Vì vậy, không cần phải tốn công sức tạo ra các bảng trong cơ sở dữ liệu thủ công.
– Đơn giản lệnh join phức tạp: Có thể lấy dữ liệu từ nhiều bảng một cách dễ dàng với Hibernate framework.
– Cung cấp thống kê truy vấn và trạng thái cơ sở dữ liệu: Hibernate hỗ trợ bộ nhớ cache truy vấn và cung cấp số liệu thống kê về truy vấn và trạng thái cơ sở dữ liệu.
Hibernate hỗ trợ trong lập trình như thế nào?
Những chức năng chính của Hibernate
- Sử dụng ngôn ngữ truy vấn công cụ này độc lập với cơ sở dữ liệu.
- Hỗ trợ các hoạt động DDL tự động.
- Có hỗ trợ tự động tạo khóa chính.
- Hỗ trợ bộ nhớ Cache.
- Xử lý ngoại lệ không bắt buộc đối với Hibernate.
- Là một công cụ ORM.
Các loại cơ sở dữ liệu được Hibernate hỗ trợ
Hibernate hỗ trợ các loại cơ sở dữ liệu dưới đây:
- HSQL Database Engine
- MYSQL
- ORACLE
- FrontBase
- PostgreSQL
- DB2/NT
- Sybase SQL Server
- Informix Dynamic Server
- Microsoft SQL Server Database
Các công nghệ được Hibernate hỗ trợ
Hibernate hỗ trợ nhiều loại công nghệ như:
- XDoclet Spring
- Maven
- Eclipse Plug-ins
- J2EE
Kết luận
Vừa rồi Teky đã cùng bạn đọc khám phá Hibernate là gì. Hibernate là một hệ thống mang đến sự kết nối giữa người dùng và cơ sở dữ liệu. Những ưu điểm của Hibernate giúp cho việc thao tác diễn ra nhanh chóng và mạnh mẽ hơn. Người dùng có thể dễ dàng triển khai Hibernate bằng những bước rất đơn giản. Mong rằng sau khi nhận được những thông tin quý giá này, bạn sẽ áp dụng được chúng vào công việc của bản thân một cách hữu ích. Hẹn gặp bạn ở những bài giải đáp tiếp theo.
Tại sao nên dùng Hibernate để thay thế cho JDBC?
JDBC là gì?
JDBC là viết tắt của Java Database Connectivity. Đây là một chuẩn API được sử dụng để kết nối các chương trình viết bởi Java với các hệ quản trị cơ sở dữ liệu phổ biến như MySQL, MS SQL, Postgre SQL, Oracle, DB2…
Tuy nhiên, JDBC chỉ là một tập các interface, thông báo lỗi, các định nghĩa hay các đặc tả chứ không phải là thư viện trong Java. Với mỗi hệ quản trị cơ sở dữ liệu khác nhau, ta sẽ có một cài đặt JDBC riêng cho chúng, ví dụ JDBC cho MySQL hoặc JDBC cho MS SQL…
Những điểm hạn chế của JDBC
Theo thời gian, JDBC bộc lộ nhiều điểm yếu cố hữu như:
- Có nhiều code thừa nhưng chỉ phục vụ cho mục đích lấy dữ liệu.
- Tốn nhiều thời gian để ánh xạ dữ liệu vào object Java.
- Mất nhiều công sức khi hệ thống thay đổi cơ sở dữ liệu như yêu cầu JDBC mới, code mới,..
- Giao tiếp giữa các bảng tương đối phức tạp, thiếu đi tính OOP trong đó.
Sử dụng Hibernate để thay thế cho JDBC
Hibernate ra đời nhằm giải quyết những vấn đề mà JDBC chưa thể khắc phục được.
- Hibernate khắc phục tình trạng phụ thuộc vào cơ sở dữ liệu trong JDBC.
- Việc thay đổi cơ sở dữ liệu tốn rất nhiều công sức trên JDBC, nhưng với Hibernate điều này được khắc phục.
- Tính di động của mã code được cải thiện đáng kể với Hibernate.
- Hibernate củng cố và khắc phục mối quan hệ cấp độ đối tượng.
- Vượt qua phần xử lý ngoại lệ, trong khi vấn đề này là bắt buộc khi làm việc trên JDBC.
- Hibernate rút ngắn độ dài của mã code với khả năng đọc được tăng lên bằng cách khắc phục sự cố bảng mẫu.
Hibernate là gì?
Định nghĩa Hibernate
Hibernate không phải là ngủ đông trong thế giới động vật. Hibernate là một công cụ ORM. Đây là viết tắt của từ Object Relational Mapping – tạm dịch: Ánh xạ quan hệ đối tượng có mã nguồn mở. Nó có chức năng cung cấp framework để ánh xạ hướng đối tượng các mô hình miền thành các hệ cơ sở dữ liệu cho các ứng dụng web.
ORM dựa trên việc chứa các đối tượng và sự trừu tượng hóa. Tính trừu tượng giúp xác định địa chỉ, truy cập và thao tác các đối tượng mà không cần phải xem xét chúng có liên quan như thế nào với nguồn dữ liệu của chúng.
Hibernate framework có nhiệm vụ hướng dẫn ánh xạ các lớp Java tới bảng cơ sở dữ liệu và đồng thời thay đổi kiểu dữ liệu Java sang kiểu dữ liệu SQL. Đồng thời cung cấp khả năng truy vấn và truy xuất.
Hibernate có sẵn miễn phí để bạn tải xuống và được cấp phép theo Lesser General Public License (LGPL).
Lịch sử ra đời của Hibernate
Được ra đời vào năm 2001 bởi Gavin King và các đồng nghiệp của ông tại công ty Cirrus Technologies, Hibernate được xem như một giải pháp thay thế cho việc sử dụng các Entity Beans kiểu EJB2. Mục tiêu ban đầu của Hibernate là cung cấp những tính năng tối ưu hơn EJB2 đang làm.
Đầu năm 2003, nhóm phát triển Hibernate bắt đầu phát hành Hibernate2. Đến năm 2005, Hibernate phiên bản 3.0 được phát hành. Vào tháng 12 năm 2018, Hibernate ORM 5.4.0 Final chính thức được ra mắt cộng đồng.
Hibernate Framework là gì?
Hibernate framework là một giải pháp ORM (Object Relational Mapping) mã nguồn mở, gọn nhẹ. Hibernate giúp đơn giản hoá sự phát triển của ứng dụng java để tương tác với cơ sở dữ liệu.
Tool ORM giúp đơn giản hoá việc tạo ra dữ liệu, thao tác dữ liệu và truy cập dữ liệu. Đó là một kỹ thuật lập trình để ánh xạ đối tượng vào dữ liệu được lưu trữ trong cơ sở dữ liệu.
Các tool ORM sử dụng JDBC API để tương tác với cơ sở dữ liệu.
Hibernate là khỉ gì?
Hibernate là một thư viện ORM (Object Relational Mapping) mã nguồn mở giúp lập trình viên viết ứng dụng Java có thể map các objects (pojo) với hệ quản trị cơ sở dữ liệu quan hệ,và hỗ trợ thực hiện các khái niệm lập trình hướng đối tượng với cớ dữ liệu quan hệ.Hibernate WorkflowPersistence objectChính là các POJO object map với các table tương ứng của cơ sở dữ liệu quan hệ. Nó như là những “thùng xe” chứa dữ liệu từ ứng dụng để ghi xuống database, hay chứa dữ liệu tải lên ứng dụng từ database.Session FactoryLà một interface giúp tạo ra session kết nối đến database bằng cách đọc các cấu hình trong Hibernate configuration. Mỗi một database phải có một session factory.
Tỉ dụ nếu ta sử dụng MySQL, và Oracle cho ứng dụng Java của mình thì ta cần có một session factory cho MySQL, và một session factory cho Oracle.
Hibernate SessionMỗi một đối tượng session được Session factory tạo ra sẽ tạo một kết nối đến database.TransationLà transaction đảm bảo tính toàn vẹn của phiên làm việc với cớ sở dữ liệu. Tức là nếu có một lỗi xảy ra trong transaction thì tất cả các tác vụ thực hiện sẽ thất bại.QueryHibernate cung cấp các câu chuy vấn HQL (Hibernate Query Language) tới database và map kết quả trả về với đối tượng tương ứng của ứng dụng Java.
Nếu bạn muốn làm việc với Hibernate thử hãy xem Tutorial hướng dẫn sử dụng Hibernate cho người mới bắt đầu tại lcdung.top
Kiến trúc Hibernate
Kiến trúc Hibernate bao gồm nhiều đối tượng như đối tượng persistent, session factory, transaction factory, connection factory, session, transaction, …
Persistence object
Chính là các POJO object map với các table tương ứng của cơ sở dữ liệu quan hệ. Nó như là những container chứa dữ liệu từ ứng dụng để lưu xuống database, hay chứa dữ liệu tải lên ứng dụng từ database.
Configuration
Là đối tượng Hibernate đầu tiên bạn tạo trong bất kỳ ứng dụng Hibernate nào và chỉ cần tạo một lần trong quá trình khởi tạo ứng dụng. Nó đại diện cho một tập tin cấu hình hoặc thuộc tính yêu cầu của Hibernate. Đối tượng Configuration cung cấp hai thành phần chính:
- Database Connection: Thao tác này được xử lý thông qua một hoặc nhiều tệp cấu hình được Hibernate hỗ trợ. Các tệp này là hibernate.properties và hibernate.cfg.xml.
- Class Mapping Setup: Thành phần này tạo ra kết nối giữa các lớp Java và các bảng cơ sở dữ liệu.
Session Factory
Là một interface giúp tạo ra session kết nối đến database bằng cách đọc các cấu hình trong Hibernate configuration.
SessionFactory là đối tượng nặng (heavy weight object) nên thường nó được tạo ra trong quá trình khởi động ứng dụng và lưu giữ để sử dụng sau này.
SessionFactory là một đối tượng luồng an toàn (Thread-safe) và được sử dụng bởi tất cả các luồng của một ứng dụng.
Mỗi một database phải có một session factory. Vì vậy, nếu bạn đang sử dụng nhiều cơ sở dữ liệu thì bạn sẽ phải tạo nhiều đối tượng SessionFactory. Giả sử ta sử dụng MySQL và Oracle cho ứng dụng Java của mình thì ta cần có một session factory cho MySQL, và một session factory cho Oracle.
Hibernate Session
Một session được sử dụng để có được một kết nối vật lý với một cơ sở dữ liệu. Đối tượng Session là nhẹ và được thiết kế để được tạo ra instance mỗi khi tương tác với cơ sở dữ liệu. Các đối tượng liên tục được lưu và truy xuất thông qua một đối tượng Session.
Các đối tượng Session không nên được mở trong một thời gian dài bởi vì chúng thường không phải là luồng an toàn (thread-unsafe) và chúng cần được tạo ra và được đóng khi cần thiết.
Mỗi một đối tượng session được Session factory tạo ra sẽ tạo một kết nối đến database.
Transation
Một Transaction đại diện cho một đơn vị làm việc với cơ sở dữ liệu và hầu hết các RDBMS hỗ trợ chức năng transaction. Các transaction trong Hibernate được xử lý bởi trình quản lý transaction và transaction (từ JDBC hoặc JTA).
Transaction đảm bảo tính toàn vẹn của phiên làm việc với cớ sở dữ liệu. Tức là nếu có một lỗi xảy ra trong transaction thì tất cả các tác vụ thực hiện sẽ thất bại.
Transaction là một đối tượng tùy chọn và các ứng dụng Hibernate có thể chọn không sử dụng interface này, thay vào đó quản lý transaction trong code ứng dụng riêng.
Query
Các đối tượng Query sử dụng chuỗi truy vấn SQL (Native SQL) hoặc Hibernate Query Language (HQL) để lấy dữ liệu từ cơ sở dữ liệu và tạo các đối tượng.
Criteria
Đối tượng Criteria được sử dụng để tạo và thực hiện các tiêu chí truy vấn để lấy các đối tượng từ database.
Hibernate là gì?
Hibernate là một thư viện ORM (Object Relational Mapping) mã nguồn mở giúp lập trình viên viết ứng dụng Java có thể map các objects (pojo) với hệ quản trị cơ sở dữ liệu quan hệ,
và hỗ trợ thực hiện các khái niệm lập trình hướng đối tượng với cớ dữ liệu quan hệ.
Hibernate Workflow
Persistence object
Chính là các POJO object map với các table tương ứng của cơ sở dữ liệu quan hệ. Nó như là những “thùng xe” chứa dữ liệu từ ứng dụng để ghi xuống database, hay chứa dữ liệu tải lên ứng dụng từ database.
Session Factory
Là một interface giúp tạo ra session kết nối đến database bằng cách đọc các cấu hình trong Hibernate configuration. Mỗi một database phải có một session factory. Ví dụ nếu ta sử dụng MySQL, và Oracle cho ứng dụng Java của mình thì ta cần có một session factory cho MySQL, và một session factory cho Oracle.
File cấu hình hibernate.cfg.xml có như sau.
com.mysql.jdbc.Driver jdbc:mysql://192.168.10.13:3306/data root root 10 true org.hibernate.dialect.MySQLDialect thread
Hibernate Session Mỗi một đối tượng session được Session factory tạo ra sẽ tạo một kết nối đến database. Transation Là transaction đảm bảo tính toàn vẹn của phiên làm việc với cớ sở dữ liệu. Tức là nếu có một lỗi xảy ra trong transaction thì tất cả các tác vụ thực hiện sẽ thất bại. Query Hibernate cung cấp các câu chuy vấn HQL (Hibernate Query Language) tới database và map kết quả trả về với đối tượng tương ứng của ứng dụng Java.
Sau phải dùng Hibernate thay JDBC
Object Mapping
Với JDBC ta phải map các trường trong bảng với các thuộc tính của Java object một cách “thủ công”. Với Hibernate sẽ hỗ trợ ta map một cách “tự động” thông qua các file cấu hình map XML hay sử dụng các anotation.JDBC sẽ map Java object với table như sau.
//rs là ResultSet trả về từ câu query get dữ liệu bảng user. List users=new ArrayList(); while(rs.next()) { User user = new User(); user.setUserId(rs.getString("userNo")); user.setName(rs.getString("firstName")); user.setEmail(rs.getString(“lastName”)); users.add(user); }
Cũng với table user đó sử dụng các anotaion để Hibernate có thể map một cách “tự động” như sau.
@Entity @Table(name = "user") public class UserModel { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private BigInteger userNo; @NotEmpty @Column(name = "lastName") private String email; public BigInteger getUserNo() { return this.userNo; } public void setUserNo(BigInteger userNo) { this.userNo = userNo; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
HQL
Hibernate cung cấp các câu lệnh truy vấn tương tự SQL, HQL của Hibernate hỗ trợ đầy đủ các truy vấn đa hình như, HQL “hiểu” các khái niệm như kế thừa (inheritance), đa hình (polymorphysm), và liên kết (association)
Database Independent
Code sử dụng Hibernate là độc lập với hệ quản trị cơ sở dữ liệu, nghĩa là ta không cần thay đổi câu lệnh HQL khi ta chuyển từ hệ quản trị CSDL MySQL sang Oracle, hay các hệ quản trị CSDL khác… Do đó rất dễ để ta thay đổi CSDL quan hệ, đơn giản bằng cách thay đổi thông tin cấu hình hệ quản trị CSDL trong file cấu hình.
//used MySQL com.mysql.jdbc.Driver // used Oracle oracle.jdbc.driver.OracleDriver
Ví dụ khi ta muốn lấy 10 bản ghi dữ liệu của một table từ 2 CSDL khác nhau
Với JDBC ta có câu truy vấn như sau.
#MySQL SELECT column_name FROM table_name ORDER BY column_name ASC LIMIT 10; #SQL Server SELECT TOP 10 column_name FROM table_name ORDER BY column_name ASC;
Với Hibernate câu truy vấn không thay đổi với cả 2 CSDL.
Session.CreateQuery("SELECT E.id FROM Employee E ORDER BY E.id ASC").SetMaxResults(10).List();
Minimize Code Changes
Khi ta thay đổi (thêm) cột vào bảng,Với JDBC ta phải thay đổi những gì:
- Thêm thuộc tính vào POJO class.
- Thay đổi method chứa câu truy vấn “select”, “insert”, “update” để bổ sung cột mới.Có thể có rất nhiều method, nhiều class chứa các câu truy vấn như trên.Với Hibernate ta chỉ cần:
- Thêm thuộc tính vào POJO class.
- Cập nhật Hibernate XML mapping file để thêm map column – property.Ta chỉ thay đổi duy nhất 2 file trên.
Lazy Loading
Với những ứng dụng Java làm việc với cơ sở dữ liệu lớn hàng trăm triệu bản ghi, việc có sử dụng Lazy loading trong truy xuất dữ liệu từ database mang lại lợi ích rất lớn. Nó giống như việc ta có thể bẻ từng chiếc đũa của bó đũa to thay vì bẻ cả bó đũa.Ví dụ những file tài liệu do người dùng upload được lưu ở bảng document. Bảng user có quan hệ một-nhiều với bảng document. Trong trường hợp này class User là class cha, class Document là class con. Bảng document nhanh chóng đầy lên theo thời gian. Mỗi khi ta lấy thông tin user và docment tương ứng từ database giả sử dữ liệu document là rất lớn, để ứng dụng không bị chậm vì phải mất nhiều bộ nhớ để chứa toàn bộ document của toàn bộ user, ta áp dụng Lazy loading cho từng user như sau.
// Declaring fetch type for one to many association in your POJO @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) private Set documents = new HashSet(); // To fetch user with document use initialize() method as follows User user = (User)session.get(User.class, new Integer(100)); //This code will fetch all products for user 100 from database 'NOW' documents = user.getDocuments();
Loại bỏ Try-Catch Blocks
Sử dụng JDBC nếu lỗi xảy khi tao tác với database thì sẽ có exception
SQLexception
bắn ra. Bởi vậy ta phải sử dụng try-catch block để xử lý ngoại lệ.Hibernate xử lý việc này giúp bạn bằng cách nó override toàn bộ JDBC exception thành Uncheck xeption, và ta không cần viết try-catch trong code của mình nữa.
Quản lý commit/rollback Transaction
Transaction là nhóm các hoạt động (với database) của một tác vụ. Nếu một hoạt động không thành công thì toàn bộ tác vụ không thành công.Với JDBC lập trình viên phải chủ động thực hiện
commit
khi toàn bộ hoạt động của tác vụ thành công, hay phải
rollback
khi có một hoạt động không thành công để kết thúc tác vụ.Với Hibernate thì ta không cần quan tâm đến
commit
hay
rollback
, Hibernate đã quản lý nó giúp ta rồi.
Hibernate Caching
Hibernate cung cấp một cơ chế bộ nhớ đệm, giúp giảm số lần truy cập vào database của ứng dụng càng nhiều càng tốt. Điều này sẽ có tác dụng tăng performance đáng kể cho ứng dụng của bạn. Hibernate lưu trữ các đối tượng trong session khi transation được kích hoạt. Khi một query được thực hiện liên tục, giá trị được lưu trữ trong session được sử dụng lại. Khi một transaction mới bắt đầu, dữ liệu được lấy lại từ database và được lưu trữ session. Hibernate cung cấp hai cấp độ Cach, mình sẽ có bài chi tiết hơn về Cach trong Hibernate.
Nếu bạn muốn làm việc với Hibernate thử hãy xem Tutorial hướng dẫn sử dụng Hibernate cho người mới bắt đầu tại lcdung.top
Bài viết gốc được đăng tải tại lcdung.top
Có thể bạn quan tâm:
- 9 thói quen sống bạn cần phải thay đổi để làm giàu
- Tại sao nên dùng [SerializeField] thay vì biến public?
- Tại sao phải chọn giữa R hay Python trong khi bạn có thể chọn cả 2?
Xem thêm Việc làm ngành cntt hấp dẫn trên TopDev
Không có giới hạn nào đối với kỹ năng lập trình của bạn. Nếu thường xuyên sử dụng ngôn ngữ lập trình Java, chắc hẳn bạn đã nghe đến cái tên Hibernate. Tất nhiên chúng ta đều biết Hibernate là công cụ hỗ trợ cho các phần mềm phát triển từ Java. Tuy nhiên, bạn nên hiểu các khái niệm về Hibernate, cách nó được xây dựng và cách sử dụng nó. Bằng cách đó bạn có thể tận dụng tối đa Hibernate. Các bài viết sau của Aptech sẽ giúp bạn khám phá những tính năng cơ bản nhất của Java Hibernate.
Contents
- 1 Hibernate là gì?
- 2 Cấu tạo của Hibernate
- 3 Tại sao nên sử dụng Hibernate?
- 4 Những lý do nên sử dụng Hibernate thay JDBC?
Tại sao nên dùng Hibernate thay vì JDBC
Object Mapping
Với JDBC ta phải map các trường trong bảng với các thuộc tính của Java object một cách “thủ công”. Với Hibernate sẽ hỗ trợ ta map một cách “tự động” thông qua các file cấu hình map XML hay sử dụng các anotation.
JDBC sẽ map Java object với table như sau:
//rs là ResultSet trả về từ câu query get dữ liệu bảng user. List
users = new ArrayList<>(); while(rs.next()) { User user = new User(); user.setId(rs.getInt(“id”)); user.setUsername(rs.getString(“username”)); user.setPassword(rs.getString(“password”)); user.setCreatedDate(rs.getDate(“createdDate”)); users.add(user); }
Cũng với table user đó sử dụng các anotaion để Hibernate có thể map một cách “tự động” như sau.
@Entity @Table(name = “user”) @Data public class UserModel { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @NotEmpty @Column(name = “username”) private String username; @NotEmpty @Column(name = “password”) private String password; @NotEmpty @Column(name = “createdDate”) private Date createdDate; }
HQL
Hibernate cung cấp các câu lệnh truy vấn tương tự SQL, HQL của Hibernate hỗ trợ đầy đủ các truy vấn đa hình như, HQL “hiểu” các khái niệm như kế thừa (inheritance), đa hình (polymorphysm), và liên kết (association)
Database Independent
Code sử dụng Hibernate là độc lập với hệ quản trị cơ sở dữ liệu, nghĩa là ta không cần thay đổi câu lệnh HQL khi ta chuyển từ hệ quản trị CSDL MySQL sang Oracle, hay các hệ quản trị CSDL khác… Do đó rất dễ để ta thay đổi CSDL quan hệ, đơn giản bằng cách thay đổi thông tin cấu hình hệ quản trị CSDL trong file cấu hình.
//used MySQL com.mysql.jdbc.Driver // used Oracle oracle.jdbc.driver.OracleDriver
Ví dụ khi ta muốn lấy 10 bản ghi dữ liệu của một table từ 2 CSDL khác nhau.
Với JDBC ta có câu truy vấn như sau.
# MySQL SELECT column_name FROM table_name ORDER BY column_name ASC LIMIT 10; # SQL Server SELECT TOP 10 column_name FROM table_name ORDER BY column_name ASC;
Với Hibernate câu truy vấn không thay đổi với cả 2 CSDL.
Session.CreateQuery(“SELECT E.id FROM Employee E ORDER BY E.id ASC”).SetMaxResults(10).List();
Minimize Code Changes
Khi ta thay đổi (thêm) cột vào bảng, với JDBC ta phải thay đổi những gì:
- Thêm thuộc tính vào POJO class.
- Thay đổi method chứa câu truy vấn “select”, “insert”, “update” để bổ sung cột mới.
- Có thể có rất nhiều method, nhiều class chứa các câu truy vấn như trên.
Với Hibernate ta chỉ cần:
- Thêm thuộc tính vào Entity class.
- Cập nhật Hibernate Annotation để map column – property..
Lazy Loading
Với những ứng dụng Java làm việc với cơ sở dữ liệu lớn hàng trăm triệu bản ghi, việc có sử dụng Lazy loading trong truy xuất dữ liệu từ database mang lại lợi ích rất lớn.
Ví dụ những file tài liệu do người dùng upload được lưu ở bảng document. Bảng user có quan hệ một-nhiều với bảng document. Trong trường hợp này class User là class cha, class Document là class con. Bảng document nhanh chóng đầy lên theo thời gian. Mỗi khi ta lấy thông tin user và document tương ứng từ database giả sử dữ liệu document là rất lớn, để ứng dụng không bị chậm vì phải mất nhiều bộ nhớ để chứa toàn bộ document của toàn bộ user, ta áp dụng Lazy loading cho từng user như sau.
// Declaring fetch type for one to many association in your POJO @OneToMany(mappedBy = “user”, fetch = FetchType.LAZY) private Set documents = new HashSet(); // To fetch user with document use initialize() method as follows User user = (User)session.get(User.class, new Integer(100)); // This code will fetch all products for user 100 from database ‘NOW’ documents = user.getDocuments();
Loại bỏ Try-Catch Blocks
Sử dụng JDBC nếu lỗi xảy khi tao tác với database thì sẽ có exception SQLexception ném ra. Bởi vậy ta phải sử dụng try-catch block để xử lý ngoại lệ.
Hibernate xử lý việc này giúp bạn bằng cách nó override toàn bộ JDBC exception thành Unchecked Exception và ta không cần viết try-catch trong code của mình nữa.
Quản lý commit/ rollback Transaction
Transaction là nhóm các hoạt động (với database) của một tác vụ. Nếu một hoạt động không thành công thì toàn bộ tác vụ không thành công.
Với JDBC lập trình viên phải chủ động thực hiện commit khi toàn bộ hoạt động của tác vụ thành công, hay phải rollback khi có một hoạt động không thành công để kết thúc tác vụ.
Với Hibernate thì ta không cần quan tâm đến commit hay rollback, Hibernate đã quản lý nó giúp ta rồi.
Hibernate Caching
Hibernate cung cấp một cơ chế bộ nhớ đệm, giúp giảm số lần truy cập vào database của ứng dụng càng nhiều càng tốt. Điều này sẽ có tác dụng tăng performance đáng kể cho ứng dụng của bạn.
Hibernate lưu trữ các đối tượng trong session khi transation được kích hoạt. Khi một query được thực hiện liên tục, giá trị được lưu trữ trong session được sử dụng lại. Khi một transaction mới bắt đầu, dữ liệu được lấy lại từ database và được lưu trữ session. Hibernate cung cấp hai cấp độ Cache: bộ nhớ cache cấp một (first level cache) và bộ nhớ cache cấp hai (second level cache).
Chúng ta sẽ tìm hiểu chi tiết hơn về Cache trong Hibernate ở các bài viết kế tiếp.
Associations
Thật dễ dàng để tạo một liên kết giữa các bảng bằng Hibernate như quan hệ một-một, một-nhiều, nhiều-một và nhiều-nhiều trong Hibernate bằng cách sử dụng các Annotation để ánh xạ đối tượng của bảng.
Chẳng hạn, chúng ta có bảng Person quan hệ 1-1 với bảng PersonDetail. Với JDBC, chúng ta phải viết SQL để thực hiện INNER JOIN giữa 2 bảng. Với Hibernate, chỉ đơn giản thêm Annotation @OneToOne như sau:
JPA Annotation Support
Hibernate implement đặc tả JPA, do đó chúng ta có thể sử dụng các Annotation của JPA như @Entity, @Table, @Column, … Nhờ đặc điểm này, chúng ta có thể dễ dàng chuyển đổi giữa các ORM Framework mà không cần phải sử đổi code.
Connection Pooling
Như chúng ta đã biết, Connection Pooling giúp tăng performance nhờ vào sử dụng lại các kết nối khi có yêu cầu thay vì việc tạo kết nối mới.
Một số Connection Pooling được hỗ trợ bởi Hibernate: C3p0, Apache DBCP.
Chúng ta có thể dễ dàng tích hợp với các thư viện Connection Pooling có sẵn chỉ với vài dòng cấu hình như sau:
20 300 50 3000
Trên đây là một số khái niệm cơ bản về Hibernate mà tôi muốn giới thiệu đến các bạn. Trong các bài viết tiếp theo chúng ta sẽ cùng tìm hiểu cách cài đặt và sử dụng các API của Hibernate.
Tài liệu tham khảo:
- https://hibernate.org
- https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html
- https://www.tutorialspoint.com/hibernate/index.htm
- https://www.javatpoint.com/hibernate-tutorial
- https://dzone.com/articles/15-reasons-to-choose-hibernate-over-jdbc
Nội dung chính
Những lý do nên sử dụng Hibernate thay JDBC?
Object Mapping
JDBC yêu cầu bạn phải map các trường trong bảng thuộc tính của đối tượng Java một cách “thủ công”. Ngược lại, với Hibernate, phần mềm sẽ hỗ trợ người dùng lập bản đồ “tự động” bằng cách sử dụng các file cấu hình bản đồ XML hoặc các annotation.
HQL
Hibernate cung cấp các câu lệnh truy vấn giống như SQL. Hibernate HQL hỗ trợ các truy vấn đa hình có thể kể tới như HQL “hiểu” được những khái niệm về inheritance hay còn hiểu là kế thừa, polymorphysm có nghĩa là đa hình và association mang ý nghĩa liên kết Dưới đây là một ví dụ về câu lệnh HQL giúp bạn hiểu rõ hơn, cụ thể:
Database Independent
Mã code sử dụng trong Hibernate là độc lập với hệ thống quản lý cơ sở dữ liệu. Điều này có nghĩa là bạn không phải thay đổi các câu lệnh HQL của mình khi chuyển từ MySQL sang Oracle hoặc bất kỳ hệ quản trị cơ sở dữ liệu nào khác. Do đó, việc thay đổi sử cơ sở dữ liệu quan hệ vô cùng dễ dàng và đơn giản, bạn chỉ cần thay đổi thông tin cấu hình hệ quản trị cơ sở dữ liệu có trong tệp cấu hình.
Để dễ hiểu, với ví dụ muốn lấy 10 bản ghi dữ liệu của một table từ 2 cơ sở dữ liệu khác nhau. Đây là hai cách truy vấn của JDBC và Hibernate. Cụ thể như sau:
Lazy Loading
Đối với các ứng dụng Java làm việc với cơ sở dữ liệu lớn chứa hàng trăm triệu bản ghi, sử dụng Lazy loading mang lại nhiều lợi ích đáng kể trong việc truy cập dữ liệu từ cơ sở dữ liệu. Để dễ hiểu hơn ta có ví dụ như sau: các tệp tài liệu do người dùng tải lên được lưu trữ trong bảng tài liệu. Bảng user có mối quan hệ một-nhiều với bảng Tài liệu. Trong trường hợp này, class User là class cha, class Document là class con. Theo thời gian thì Bảng tài liệu sẽ được lấp đầy nhanh chóng. Giả sử rằng mỗi lần bạn truy xuất thông tin người dùng và tài liệu tương ứng từ cơ sở dữ liệu, dữ liệu tài liệu sẽ rất lớn. Vậy nên để ứng dụng của bạn không bị chậm vì phải mất một lượng lớn bộ nhớ cần thiết để lưu trữ toàn bộ tài liệu của user. Người dùng sẽ áp dụng Lazy Loading cho từng user, cụ thể như sau:
Bài viết trên đây là toàn bộ thông tin liên quan tới Hibernate như định nghĩa, cấu trúc và lợi ích mà Hibernate mang lại, ngoài ra còn giải đáp cho bạn câu hỏi vì sao nên sử dụng Hibernate thay vì JDBC. Mong rằng thông qua bài viết này với những thông tin mà chúng tôi cung cấp sẽ giúp bạn áp dụng được chúng vào trong công việc của bản thân một cách hữu ích. Nếu có bất kỳ thắc mắc hay câu hỏi liên quan tới bài viết vui lòng liên hệ với chúng tôi thông qua địa chỉ trang web hoặc số hotline bạn nhé!
FPT Aptech trực thuộc Tổ chức Giáo dục FPT có hơn 25 năm kinh nghiệm đào tạo lập trình viên quốc tế tại Việt Nam, và luôn là sự lựa chọn ưu tiên của các sinh viên và nhà tuyển dụng. |
Không có giới hạn nào đối với kỹ năng lập trình của bạn. Nếu thường xuyên sử dụng ngôn ngữ lập trình Java, chắc hẳn bạn đã nghe đến cái tên Hibernate. Tất nhiên chúng ta đều biết Hibernate là công cụ hỗ trợ cho các phần mềm phát triển từ Java. Tuy nhiên, bạn nên hiểu các khái niệm về Hibernate, cách nó được xây dựng và cách sử dụng nó. Bằng cách đó bạn có thể tận dụng tối đa Hibernate. Trong bài viết này, Stringee và các bạn sẽ cùng nhau tìm hiểu về Hibernate trong Java.
Ưu điểm và nhược điểm khi sử dụng Hibernate là gì?
Ưu điểm
- Hibernate khá nhẹ, là mã nguồn mở nên giúp truy cập hiệu quả.
- Sử dụng bộ nhớ đệm giúp hiệu suất nhanh hơn.
- Tính độc lập với cơ sở dữ liệu mang lại khả năng làm việc với các cơ sở dữ liệu khác nhau.
- Cung cấp chức năng bảng tự động, không phải tạo bảng theo cách thủ công.
- Hibernate xử lý ánh xạ cơ sở dữ liệu các lớp Java bằng cách sử dụng các tệp XML mà không cần viết bất kỳ mã nào.
- Trực tiếp lưu trữ và truy xuất dữ liệu trực tiếp từ cơ sở dữ liệu bằng cách sử dụng các API đơn giản.
- Không yêu cầu bất kỳ máy chủ ứng dụng nào để hoạt động.
- Giảm thiểu truy cập cơ sở dữ liệu với các chiến lược tìm nạp thông minh.
- Cung cấp khả năng truy vấn dữ liệu đơn giản.
- Khá an toàn trong các truy vấn.
Nhược điểm
- Không hỗ trợ các câu truy vấn phức tạp.
- Trong một số trường hợp, bạn vẫn phải dùng native SQL do Hibernate không thể hỗ trợ hết tất cả các cú pháp của các hệ quản trị cơ sử dữ liệu.
- Bị hạn chế sự can thiệp vào câu lệnh SQL do những câu lệnh này được tự động sinh ra.
Kiến trúc của Hibernate là gì?
Kiến trúc của Hibernate trong Java bao gồm rất nhiều đối tượng khác nhau. Nắm chắc cấu tạo sẽ giúp bạn hiểu rõ Hibernate là gì.
Persistence object
Persistence object được hiểu như là một kho hàng dùng để chứa dữ liệu. Nó sẽ giúp tập trung lại những phần dữ liệu được tải từ cơ sở dữ liệu lên ứng dụng và ngược lại. Persistence object cũng chính là POJO object được Hibernate map với hệ thống quản trị cơ sở dữ liệu quan hệ.
Configuration
Khi khởi tạo một Hibernate, Configuration sẽ là đối tượng đầu tiên xuất hiện. Người dùng chỉ cần tạo một lần là Configuration sẽ xuất hiện mãi mãi trong ứng dụng. Configuration được hiểu như là một tệp tin về cấu hình điều kiện hay thuộc tính yêu cầu của Hibernate. Configuration bao gồm hai bộ phận nhỏ:
- Database Connection: Để kết nối với cơ sở dữ liệu, Configuration sử dụng một hoặc nhiều tệp cấu hình dưới dạng hibernate.properties và hibernate.cfg.xml.
- Class Mapping Setup: Bộ phần này chịu trách nhiệm tạo ra đường liên hệ giữa Hibernate và Database.
Session Factory – Hibernate là gì
Sessionfactory trong Hibernate là một giao diện kết nối đến Database thông qua việc đọc Configuration. Mỗi một databases yêu cầu có một Session Factory riêng. Chính vì thế nếu bạn đang sử dụng nhiều cơ sở dữ liệu một lúc, ví dụ như MySQL và Oracle thì phải tạo riêng một Session Factory cho MySQL và một Session Factory nữa cho Oracle.
Đặc điểm của Sessionfactory là nặng và an toàn. Vì thế nó thường được tạo luôn trong quá trình khởi động Hibernate và lưu trữ lại để dùng sau này khi cần.
>>> Xem thêm : Lập trình hướng đối tượng là gì? Giải mã thông tin lập trình
Hibernate Session
Vì Sessionfactory là đối tượng nặng không tiện để sử dụng thường xuyên. Vì thế Sessionfactory sẽ chủ động sinh ra các Hibernate Session có thuộc tính nhẹ dùng để kết nối vật lý với cơ sở dữ liệu. Tuy nhiên, vì Hibernate Session không an toàn nên người dùng chỉ nên tạo ra khi cần thiết và đóng lại ngay sau khi đã hoàn thành công việc.
Transaction
Transaction được dùng như đại diện cho một đơn vị làm việc với cơ sở dữ liệu. Transaction đảm nhiệm hoạt động bảo vệ tính toàn vẹn của các thao tác tương tác với cơ sở dữ liệu. Khi một quy trình không may gặp lỗi, tất cả các tác vụ sẽ được tự động thực hiện lại.
Bạn có thể lựa chọn sử dụng Transaction dưới dạng giao diện hoặc mã code đều được.
Query
Query chịu trách nhiệm lấy thông tin từ các cơ dữ liệu để khởi tạo các đối tượng thông qua SQL (Native SQL) hoặc Hibernate Query Language (HQL).
Criteria
Hoạt động lấy dữ liệu từ Database cũng đòi hỏi những điều kiện nhất định. Criteria được sử dụng như một đối tượng để tạo và thực hiện những yêu cầu truy vấn.
Kết luận
Trên đây là những kiến thức tổng quan về Hibernate mà BKNS muốn gửi tới bạn đọc. Đến đây có lẽ bạn đã hiểu được Hibernate là gì, ưu nhược điểm của nó và ưu điểm khi so sánh với JDBC.
Đây là một giải pháp làm việc hiệu quả mà các lập trình viên có thể cân nhắc sử dụng để tối ưu công việc một cách hợp lý nhất.
Ghé thăm BKNS để đọc thêm nhiều bài viết hữu ích khác.
[mautic type=”form” id=”6″]
Tham khảo thêm:
Những điều cần lưu ý để bảo vệ tên miền tốt nhất
Băng thông không giới hạn là gì?
Web Scraping Bot là gì? Cách phát hiện và ngăn chặn Web Scraping Bot có hại
Nếu là một người đang học hoặc thường xuyên sử dụng ngôn ngữ Java, chắc chắn bạn đã nghe đến thuật ngữ Hibernate. Hibernate là công cụ hỗ trợ các phần mềm được xây dựng và phát triển từ Java. Tuy nhiên, không phải ai cũng hiểu rõ khái niệm Hibernate là gì, ưu điểm và cách sử dụng Hibernate trong Java. ICANTECH giúp bạn có thể hiểu và tận dụng tối đa công dụng của Hibernate thông qua bài viết này.
Ở phần đầu tiên của bài viết, chúng ta sẽ cùng nhau tìm hiểu tổng quan Hibernate là gì hay Java Hibernate là gì.
Hibernate là một framework ORM (Object-Relational Mapping) hiệu suất cao được để lưu các đối tượng trong Java vào hệ thống cơ sở dữ liệu. Hibernate cung cấp các tác vụ như truy vấn cho các thao tác CRUD (Create, Read, Update, Delete), hay thiết lập kết nối đến cơ sở dữ liệu…
Hibernate giúp phát triển logic bền vững, lưu trữ và xử lý dữ liệu để sử dụng được lâu hơn. Hibernate rất nhẹ và đặc biệt là có mã nguồn mở – đây là lợi thế của nó so với các framework khác.
Hibernate có 3 thành phần cơ bản khác nhau, đó là:
Dưới đây là một số ưu điểm nổi bật của Hibernate:
Sau khi đã cùng tìm hiểu Hibernate là gì, tiếp theo chúng ta sẽ làm một ví dụ để hiểu cách sử dụng Hibernate. ICANTECH sẽ hướng dẫn bạn từng bước thực hiện để có thể tạo 1 ứng dụng Java với Hibernate.
Bước đầu tiên bạn cần làm là xây dựng lớp hoặc các lớp Java POJO (Plain Old Java Object) dựa vào ứng dụng sẽ được lưu vào cơ sở dữ liệu. Dưới đây là ví dụ cách tạo lớp Employee bằng các phương thức getXXX và setXXX và trở thành lớp tuân thủ JavaBeans.
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
public int getId() {
return id;
public void setId( int id ) {
this.id = id;
public String getFirstName() {
return firstName;
public void setFirstName( String first_name ) {
this.firstName = first_name;
public String getLastName() {
return lastName;
public void setLastName( String last_name ) {
this.lastName = last_name;
public int getSalary() {
return salary;
public void setSalary( int salary ) {
this.salary = salary;
Bước thứ hai bạn cần làm là tạo bảng trong cơ sở dữ liệu tương ứng với từng đối tượng. Hãy xem ví dụ các đối tượng ở phần trên cần được lưu trữ và truy xuất vào bảng RDBMS:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Bạn tạo một tệp map để hướng dẫn Hibernate cách map lớp vào các bảng cơ sở dữ liệu. Bạn nên lưu tài liệu map vào một tệp có định dạng
.hbm.xml.
“-//Hibernate/Hibernate Mapping DTD//EN”
“http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd”>
This class contains the employee detail.
Cuối cùng để chạy ứng dụng, bạn cần tạo lớp ứng dụng bằng phương thức main(). Dưới đây là ví dụ cách sử dụng ứng dụng để lưu hồ sơ đồng thời áp dụng các thao tác CRUD trên các hồ sơ đó.
import java.util.List;
import java.util.Date;
import java.util.Iterator;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args)
try {
factory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println(“Failed to create sessionFactory object.” + ex);
throw new ExceptionInInitializerError(ex);
ManageEmployee ME = new ManageEmployee();
/* Add few employee records in database */
Integer empID1 = ME.addEmployee(“Zara”, “Ali”, 1000);
Integer empID2 = ME.addEmployee(“Daisy”, “Das”, 5000);
Integer empID3 = ME.addEmployee(“John”, “Paul”, 10000);
/* List down all the employees */
ME.listEmployees();
/* Update employee’s records */
ME.updateEmployee(empID1, 5000);
/* Delete an employee from the database */
ME.deleteEmployee(empID2);
/* List down new list of the employees */
ME.listEmployees();
/* Method to CREATE an employee in the database */
public Integer addEmployee(String fname, String lname, int salary){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try {
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary);
employeeID = (Integer) session.save(employee);
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
return employeeID;
/* Method to READ all the employees */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
List employees = session.createQuery(“FROM Employee”).list();
for (Iterator iterator = employees.iterator(); iterator.hasNext();){
Employee employee = (Employee) iterator.next();
System.out.print(“First Name: ” + employee.getFirstName());
System.out.print(” Last Name: ” + employee.getLastName());
System.out.println(” Salary: ” + employee.getSalary());
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
/* Method to UPDATE salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Employee employee = (Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
session.update(employee);
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
/* Method to DELETE an employee from the records */
public void deleteEmployee(Integer EmployeeID){
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Employee employee = (Employee)session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
Để thực hiện biên dịch và chạy ứng dụng đã được tạo ở trên, bạn thực hiện các bước dưới đây:
Bạn sẽ nhận được kết quả và các bản ghi sẽ được tạo trong bảng Employee như sau:
$java ManageEmployee
…….VARIOUS LOG MESSAGES WILL DISPLAY HERE…..…
First Name: Zara Last Name: Ali Salary: 1000
First Name: Daisy Last Name: Das Salary: 5000
First Name: John Last Name: Paul Salary: 10000
First Name: Zara Last Name: Ali Salary: 5000
First Name: John Last Name: Paul Salary: 10000
Khi bạn kiểm tra bảng Employee của mình sẽ có các bản ghi sau:
mysql> select * from EMPLOYEE;
+—-+————+———–+——–+
| id | first_name | last_name | salary |
+—-+————+———–+——–+
| 29 | Zara | Ali | 5000 |
| 31 | John | Paul | 10000 |
+—-+————+———–+——–+
2 rows in set (0.00 sec
mysql>
Bài viết trên đây là toàn bộ thông tin bạn cần biết về Hibernate là gì và những ưu điểm của công cụ này. Bên cạnh đó, thông qua bài viết, ICANTECH đã hướng dẫn bạn cách tạo ứng dụng Java với Hibernate đơn giản, dễ hiểu.
Mong rằng với những thông tin mà ICANTECH chia sẻ, bạn đã có thêm kiến thức và kinh nghiệm để áp dụng vào học tập cũng như công việc của mình.
Cảm ơn bạn đã đọc bài viết, nếu bạn đang quan tâm đến học lập trình thì hãy tham khảo ngay các khóa học lập trình dưới đây tại ICANTECH nhé!
Nguồn ảnh: ICANTECH.
Tại sao nên sử dụng Hibernate? – Hibernate là gì
Hibernate được sử dụng phổ biến như vậy là vì nó hàm chứa rất nhiều lợi ích tuyệt vời. Cùng khám phá ngay ưu điểm của Hibernate là gì!
>>> Xem thêm : Microsoft Azure là gì? Dịch vụ này hoạt động như thế nào?
- Ưu điểm đầu tiên của Hibernate là mã nguồn mở và nhẹ. Hệ thống này được LGPL cấp giấy phép để công nhận lợi ích này.
- Hibernate sở hữu bộ nhớ cache trong nội bộ. Chính vì thế nó sở hữu hiệu suất làm việc rất cao. Các hoạt động được thực hiện nhanh chóng trong thời gian ngắn nhờ 2 loại bộ nhớ: bộ nhớ cache cấp 1 và bộ nhớ cache cấp 2.
- Hibernate sở hữu tính độc lập rất mạnh mẽ. Vì thế người dùng không cần quan tâm đến việc phải viết lại các truy vấn khi thay đổi cơ sở dữ liệu. Ưu điểm này cũng giúp hạn chế các lỗi xảy ra trong quá trình bảo trì khi bắt buộc phải thay truy vấn.
- Hibernate giúp quá trình thao tác với cơ sở dữ liệu trở nên dễ dàng hơn rất nhiều. Nó có thể thay thế các bước thủ công để tự động tạo ra các bảng dữ liệu. Ngoài ra, Hibernate cũng đơn giản hóa các lệnh truy cập và tải dữ liệu.
- Hibernate đạt được độ tin cậy cao nhờ quá trình kiểm thử. Kết quả cho thấy Hibernate gần như không xảy ra lỗi trong quá trình truy vấn.
>>> Xem thêm : MEAN Stack là gì? Làm thế nào để cài đặt MEAN Stack
Các công nghệ được hỗ trợ
Hibernate hỗ trợ nhiều công nghệ khác, bao gồm:
- XDoclet Spring
- J2EE
- Eclipse plug-ins
- Maven
Hibernatelà framework được sử dụng nhiều nhất hiện nay để giúp lập trình viên Java có thể map các class (Pojo) với một cơ sở dữ liệu bất kỳ.
Giới thiệu
Hibernate
là framework được sử dụng nhiều nhất hiện nay để giúp lập trình viên Java có thể map các class (Pojo) với một cơ sở dữ liệu bất kỳ.
Trước khi
Hibernate
ra đời, chúng ta thường thao tác với cơ sở dữ liệu thông qua
JDBC
. Theo thời gian,
JDBC
bộc lộ nhiều điểm yếu như:
- Có nhiều code thừa mà chỉ phục vụ mục đích là lấy dữ liệu.
- Mất nhiều thời gian map dữ liệu vào object Java.
-
Sẽ tốn nhiều công sức khi hệ thống thay đổi CSDL (yêu cầu
jdbc
mới, code mới) - Giao tiếp giữa các bảng thường khó, thiếu tính OOP trong đó.
Từ đây, để giảm tải gánh nặng cho dev khi thao tác với database.
Hibernate
ra đời!
Định nghĩa
Hibernate
là một thư viện
ORM (Object Relational Mapping)
mã nguồn mở giúp lập trình viên viết ứng dụng Java có thể map các objects (pojo) với hệ quản trị cơ sở dữ liệu quan hệ, và hỗ trợ thực hiện các khái niệm lập trình hướng đối tượng với cớ dữ liệu quan hệ.
Hiểu ngắn gọn thì
Hibernate
sẽ là một layer đứng trung gian giữa ứng dụng và database, và chúng ta sẽ giao tiếp với
Hibernate
thay vì giao tiếp với database
Để giao tiếp với
Hibernate
, chúng ta sẽ tạo ra một
Class
đại diện cho một
Table
. Và mọi dữ liệu từ
Table
trong database sẽ được
Hibernate
bind vào
Class
đó cho chúng ta.
POJO
Pojo (plain old Java object)
là class đại diện cho một
Table
, thuật ngữ này để định nghĩa chính xác thì mình không dám chắc, nhưng về ý nghĩa thì nó là một class java thuần túy, rất thuần túy:
- All properties must public setter and getter methods (mọi biến đều phải có get/set)
- All instance variables should be private (mọi biến là thuộc tính thì nên là private)
public class MyFirstPojo { private String name; public static void main(String [] args) { for (String arg : args) { MyFirstPojo pojo = new MyFirstPojo(arg); // Here's how you create a POJO System.out.println(pojo); } } public MyFirstPojo(String name) { this.name = name; } public String getName() { return this.name; } public String toString() { return this.name; } }
Mapping dữ liệu
Khi đã có
Class
đại diện cho
Table
rồi, chúng ta sẽ định nghĩa các trường trong class đó tương ứng với column nào trong database bằng tập hợp các
Annotaion
mà
Hibernate
cung cấp.
@Entity // Đánh dấu đây là một Entity, chịu sự quản lý của Hibernate @Table(name = "USER") //Entity này đại diện cho table USER trong db public class UserModel { @Id // Đánh dấu biến ở dưới là primary key của table này @GeneratedValue(strategy = GenerationType.IDENTITY) // Tự động tăng giá trị khi insert private Long id; @Column(name = "email", unique = true) // trường email ở dưới đại diện cho cột email trong database private String email; @Column(name = "name") private String name; public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } }
Bây giờ việc bạn lấy dữ liệu từ database sẽ đại loại như này:
public List
findAll() { return session.createQuery("SELECT a FROM User a", User.class).getResultList(); }
Chúng ta tiết kiệm được rất nhiều thời gian cho việc mapping dữ liệu từ database sang class java, và đặc biệt là khi thay đổi Database thì cũng sẽ không ảnh hưởng gì tới đoạn code ở trên cả, chúng ta gần như trong suốt với tầng database, mà chỉ cần nói chuyện với
Hibernate
là đủ!
Session
Đối tượng chính của việc truy xuất hay insert dữ liệu bằng
Hibernate
chính là
Session
và được tạo ra từ
Session Factory
.
Session Factory
Là một interface giúp tạo ra session kết nối đến database bằng cách đọc các cấu hình trong một file xml và mỗi loại Database khác nhau sẽ có một cấu hình khác nhau.
File cấu hình
hibernate.cfg.xml
có dạng như sau:
com.mysql.jdbc.Driver jdbc:mysql://192.168.10.13:3306/loda root root 10 org.hibernate.dialect.MySQLDialect thread
Khi đã có file config này rồi, chúng ta sử dụng nó để tạo ra
Session Factory
như sau:
public class SessionFactoryProvider { private static SessionFactory buildSessionFactory() { ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()// .configure("hibernate.cfg.xml").build(); Metadata metadata = new MetadataSources(serviceRegistry).getMetadataBuilder().build(); return metadata.getSessionFactoryBuilder().build(); } }
Từ đó, mỗi lần cần query hay insert dữ liệu, chúng ta sẽ tạo ra
Session
và sử dụng.
SessionFactory factory = HibernateSessionUtils.getSessionFactory(); Session session = factory.getCurrentSession(); try { session.getTransaction().begin(); List
users = session.createQuery("SELECT a FROM User a", User.class).getResultList(); session.getTransaction().commit(); }catch (Exception e) {}
Hibernate Query Language (HQL)
Hibernate
sử dụng ngôn ngữ
Hibernate Query Language (HQL)
để query dữ liệu. Nó chỉ khác
SQL
bình thường ở chỗ, đối tượng tác động lúc này là
Entity
chứ không còn là
Table
nữa:
ví dụ:
-- SQL -- from table name Select u.id, u.email from USER u; -- HQL -- from class name Select u.id, u.email from User u; -- query toàn bộ object Select u from User u;
Đang viết dở Continue…
- 「Jpa」Hướng dẫn sử dụng @OneToOne
- 「Jpa」Hướng dẫn @OneToMany và @ManyToOne
- 「Jpa」Hướng dẫn @ManyToMany
💁 Nếu có, toàn bộ project / code mẫu được lưu trữ tại GitHub
🌟 Đây là một bài viết trong Series Làm chủ Spring Boot – Zero to Hero
Nếu bạn phát hiện bài viết có lỗi hoặc outdated, hãy báo lại giúp mình theo email: [email protected] hoặc qua Nam Hoàng Nguyễn (facebook.com)
Hibernate là gì? Tìm hiểu chi tiết về Hibernate và JDBC
Thịnh Văn Hạnh
30/11/2022
924 Lượt xem
Chia sẻ bài viết
Nếu là lập trình viên hoặc làm việc liên quan đến lĩnh vực lập trình, có thể bạn đã nghe tới cụm từ JDBC. Tuy nhiên phương thức này có nhiều sai sót, và để khắc phục nó Hibernate ra đời. Cùng BKNS tìm hiểu Hibernate là gì, ưu nhược điểm của nó trong bài viết dưới đây nhé.
Tóm Tắt Bài Viết
- 1 Hibernate là gì?
- 2 Hibernate hỗ trợ trong lập trình như thế nào?
- 3 Ưu điểm và nhược điểm khi sử dụng Hibernate là gì?
- 4 Tại sao nên dùng Hibernate để thay thế cho JDBC?
- 5 Kết luận
Nên dùng Hibernate để thay thế JDBC hay không?
Câu trả lời cho câu hỏi này là có. Với Hibernate, chúng ta có thể làm được nhiều thứ hơn rất nhiều.
– Object mapping: thay vì việc phải map các thuộc tính trong bảng với Java object một cách thủ công thì Hibernate sẽ hỗ trợ chúng ta mapping một cách tự động trông qua các file cấu hình resource mapping xml hoặc các annotation có thể cấu hình trong class.
@Entity @Table(name = "role") public class Role implements Serializable{ @Id private String id; @Column(name = "name") private String name; ... }
– HQL: Hibernate cung cấp các câu lệnh truy vấn tương tự SQL, HQL của Hibernate hỗ trợ đầy đủ các truy vấn đa hình như, HQL “hiểu” các khái niệm như kế thừa (inheritance), đa hình (polymorphism), và liên kết (association).
– Database Independent: Code sử dụng Hibernate là độc lập với hệ quản trị cơ sở dữ liệu, nghĩa là ta không cần thay đổi câu lệnh HQL khi ta chuyển từ hệ quản trị CSDL MySQL sang Oracle, hay các hệ quản trị CSDL khác… Do đó rất dễ để ta thay đổi CSDL quan hệ, đơn giản bằng cách thay đổi thông tin cấu hình hệ quản trị CSDL trong file cấu hình:
//used MySQL
com.mysql.jdbc.Driver
// used Oracle
oracle.jdbc.driver.OracleDriver
– Lazy Loading: Với những ứng dụng Java làm việc với cơ sở dữ liệu lớn hàng trăm triệu bản ghi, việc có sử dụng Lazy loading trong truy xuất dữ liệu từ database mang lại lợi ích rất lớn.
– Quản lý commit/ rollback Transaction: Transaction là nhóm các hoạt động (với database) của một tác vụ. Nếu một hoạt động không thành công thì toàn bộ tác vụ không thành.công. Với JDBC lập trình viên phải chủ động thực hiện commit khi toàn bộ hoạt động của tác vụ thành công, hay phải rollback khi có một hoạt động không thành công để kết thúc tác vụ. Với Hibernate thì ta không cần quan tâm đến commit hay rollback, Hibernate đã quản lý nó giúp ta rồi.
– Hibernate Caching: Hibernate cung cấp một cơ chế bộ nhớ đệm, giúp giảm số lần truy cập vào database của ứng dụng càng nhiều càng tốt. Điều này sẽ có tác dụng tăng performance đáng kể cho ứng dụng của bạn.
Kiến trúc của Hibernate trong Java
Kiến trúc Hibernate bao gồm nhiều đối tượng như đối tượng persistent, session factory, transaction factory, connection factory, session, transaction, …
2.Persistence object
Chính là các POJO object map với các table tương ứng của cơ sở dữ liệu quan hệ.
2.Configuration
Là đối tượng đầu tiên và duy nhất bạn cần tạo trong một chương trình có sử dụng Hibernate. Nó đại diện cho thông tin cấu hình hoặc thuộc tính yêu cầu của Hibernate. Đối tượng này sẽ cung cấp cho chúng ta hai thành phần chính:
– Database Connection: Thao tác này được xử lý thông qua một hoặc nhiều tệp cấu hình được Hibernate hỗ trợ. Các tệp này là hibernate.properties và hibernate.cfg.xml.
– Class mapping: Tạo ra kết nối giữa các lớp Java và các bảng trong cơ sở dữ liệu
>>> Xem thêm bài viết:
– Khai báo và sử dụng mảng các đối tượng trong Java
– Phân biệt ArrayList, Set và Vector trong Java
– Lập trình đa luồng là gì? Hướng dẫn lập trình đa luồng bằng ngôn ngữ Java
2.Session Factory
Là một interface giúp tạo ra session kết nối đến database bằng cách đọc các cấu hình trong Hibernate configuration.
SessionFactory là đối tượng nặng (heavy weight object) nên thường nó được tạo ra trong quá trình khởi động ứng dụng và lưu giữ để sử dụng sau này.
SessionFactory là một đối tượng luồng an toàn (Thread-safe) và được sử dụng bởi tất cả các luồng của một ứng dụng.
Mỗi một database phải có một SessionFactory. Vì vậy, nếu bạn đang sử dụng nhiều cơ sở dữ liệu thì bạn sẽ phải tạo nhiều đối tượng SessionFactory. Giả sử ta sử dụng MySQL và Oracle cho ứng dụng Java của mình thì ta cần có một SessionFactory cho MySQL, và một SessionFactory cho Oracle.
2.Hibernate Session
Một session được sử dụng để có được một kết nối vật lý với một cơ sở dữ liệu. Đối tượng Session là nhẹ và được thiết kế để được tạo ra instance mỗi khi tương tác với cơ sở dữ liệu. Các đối tượng liên tục được lưu và truy xuất thông qua một đối tượng Session.
Các đối tượng Session không nên được mở trong một thời gian dài bởi vì chúng thường không phải là luồng an toàn (thread-unsafe) và chúng cần được tạo ra và được đóng khi cần thiết.
Mỗi một đối tượng Session được SessionFactory tạo ra sẽ tạo một kết nối đến database.
2.Transaction
Một Transaction đại diện cho một đơn vị làm việc với cơ sở dữ liệu và hầu hết các RDBMS hỗ trợ chức năng transaction. Các transaction trong Hibernate được xử lý bởi trình quản lý transaction (từ JDBC hoặc JTA).
Transaction đảm bảo tính toàn vẹn của phiên làm việc với cơ sở dữ liệu. Tức là nếu có một lỗi xảy ra trong transaction thì tất cả các tác vụ thực hiện sẽ thất bại.
Transaction là một đối tượng tùy chọn và các ứng dụng Hibernate có thể chọn không sử dụng interface này, thay vào đó quản lý transaction trong code ứng dụng riêng.
2.Query
Các đối tượng Query sử dụng chuỗi truy vấn SQL (Native SQL) hoặc Hibernate Query Language (HQL) để lấy dữ liệu từ cơ sở dữ liệu và tạo các đối tượng.
2.Criteria
Đối tượng Criteria được sử dụng để tạo và thực hiện các tiêu chí truy vấn để lấy các đối tượng từ database.
Tìm hiểu Hibernate là gì?
Trước khi định nghĩa Hibernate là gì, chúng ta cần điểm nhanh qua hai khái niệm: ORM và Persistence layer. Đây là hai khái niệm tác động trực tiếp lên việc hình thành Hibernate.
ORM là gì?
ORM là tên viết tắt của Object Relational Mapping. ORM được hiểu như một framework với cơ chế cho phép người dùng tương tác với cơ sở dữ liệu. Các thao tác được diễn ra tự nhiên thông qua một số đối tượng.
ORM giúp người dùng thực hiện các hoạt động như khởi tạo dữ liệu, tìm kiếm dữ liệu và truy cập dữ liệu một cách đơn giản dù cho hệ thống có sử dụng bất kỳ công cụ nào. Ví dụ có thể kể đến như: SQL Server, MySQL, PostgreSQL… Quy trình hoạt động của ORM sử dụng kỹ thuật ánh xạ đối tượng vào dữ liệu được lưu trữ trong Databases.
Persistence layer là gì?
Cấu tạo của một ứng dụng thông thường sẽ bao gồm ba phần: presentation layer (lớp giao diện), business layer (lớp xử lý nghiệp vụ), data layer (lớp chứa dữ liệu). Trong đó business layer lại được chia thành hai phần nhỏ bao gồm: business logic layer và persistence layer.
Trong khi business logic layer đảm nhận trách nhiệm thực hiện những phép tính logic thì persistence layer lại là cầu nối để giao tiếp với lớp chứa dữ liệu. Thông thường, persistence layer sẽ làm việc cùng với một hệ quản trị dữ liệu quan hệ – còn được gọi là Relational DBMS. Persistence layer thực hiện rất nhiều hoạt động khác nhau với cơ sở dữ liệu như tìm kiếm, truy xuất, kết nối và lưu trữ.
>>> Xem thêm : Kỹ thuật phần mềm là gì? Những trường ĐH có khoa kỹ thuật phần mềm
Định nghĩa Hibernate là gì?
Khi đã nắm rõ hai phần định nghĩa ở trên, ta sẽ rút ra được khái niệm Hibernate là gì. Hibernate là một dạng ORM framework hoạt động phục vụ cho persistence layer. Nhìn chung, sự phát triển của Hibernate giúp cho người dùng đỡ đi một phần công việc xung quanh persistence layer. Công việc cụ thể của Hibernate là viết các mã bằng ngôn ngữ lập trình Java. Các mã này giúp sẽ giúp object (POJO) có thể map được với hệ thống quản lý cơ sở dữ liệu quan hệ (database). Nó cũng hỗ trợ người dùng phát triển các khái niệm lập trình hướng đối tượng với Databases.
Người ta thường nói rằng, hãy dùng Hibernate, đừng dùng JDBC. Vậy JDBC là gì? JDBC cũng là một công cụ dùng để kết nối Databases. Tuy nhiên nó chỉ dừng lại ở mức thô sơ. Hibernate xuất hiện như một dạng cải tiến của JDBC. Chính vì thế, hiện tại không có mấy người sử dụng JDBC nữa.
Vậy điểm vượt trội so với JDBC của Hibernate Java là gì? Hibernate được phát triển khả năng tự động hóa ở mức cao nhất có thể. Xuyên suốt các hoạt động truy vấn và lưu trữ dữ liệu, Hibernate có thể thay người dùng xử lý nhanh chóng và mạnh mẽ thay vì các bước thủ công rắc rối tại JDBC.
Giới thiệu về Hibernate
Hibernate ra đời năm 2001 bởi nhà sáng lập Gavin King như một sự thay thế cho EJB2 kiểu thực thể bean. Hiện nay, phiên bản mới nhất của Hibernate là 5.2.10.Final. Seri bài hướng dẫn học Hibernate này cung cấp các khái niệm về Hibernate Framework cùng với các ví dụ đơn giản và nâng cao. Seri bài học này rất hữu ích cho người mới bắt đầu và những người đã có kinh nghiệm.
Keywords searched by users: hibernate java là gì
Categories: Tìm thấy 94 Hibernate Java Là Gì
See more here: kientrucannam.vn
See more: https://kientrucannam.vn/vn/