เช่นเดียวกับวัตถุการเชื่อมต่อที่สร้างคำสั่งและวัตถุที่เตรียมไว้มันยังสร้างวัตถุ callablestatement ซึ่งจะใช้ในการดำเนินการตามขั้นตอนฐานข้อมูลที่เก็บไว้
สร้างวัตถุ callablestatement:
สมมติว่าต้องดำเนินการขั้นตอนการจัดเก็บของ Oracle ต่อไปนี้:
สร้างหรือแทนที่โพรซีเดอร์ getEmpName (emp_id in number, emp_first out varchar) asbegin เลือกก่อนเป็น emp_first จากพนักงานที่ id = emp_id; สิ้นสุด;
หมายเหตุ: ข้างต้นได้เขียนขั้นตอนการจัดเก็บของ Oracle แต่เราใช้ฐานข้อมูล MySQL โดยเขียนขั้นตอนที่เก็บไว้เดียวกันสำหรับ MySQL ดังต่อไปนี้สร้างมันในฐานข้อมูล EMP:
ตัวคั่น $$ ขั้นตอนการลดลงหากมีอยู่ `emp`.`getEmpName` $$ สร้างขั้นตอน` emp`.`getEmpName` (ใน emp_id int ออก emp_first varchar (255)) เริ่มเลือกก่อนเป็น emp_first จากพนักงานที่ id = emp_id;
มีพารามิเตอร์สามประเภท: ใน, ออกและ inout วัตถุ PreparedStatement ใช้เฉพาะในพารามิเตอร์ วัตถุ callablestatement สามารถใช้ทั้งสาม
นี่คือคำจำกัดความแต่ละข้อ:
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการสร้างอินสแตนซ์วัตถุ callablestatement ตามขั้นตอนที่เก็บไว้ข้างต้นโดยใช้วิธีการเชื่อมต่อ preprepall ():
callablestatement cstmt = null; ลอง {string sql = "{call getempname (?,?)}"; cstmt = conn.preparecall (SQL); - - .} catch (sqlexception e) { - .} ในที่สุด { . - -SQL ของตัวแปรสตริงแสดงถึงขั้นตอนที่เก็บไว้โดยใช้ตัวยึดพารามิเตอร์
การใช้วัตถุ callablestatement กำลังใช้วัตถุที่เตรียมไว้ ค่าจะต้องถูกผูกไว้กับพารามิเตอร์ทั้งหมดก่อนที่จะดำเนินการคำสั่งมิฉะนั้นจะได้รับ Sqlexception
หากมีพารามิเตอร์ในพารามิเตอร์เพียงทำตามกฎและกลเม็ดเดียวกันที่ใช้กับวัตถุที่เตรียมไว้ ใช้เมธอด setxxx () ที่สอดคล้องกับชนิดข้อมูล Java ที่จะถูกผูกไว้
เมื่อใช้พารามิเตอร์ OUT และ INOUT ต้องใช้ registeroutParameter () ด้วยวิธีการ callablestatement เพิ่มเติม registeroutparameter () วิธีการชนิดข้อมูล JDBC ที่ถูกผูกไว้กับขั้นตอนที่เก็บไว้ที่ส่งคืนโดยประเภทข้อมูล
เมื่อเรียกใช้ขั้นตอนที่เก็บไว้แล้วค่าจะถูกเรียกคืนโดยใช้พารามิเตอร์เอาต์พุตของวิธี getXxx () วิธีการนี้จะใช้ค่าประเภท SQL เพื่อดึงประเภทข้อมูล Java
ปิดวัตถุ callablestatement:
เช่นเดียวกับการปิดวัตถุคำสั่งอื่น ๆ วัตถุ callablestatement ควรปิดด้วยเหตุผลเดียวกัน
การโทรง่าย ๆ ไปยังวิธีปิด () จะทำงาน หากวัตถุการเชื่อมต่อถูกปิดก่อนจะปิดวัตถุ callablestatement เช่นกัน อย่างไรก็ตามวัตถุ callablestatement ควรปิดอย่างชัดเจนเพื่อให้แน่ใจว่ามีการกวาดล้างที่ถูกต้อง
callablestatement cstmt = null; ลอง {string sql = "{call getempname (?,?)}"; cstmt = conn.preparecall (SQL); - - .} catch (sqlexception e) { - .} ในที่สุด {cstmt.close ();} PS: อินสแตนซ์ออบเจ็กต์ callablestatement
นี่คือตัวอย่างของขั้นตอนการจัดเก็บ MySQL โดยใช้ callablestatement พร้อมกับ getempname () ต่อไปนี้::
โปรดตรวจสอบให้แน่ใจว่าขั้นตอนที่จัดเก็บได้ถูกสร้างขึ้นในฐานข้อมูล EMP สามารถทำได้โดยใช้เบราว์เซอร์ MySQL Query
ตัวคั่น $$ ขั้นตอนการลดลงหากมีอยู่ `emp`.`getEmpName` $$ สร้างขั้นตอน` emp`.`getEmpName` (ใน emp_id int ออก emp_first varchar (255)) เริ่มเลือกก่อนเป็น emp_first จากพนักงานที่ id = emp_id;
รหัสสคริปต์นี้ถูกเขียนขึ้นอยู่กับการติดตั้งสภาพแวดล้อมและฐานข้อมูลในบทก่อนหน้า
คัดลอกตัวอย่างต่อไปนี้ jdbcexample.java, รวบรวมและเรียกใช้ตามที่แสดงด้านล่าง:
// ขั้นตอนที่ 1. นำเข้าแพ็คเกจที่ต้องการ java.sql.*; คลาสสาธารณะ JDBCEXAMPLE {// ชื่อไดรเวอร์ JDBC และ URL ฐานข้อมูลคงที่สตริงสุดท้าย jdbc_driver = "com.mysql.jdbc.driver"; สตริงสุดท้ายคงที่ db_url = "jdbc: mysql: // localhost/emp"; // ข้อมูลรับรองฐานข้อมูลสตริงสุดท้ายคงที่ user = "ชื่อผู้ใช้"; สตริงสุดท้ายคงที่ = "รหัสผ่าน"; โมฆะคงที่สาธารณะหลัก (สตริง [] args) {การเชื่อมต่อ conn = null; callablestatement stmt = null; ลอง {// ขั้นตอนที่ 2: ลงทะเบียนคลาสไดรเวอร์ JDBC forName ("com.mysql.jdbc.driver"); // ขั้นตอนที่ 3: เปิดระบบการเชื่อมต่อ. out.println ("การเชื่อมต่อกับฐานข้อมูล ... "); conn = drivermanager.getConnection (db_url, ผู้ใช้, ผ่าน); // ขั้นตอนที่ 4: ดำเนินการแบบสอบถาม System.out.println ("การสร้างคำสั่ง ... "); String sql = "{call getempname (?,?)}"; stmt = conn.preparecall (SQL); // ผูกในพารามิเตอร์ก่อนจากนั้นผูกพารามิเตอร์ int empid = 102; stmt.setint (1, empid); // สิ่งนี้จะตั้งค่า ID เป็น 102 // เนื่องจากพารามิเตอร์ที่สองออกแล้วลงทะเบียน stmt.registeroutparameter (2, java.sql.types.varchar); // ใช้วิธีการดำเนินการเพื่อเรียกใช้ขั้นตอนที่เก็บไว้ System.out.println ("ดำเนินการขั้นตอนที่เก็บไว้ ... "); stmt.execute (); // ดึงชื่อพนักงานด้วยสตริงวิธี getXXX empname = stmt.getString (2); System.out.println ("ชื่อ EMP พร้อม ID:" + EMPID + "คือ" + EmpName); stmt.close (); conn.close (); } catch (sqlexception se) {// จัดการข้อผิดพลาดสำหรับ jdbc se.printstacktrace (); } catch (exception e) {// จัดการข้อผิดพลาดสำหรับ class.forName e.printStackTrace (); } ในที่สุด {// ในที่สุดบล็อกที่ใช้ในการปิดทรัพยากรลอง {ถ้า (stmt! = null) stmt.close (); } catch (sqlexception se2) {} // ไม่มีอะไรที่เราสามารถลอง {ถ้า (conn! = null) conn.close (); } catch (sqlexception se) {se.printstacktrace (); } // สิ้นสุดในที่สุดลอง} // end try system.out.println ("ลาก่อน!"); } // สิ้นสุดหลัก} // สิ้นสุด jdbcexampleตอนนี้รวบรวมตัวอย่างข้างต้นดังนี้:
c:> javac jdbcexample.java
เมื่อเรียกใช้ JDBCEXAMPLE มันจะให้ผลลัพธ์ต่อไปนี้:
c:> java jdbcexample
การเชื่อมต่อกับฐานข้อมูล ... การสร้างคำสั่ง ... การดำเนินการขั้นตอนที่เก็บไว้ ... ชื่อ EMP กับ ID: 102 คือ Zaidgoodbye!
ไวยากรณ์ SQL Escape ของ JDBC:
Escape Syntax เปิดใช้งานความยืดหยุ่นในการใช้คุณสมบัติบางอย่างของฐานข้อมูลโดยใช้วิธีการและคุณสมบัติ JDBC มาตรฐาน
รูปแบบไวยากรณ์ SQL Escape ทั่วไปมีดังนี้:
{คำหลัก 'พารามิเตอร์'}นี่คือสิ่งต่อไปนี้ที่จะพบว่ามีประโยชน์มากในขณะที่ทำเช่นนั้นในการเขียนโปรแกรม JDBC:
D, T, TS คำหลัก:
พวกเขาช่วยกำหนดข้อความวันที่เวลาและเวลา อย่างที่คุณทราบไม่มีระบบการจัดการฐานข้อมูลสองระบบขึ้นอยู่กับเวลาและวันที่ในลักษณะเดียวกัน ไวยากรณ์หลบหนีนี้จะบอกไดรเวอร์รูปแบบวันที่หรือเวลาในการแสดงผลไปยังฐานข้อมูลเป้าหมาย ตัวอย่างการใช้งาน:
{d 'yyyy-mm-dd'}โดยที่ yyyy = ปี, mm = เดือน, dd = วัน การใช้ไวยากรณ์นี้ {D '2009-09-03'} คือ 9 มีนาคม 2009
นี่คือตัวอย่างง่ายๆของวิธีแทรกตารางวันที่:
// สร้างคำสั่ง objectstmt = conn.createstatement (); // แทรกข้อมูล ==> id, ชื่อนามสกุล, Dobstring sql = "แทรกลงในค่านักเรียน" + "(100, 'zara', 'Ali', {d '2001-12-16'})"; stmt.executeupdate (sql);ในทำนองเดียวกันหนึ่งในสองไวยากรณ์ต่อไปนี้สามารถใช้ได้ไม่ว่าจะเป็น t หรือ ts:
{t 'hh: mm: ss'}โดยที่ hh = ชั่วโมง, mm = นาที, ss = วินาที การใช้ไวยากรณ์นี้ {T '13: 30: 29 '} คือ 13:30 น. 29 PM
{ts 'yyyy-mm-dd hh: mm: ss'}นี่คือสองไวยากรณ์ 'D' และ 'T' ด้านบนเพื่อแสดงไวยากรณ์การรวมตัวของ Timestamp
หลบหนีคำหลัก:
คำหลักนี้ระบุอักขระที่หลบหนีที่ใช้ในประโยคที่คล้ายกัน มีประโยชน์เมื่อใช้ SQL Wildcard % โดยมีการจับคู่อักขระเป็นศูนย์หรือมากกว่า ตัวอย่างเช่น:
String sql = "เลือกสัญลักษณ์จาก MathSymbols โดยที่สัญลักษณ์เช่น '/%' {Escape ''}"; stmt.execute (SQL);หากคุณใช้ตัวละคร backslash () เป็นตัวละคร Escape คุณจะต้องใช้ตัวละครแบ็คสแลชสองตัวในตัวอักษร Java String เพราะ backslash เป็นตัวละคร Java Escape
คำหลัก FN:
คำหลักนี้หมายถึงการใช้ฟังก์ชั่นสเกลาร์ใน DBMS ตัวอย่างเช่นคุณสามารถใช้ฟังก์ชันความยาว SQL เพื่อคำนวณความยาวของสตริง GE:
{fn length ('hello world')}สิ่งนี้จะกลับมา 11 ความยาวของสตริง 'Hello World' -
โทรหาคำสำคัญ:
คำหลักนี้ใช้เพื่อเรียกขั้นตอนที่เก็บไว้ ตัวอย่างเช่นสำหรับขั้นตอนที่เก็บไว้คุณต้องใช้พารามิเตอร์ในการใช้ไวยากรณ์ต่อไปนี้:
{โทร my_procedure (?)};สำหรับขั้นตอนที่เก็บไว้จำเป็นต้องมีพารามิเตอร์ในและส่งคืนพารามิเตอร์ออกโดยใช้ไวยากรณ์ต่อไปนี้:
- = โทร my_procedure (?)};
คำหลัก OJ:
คำหลักนี้ใช้เพื่อแสดงการเข้าร่วมภายนอก ไวยากรณ์มีดังนี้:
{oj outer-join}ตารางการเข้าร่วมภายนอก = {ซ้าย | ถูกต้อง | เต็ม} การเข้าร่วมภายนอก {ตาราง | เข้าร่วมภายนอก} เกณฑ์การค้นหา ตัวอย่างเช่น:
String sql = "เลือกพนักงานจาก {oj thisttable ด้านนอกขวาเข้าร่วมที่ table บน id = '100'}"; stmt.execute (SQL);