Chủ đề của HSF302 - Làm việc với Spring Framework

HSF302 - Phần 7: Spring JDBC, Spring ORM và giao dịch

Mỗi dòng kết quả SQL được biến thành đối tượng Java bởi một RowMapper, thường viết gọn bằng biểu thức lambda đọc từng cột từ ResultSet. Khi một nghiệp vụ gồm nhiều câu lệnh, @Transactional bọc chúng thành một giao dịch: ngoại lệ không kiểm tra làm toàn bộ quay lui, còn thuộc tính propagation quyết định phương thức được gọi nhập vào giao dịch đang chạy hay mở giao dịch mới. Phần việc lặp lại như mở kết nối, tạo PreparedStatement và đóng tài nguyên do JdbcTemplate gánh, người viết chỉ đưa câu SQL và tham số qua query hoặc update. Khi cần ánh xạ đối tượng thay vì viết SQL tay, Spring nối Hibernate vào cùng hạ tầng bean và giao dịch, nên tầng DAO dùng JDBC và tầng dùng JPA cùng tồn tại trong một ứng dụng. Cách ánh xạ thực thể ấy xem lại ở Phần 1.

Xem danh sách câu hỏi10 câu hỏi100% có giải thích

Bắt đầu bằng Chế độ học nếu bạn muốn đáp án và giải thích hiện ngay sau mỗi câu — không bấm giờ, dừng lúc nào cũng được. Chọn Thi thử khi muốn biết mình đang ở đâu: có bấm giờ, chấm điểm ở cuối, và giải thích chỉ mở sau khi nộp.

Học ngân hàng câu hỏi của chủ đề

Luyện tập theo chủ đề này

10Câu hỏi hiện có

Câu hỏi của chủ đề

