ฉันทำงานกับแอ็พพลิเคชัน Java servlet ที่ต้องการสร้างคำสั่ง SQL แบบไดนามิกมากเพื่อวัตถุประสงค์ในการรายงาน adhoc ฟังก์ชั่นพื้นฐานของแอพนี้คือป้อนพารามิเตอร์คำขอ HTTP ที่มีชื่อจำนวนมากลงในแบบสอบถามที่เข้ารหัสไว้ล่วงหน้าและสร้างตารางผลลัพธ์ที่จัดรูปแบบไว้อย่างสวยงาม ฉันใช้ Spring MVC และเฟรมเวิร์กการฉีดพึ่งพาเพื่อจัดเก็บการสืบค้น SQL ทั้งหมดของฉันในไฟล์ XML และโหลดลงในแอปพลิเคชันการรายงานพร้อมกับข้อมูลการจัดรูปแบบตาราง ในที่สุดข้อกำหนดการรายงานก็ซับซ้อนกว่าความสามารถของเฟรมเวิร์กการแม็ปพารามิเตอร์ที่มีอยู่และฉันต้องเขียนเอง เป็นแบบฝึกหัดที่น่าสนใจในการพัฒนาและสร้างกรอบสำหรับการทำแผนที่พารามิเตอร์ที่มีประสิทธิภาพมากกว่าสิ่งอื่นใดที่ฉันสามารถหาได้
การแมปพารามิเตอร์ใหม่มีลักษณะดังนี้:
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
ความสวยงามของเฟรมเวิร์กที่ได้คือสามารถประมวลผลพารามิเตอร์คำร้องขอ HTTP ลงในแบบสอบถามได้โดยตรงด้วยการตรวจสอบประเภทที่เหมาะสมและการ จำกัด การตรวจสอบ ไม่จำเป็นต้องมีการแมปเพิ่มเติมสำหรับการตรวจสอบอินพุต ในตัวอย่างแบบสอบถามด้านบนพารามิเตอร์ที่ชื่อserverId
จะถูกตรวจสอบเพื่อให้แน่ใจว่าสามารถส่งเป็นจำนวนเต็มและอยู่ในช่วง 0-50 พารามิเตอร์appIdจะถูกประมวลผลเป็นอาร์เรย์ของจำนวนเต็มโดยจำกัดความยาวไว้ที่ 50 หากฟิลด์showOwnerมีอยู่และตั้งค่าเป็น "จริง" บิตของ SQL ในเครื่องหมายคำพูดจะถูกเพิ่มลงในแบบสอบถามที่สร้างขึ้นสำหรับการแมปฟิลด์ที่เป็นทางเลือก ฟิลด์มีการแม็พประเภทพารามิเตอร์อีกมากมายรวมถึงเซ็กเมนต์เสริมของ SQL ที่มีการแม็พพารามิเตอร์เพิ่มเติม ช่วยให้การแมปแบบสอบถามมีความซับซ้อนมากที่สุดเท่าที่นักพัฒนาสามารถคิดขึ้นได้ มันยังมีการควบคุมในการกำหนดค่ารายงานเพื่อกำหนดว่าแบบสอบถามที่ระบุจะมีการแมปขั้นสุดท้ายผ่านทาง PreparedStatement หรือเพียงแค่เรียกใช้เป็นแบบสอบถามที่สร้างไว้ล่วงหน้า
สำหรับค่าคำขอ Http ตัวอย่าง:
showOwner: true
serverId: 20
appId: 1,2,3,5,7,11,13
มันจะสร้าง SQL ต่อไปนี้:
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
ฉันคิดว่า Spring หรือ Hibernate หรือหนึ่งในกรอบเหล่านั้นควรมีกลไกการทำแผนที่ที่มีประสิทธิภาพมากขึ้นซึ่งตรวจสอบประเภทอนุญาตประเภทข้อมูลที่ซับซ้อนเช่นอาร์เรย์และคุณสมบัติอื่น ๆ ดังกล่าว ฉันเขียนเครื่องยนต์ของฉันเพื่อจุดประสงค์เท่านั้นมันยังไม่ได้อ่านสำหรับรุ่นทั่วไป ขณะนี้ใช้งานได้กับแบบสอบถามของ Oracle เท่านั้นและรหัสทั้งหมดเป็นของ บริษัท ขนาดใหญ่ สักวันฉันอาจใช้ความคิดและสร้างกรอบโอเพนซอร์สใหม่ แต่ฉันหวังว่าหนึ่งในผู้เล่นรายใหญ่ที่มีอยู่จะรับมือกับความท้าทายนี้