Tôi đang làm việc trên một ứng dụng Java servlet cần tạo các câu lệnh SQL rất động cho mục đích báo cáo adhoc. Chức năng cơ bản của ứng dụng là cung cấp một loạt các tham số yêu cầu HTTP được đặt tên vào một truy vấn được mã hóa trước và tạo một bảng đầu ra được định dạng độc đáo. Tôi đã sử dụng Spring MVC và khung phụ thuộc để lưu trữ tất cả các truy vấn SQL của mình trong các tệp XML và tải chúng vào ứng dụng báo cáo, cùng với thông tin định dạng bảng. Cuối cùng, các yêu cầu báo cáo trở nên phức tạp hơn so với khả năng của các khuôn khổ ánh xạ tham số hiện có và tôi phải tự viết. Đó là một bài tập thú vị trong quá trình phát triển và tạo ra một khuôn khổ cho việc lập bản đồ tham số mạnh mẽ hơn nhiều so với bất kỳ thứ gì khác mà tôi có thể tìm thấy.
Các ánh xạ tham số mới trông như vậy:
select app.name as "App",
${optional(" app.owner as "Owner", "):showOwner}
sv.name as "Server", sum(act.trans_ct) as "Trans"
from activity_records act, servers sv, applications app
where act.server_id = sv.id
and act.app_id = app.id
and sv.id = ${integer(0,50):serverId}
and app.id in ${integerList(50):appId}
group by app.name, ${optional(" app.owner, "):showOwner} sv.name
order by app.name, sv.name
Vẻ đẹp của khung kết quả là nó có thể xử lý các tham số yêu cầu HTTP trực tiếp vào truy vấn với kiểm tra kiểu thích hợp và kiểm tra giới hạn. Không cần ánh xạ bổ sung để xác thực đầu vào. Trong truy vấn ví dụ ở trên, tham số có tên serverId
sẽ được kiểm tra để đảm bảo rằng nó có thể truyền thành một số nguyên và nằm trong khoảng 0-50. Tham số appId sẽ được xử lý dưới dạng một mảng số nguyên với giới hạn độ dài là 50. Nếu trường showOwnerhiện tại và được đặt thành "true", các bit SQL trong dấu ngoặc kép sẽ được thêm vào truy vấn được tạo cho các ánh xạ trường tùy chọn. trường Có sẵn một số ánh xạ kiểu tham số khác bao gồm các phân đoạn tùy chọn của SQL với các ánh xạ tham số khác. Nó cho phép lập bản đồ truy vấn phức tạp như nhà phát triển có thể đưa ra. Nó thậm chí còn có các điều khiển trong cấu hình báo cáo để xác định xem một truy vấn nhất định sẽ có ánh xạ cuối cùng thông qua PreparedStatement hay chỉ đơn giản là chạy dưới dạng truy vấn được tạo trước.
Đối với các giá trị yêu cầu Http mẫu:
showOwner: true
serverId: 20
appId: 1,2,3,5,7,11,13
Nó sẽ tạo ra SQL sau:
select app.name as "App",
app.owner as "Owner",
sv.name as "Server", sum(act.trans_ct) as "Trans"
from activity_records act, servers sv, applications app
where act.server_id = sv.id
and act.app_id = app.id
and sv.id = 20
and app.id in (1,2,3,5,7,11,13)
group by app.name, app.owner, sv.name
order by app.name, sv.name
Tôi thực sự nghĩ rằng Spring hoặc Hibernate hoặc một trong những khuôn khổ đó nên cung cấp một cơ chế ánh xạ mạnh mẽ hơn để xác minh các loại, cho phép các loại dữ liệu phức tạp như mảng và các tính năng khác như vậy. Tôi đã viết công cụ của mình chỉ cho mục đích của tôi, nó không được đọc cho phát hành chung. Nó chỉ hoạt động với các truy vấn của Oracle vào lúc này và tất cả mã thuộc về một tập đoàn lớn. Một ngày nào đó, tôi có thể lấy ý tưởng của mình và xây dựng một khuôn khổ mã nguồn mở mới, nhưng tôi hy vọng một trong những người chơi lớn hiện tại sẽ chấp nhận thử thách.