10/10 câuHết danh sách
ARepository layer
BService layer
CController layer
DView layer
Lời giải
Đáp án đúng: "Service layer". Trong kiến trúc phân lớp thường dùng với Spring, lớp dịch vụ đánh dấu bằng @Service chứa logic nghiệp vụ: kiểm tra quy tắc, tính toán, phối hợp nhiều repository và thường là nơi đặt ranh giới giao dịch @Transactional. "Repository layer" chỉ lo truy cập dữ liệu như lưu, tìm, xoá thực thể qua JpaRepository, không nên chứa quy tắc nghiệp vụ. "Controller layer" nhận yêu cầu HTTP, đọc tham số, gọi service rồi trả về view hoặc dữ liệu; nhồi logic nghiệp vụ vào đây làm controller phình to và khó tái sử dụng. "View layer" chỉ hiển thị dữ liệu cho người dùng, ví dụ trang Thymeleaf, không quyết định nghiệp vụ. Tách như vậy giúp mỗi lớp có một trách nhiệm và kiểm thử riêng được.
Mở trang câu hỏi này →
ATo define business logic.
BTo manage user sessions.
CTo provide an abstraction layer for database interactions.
DTo handle application security.
Lời giải
Đáp án đúng: "To provide an abstraction layer for database interactions.". DAO (Data Access Object, đối tượng truy cập dữ liệu) là mẫu thiết kế gom toàn bộ thao tác đọc ghi cơ sở dữ liệu vào một lớp có giao diện rõ ràng như findById, save, delete, giấu đi chi tiết JDBC, JPA hay SQL bên dưới; trong Spring, lớp DAO thường gắn @Repository để được quét thành bean và được dịch ngoại lệ sang DataAccessException, tầng service chỉ gọi DAO mà không biết dữ liệu nằm ở đâu. "To define business logic." là việc của tầng service, nơi điều phối quy tắc nghiệp vụ và gọi DAO. "To manage user sessions." thuộc tầng web hoặc HttpSession, Spring Session, không phải tầng dữ liệu. "To handle application security." là trách nhiệm của Spring Security với filter, xác thực và phân quyền, không phải của DAO.
Mở trang câu hỏi này →
AJdbcTemplate
BJdbcManager
CEntityManager
DSqlHelper
Lời giải
Đáp án đúng: "JdbcTemplate". JdbcTemplate là lớp trung tâm của module Spring JDBC: nó tự mở và đóng Connection, tạo Statement, duyệt ResultSet, xử lý ngoại lệ và dịch SQLException thành DataAccessException, nên lập trình viên chỉ viết câu SQL và một RowMapper để ánh xạ dòng thành đối tượng, bớt hẳn mã lặp lại của JDBC thuần. "JdbcManager" không phải lớp có trong Spring Framework. "EntityManager" thuộc JPA, quản lý thực thể và persistence context, làm việc ở tầng ORM chứ không phải công cụ giản lược JDBC. "SqlHelper" cũng không phải lớp của Spring, chỉ là một cái tên chung chung đặt ra làm nhiễu, dễ gây nhầm với các lớp tiện ích tự viết trong dự án.
Mở trang câu hỏi này →
AHibernate
BEclipseLink
CMyBatis
DAll of the above
Lời giải
Đáp án đúng: "All of the above". Spring không tự làm ORM (ánh xạ đối tượng – quan hệ) mà tích hợp các công cụ có sẵn: Hibernate và EclipseLink là hai bản cài đặt JPA, được nối vào qua lớp hỗ trợ ORM/JPA của Spring như LocalContainerEntityManagerFactoryBean và JpaTransactionManager; MyBatis tích hợp qua dự án mybatis-spring với SqlSessionFactoryBean, dùng chung DataSource và quản lý giao dịch của Spring. Nói chặt chẽ thì MyBatis là công cụ ánh xạ SQL (SQL mapper) chứ không hẳn là ORM, vì lập trình viên tự viết câu SQL còn nó chỉ ánh xạ kết quả sang đối tượng, không quản lý trạng thái entity; tuy vậy cả ba đều dùng được cùng Spring nên đáp án là phương án gộp. Chọn riêng "Hibernate" là bỏ sót, dù đây là provider mặc định của Spring Boot. Chọn riêng "EclipseLink" cũng bỏ sót, dù nó là bản cài đặt tham chiếu của JPA. Chọn riêng "MyBatis" còn kém hơn vì đó lại là công cụ ít giống ORM nhất trong ba.
Mở trang câu hỏi này →
AEncrypt API data
BRender views
CManage database transactions programmatically
DBuild Spring Boot jars
Lời giải
Đáp án đúng: "Manage database transactions programmatically". PlatformTransactionManager là interface trung tâm của hạ tầng giao dịch Spring, với các phương thức getTransaction, commit và rollback; có các hiện thực như DataSourceTransactionManager cho JDBC và JpaTransactionManager cho JPA. Lập trình viên có thể gọi trực tiếp hoặc qua TransactionTemplate để quản lý giao dịch bằng mã, và chính @Transactional kiểu khai báo cũng dựa vào nó phía sau. "Encrypt API data" sai vì mã hoá dữ liệu thuộc Spring Security hoặc thư viện mật mã, không liên quan giao dịch. "Render views" là việc của ViewResolver và view như Thymeleaf. "Build Spring Boot jars" là việc của công cụ build như plugin Maven hoặc Gradle của Spring Boot, không phải một bean chạy lúc ứng dụng hoạt động.
Mở trang câu hỏi này →
AEntityManager
BJdbcTemplate
CSessionFactory
DRepository
Lời giải
Đáp án đúng: "JdbcTemplate". Trong Spring JDBC, JdbcTemplate là lớp chạy câu SQL: query với RowMapper để đọc nhiều dòng, queryForObject để lấy một giá trị, update để thêm, sửa, xoá; nó lo mở, đóng kết nối và dịch SQLException thành DataAccessException. "EntityManager" là API của JPA, làm việc với thực thể và JPQL chứ không phải công cụ của Spring JDBC. "SessionFactory" là của Hibernate gốc, tạo Session để thao tác ORM, cũng không thuộc Spring JDBC. "Repository" là khái niệm tầng truy cập dữ liệu, ứng với annotation @Repository hoặc interface của Spring Data; bên trong một repository có thể dùng JdbcTemplate, nhưng bản thân Repository không phải lớp thực thi SQL.
Mở trang câu hỏi này →
A@Autowired
B@Transactional
C@Service
D@Entity
Lời giải
Đáp án đúng: "@Transactional". @Transactional đặt trên lớp hoặc phương thức để Spring bọc lời gọi trong một giao dịch: proxy AOP mở giao dịch qua PlatformTransactionManager trước khi chạy phương thức, commit nếu kết thúc bình thường và rollback nếu ném RuntimeException hay Error; có thể chỉnh propagation, isolation, readOnly, timeout, rollbackFor. Lưu ý lời gọi từ chính bên trong cùng lớp không đi qua proxy nên không được áp giao dịch. "@Autowired" chỉ tiêm phụ thuộc vào bean. "@Service" đánh dấu bean tầng nghiệp vụ; tầng này thường là nơi đặt @Transactional nhưng bản thân annotation đó không mở giao dịch nào. "@Entity" đánh dấu lớp được JPA ánh xạ tới bảng, mô tả dữ liệu chứ không điều khiển giao dịch.
Mở trang câu hỏi này →
AController class
BHTML page
CRepository/DAO class
DJSP scriptlet
Lời giải
Đáp án đúng: "Repository/DAO class". Trong ứng dụng Spring MVC kết hợp Hibernate theo kiến trúc phân lớp, thao tác cơ sở dữ liệu đặt ở lớp Repository hay DAO (Data Access Object, đối tượng truy cập dữ liệu), đánh dấu @Repository; lớp này dùng Session của Hibernate, EntityManager hoặc Spring Data, và Spring tự dịch ngoại lệ của Hibernate sang DataAccessException. Service gọi repository, controller gọi service. "Controller class" chỉ nên nhận yêu cầu và chọn view; viết truy vấn ở đây trộn tầng web với tầng dữ liệu, khó kiểm thử và tái sử dụng. "HTML page" là tầng hiển thị chạy ở trình duyệt, không thể và không được chạm cơ sở dữ liệu. "JSP scriptlet" là mã Java nhúng trong JSP; về kỹ thuật chạy được JDBC nhưng là cách làm lỗi thời, phá vỡ việc tách lớp của MVC.
Mở trang câu hỏi này →
ATo handle user authentication
BTo ensure data integrity and consistency
CTo manage network traffic
DTo optimize web page loading
Lời giải
Đáp án đúng: "To ensure data integrity and consistency". Giao dịch (transaction) gom nhiều thao tác ghi thành một đơn vị theo tính chất ACID: hoặc tất cả được commit, hoặc khi có lỗi thì rollback toàn bộ, nên dữ liệu không bị bỏ dở nửa chừng; ví dụ chuyển tiền phải trừ tài khoản này và cộng tài khoản kia cùng lúc. Trong JPA, các thay đổi entity được flush xuống cơ sở dữ liệu trong phạm vi giao dịch, và Spring quản lý phạm vi đó bằng @Transactional. "To handle user authentication" sai vì xác thực người dùng là việc của Spring Security. "To manage network traffic" sai vì giao dịch cơ sở dữ liệu không điều phối lưu lượng mạng. "To optimize web page loading" sai vì tốc độ tải trang phụ thuộc bộ nhớ đệm và kích thước tài nguyên, không phải mục đích của quản lý giao dịch.
Mở trang câu hỏi này →
ASimplifies error handling
BAutomatic query optimization
CUI rendering
DThread pool creation
Lời giải
Đáp án đúng: "Simplifies error handling". JdbcTemplate của Spring gánh phần lặp lại của JDBC thuần: mở và đóng Connection, Statement, ResultSet đúng cách, và quan trọng là bắt SQLException kiểu checked rồi dịch sang cây ngoại lệ DataAccessException kiểu unchecked, có nghĩa rõ như DuplicateKeyException hay EmptyResultDataAccessException, nhờ vậy mã không còn đầy khối try-catch-finally. "Automatic query optimization" sai vì JdbcTemplate chạy nguyên câu SQL lập trình viên viết, việc tối ưu kế hoạch thực thi là của hệ quản trị cơ sở dữ liệu. "UI rendering" thuộc tầng giao diện như Thymeleaf, không liên quan tới JDBC. "Thread pool creation" là việc của ExecutorService hay ThreadPoolTaskExecutor, JdbcTemplate không tạo luồng; nhóm kết nối cũng do DataSource như HikariCP lo.
Mở trang câu hỏi này →

Đề có câu hỏi của chủ đề này

5 đề chứa ít nhất một câu thuộc chủ đề — mở đề để làm cả bộ, không chỉ từng câu.