接続オブジェクトがステートメントを作成して作成したオブジェクトを作成するように、データベースストアドプロシージャの実行に使用されるCallableStatementオブジェクトも作成します。
callablestatementオブジェクトを作成します。
次のOracleストアドプロシージャを実行する必要があると仮定します。
手順を作成または交換しますgetempname(emp_id in number、emp_first out varchar)asbeginは、id = emp_id; end;
注:上記はOracleストアドプロシージャを書いていますが、MySQLデータベースを使用して、次のようにMySQLの同じストアドプロシージャを記述し、EMPデータベースで作成しています。
delimiter $$ドロップ手順「emp」.`getempname` $$作成手順 `emp_id int、out emp_first varchar(255))は、id = emp_id; end $$ delimiterからEMP_FIRSTに最初に選択を開始します。
パラメーターには3つのタイプがあります:in、out、inout。 preatedStatementオブジェクトはパラメーターでのみ使用します。 callablestatementオブジェクトは3つすべてを使用できます。
各定義は次のとおりです。
次のコードスニペットは、Connection.PrepareCall()メソッドを使用して、上記のストアドプロシージャに基づいてCallableStatementオブジェクトをインスタンス化する方法を示しています。
callablestatement cstmt = null; try {string sql = "{call getempname(?、?)}"; cstmt = conn.preparecall(sql); 。 。 。} catch(sqlexception e){。 。 。} ついに { 。 。 。}文字列変数のSQLは、パラメータープレースホルダーを使用して、ストアドプロシージャを表します。
callablestatementオブジェクトを使用することは、準備されたステートメントオブジェクトを使用することです。ステートメントを実行する前に、値をすべてのパラメーターにバインドする必要があります。そうしないと、SQLEXCEPTIONが受信されます。
INパラメーターがある場合は、準備されたオブジェクトに適用される同じルールとトリックに従ってください。バウンドするJavaデータ型に対応するSETXXX()メソッドを使用します。
アウトパラメーターを使用して使用する場合は、追加のcallable -statementメソッドを使用したRegisteroutParameter()を使用する必要があります。 RegisteroutParameter()メソッドJDBCデータ型は、データ型によって返されるストアドプロシージャにバインドされています。
ストアドプロシージャが呼び出されると、getxxx()メソッドの出力パラメーターを使用して値が取得されます。このメソッドは、SQLタイプの値をキャストして、Javaデータ型を取得します。
callablestatementオブジェクトを閉じます:
他のステートメントオブジェクトを閉じるのと同じように、同じ理由でcallablestatementオブジェクトも閉じている必要があります。
close()メソッドへの簡単な呼び出しがジョブを行います。接続オブジェクトが最初に閉じている場合、Callablestatementオブジェクトも閉じます。ただし、正しいクリアランスを確保するために、callable -statementオブジェクトは常に明示的に閉じている必要があります。
callablestatement cstmt = null; try {string sql = "{call getempname(?、?)}"; cstmt = conn.preparecall(sql); 。 。 。} catch(sqlexception e){。 。 。}最後に{cstmt.close();} PS:callablestatementオブジェクトインスタンス
以下は、次のgetempname()とともにcallablestatementを使用したmysqlストアドプロシージャの例です。
EMPデータベースにストアドプロシージャが作成されていることを確認してください。 MySQLクエリブラウザを使用して実行できます。
delimiter $$ドロップ手順「emp」.`getempname` $$作成手順 `emp_id int、out emp_first varchar(255))は、id = emp_id; end $$ delimiterからEMP_FIRSTに最初に選択を開始します。
このスクリプトコードは、前の章の環境とデータベースのインストールに基づいて記述されています。
次の例をコピーしてjdbcexample.java、以下に示すようにコンパイルして実行します。
//ステップ1。必要なpackagesimport java.sql。*; public class jdbcexample {// jdbcドライバー名とデータベースurl static final string jdbc_driver = "com.mysql.jdbc.driver";静的最終文字列db_url = "jdbc:mysql:// localhost/emp"; //データベース資格情報静的な最終文字列ユーザー= "username";静的な最終文字列パス= "パスワード"; public static void main(string [] args){connection conn = null; callablestatement stmt = null; try {//ステップ2:JDBCドライバーclass.fornameを登録する( "com.mysql.jdbc.driver"); //ステップ3:接続system.out.println( "データベースへの接続..."); conn = drivermanager.getConnection(db_url、user、pass); //ステップ4:クエリSystem.out.println( "作成ステートメント...")を実行する; string sql = "{call getempname(?、?)}"; stmt = conn.preparecall(sql); //最初にパラメーターでバインドし、次にパラメーターint empid = 102をバインドします。 stmt.setint(1、empid); //これは102 // 2番目のパラメーターが出ているためにIDを102 //登録するため、stmt.registeroutparameter(2、java.sql.types.varchar); //実行メソッドを使用して、ストアドプロシージャを実行します。 System.out.println( "ストアドプロシージャの実行..."); stmt.execute(); // getxxxで従業員名を取得する方法文字列empname = stmt.getString(2); system.out.println( "emp name with id:" + empid + "is" + empname); stmt.close(); conn.close(); } catch(sqlexception se){// jdbc se.printstacktrace()のエラーを処理します。 } catch(例外e){// class.forname e.printstacktrace()のエラーを処理します。 }最後に{//最後にブロックはリソースを閉じるために使用されます{if(stmt!= null)stmt.close(); } catch(sqlexception se2){} //私たちができることは何もありません{if(conn!= null)conn.close(); } catch(sqlexception se){se.printstacktrace(); } //最後にtry try} // try system.out.println( "goodbye!"); } // end main} // jdbcexampleを終了します次に、上記の例を次のようにコンパイルします。
C:> Javac jdbcexample.java
jdbcexampleを実行すると、次の結果が生成されます。
C:> Java jdbcexample
データベースへの接続...ステートメントの作成...ストアドプロシージャの実行... IDでEMP名:102はZaidgoodbyeです!
JDBCのSQLエスケープ構文:
Escape構文を使用すると、標準のJDBCメソッドとプロパティを使用して、データベースの特定の機能を使用する柔軟性が可能になります。
一般的なSQLエスケープ構文形式は次のとおりです。
{キーワード「パラメーター」}JDBCプログラミングでそうする際に非常に役立つと見られる以下は次のとおりです。
d、t、tsキーワード:
日付、時刻、タイムスタンプのテキストの決定に役立ちます。ご存知のように、同じ方法で時間と日付に基づいている2つのデータベース管理システムはありません。このEscape構文は、ターゲットデータベースにレンダリングするフォーマット、日付、または時間をドライバーに伝えます。実装例:
{d 'yyyy-mm-dd'}ここで、yyyy = year、mm =月、dd = day。この構文を使用{D '2009-09-03'}は2009年3月9日です。
デートテーブルを挿入する方法の簡単な例を次に示します。
//ステートメントを作成しますobjectStmt = conn.createStatement(); // incert data ==> id、first name、last、dobstring sql = "insert into intouns values" + "( 'zara'、 'ali'、{d '' '})"; stmt.executeupdate(sql);同様に、TSであろうと、次の2つの構文のいずれかを使用できます。
{t 'HH:mm:ss'}ここで、hh = hours、mm = minutes、ss =秒。この構文を使用する{t '13:30:29 '}は午後1時30分29 pmです。
{ts 'yyyy-mm-dd hh:mm:ss'}これらは、タイムスタンプの組み合わせ構文を表すために、上記の2つの構文「D」と「T」です。
キーワードをエスケープする:
このキーワードは、Like句で使用される脱出された文字を識別します。ゼロ以上の文字が一致するSQL WildCard%を使用する場合に役立ちます。例えば:
string sql = "Mathsymbolsからシンボルを選択します。
バックスラッシュ文字()をエスケープキャラクターとして使用する場合、バックスラッシュもJavaエスケープキャラクターであるため、Java String Literalで2つのバックスラッシュ文字も使用する必要があります。
FNキーワード:
このキーワードは、DBMSでスカラー関数を使用することを意味します。たとえば、SQL長関数を使用して、GE文字列の長さを計算できます。
{fn length( 'hello world')}これは、文字列「Hello World」の長さである11を返します。 。
キーワードを呼び出す:
このキーワードは、ストアドプロシージャを呼び出すために使用されます。たとえば、ストアドプロシージャには、inパラメーターが必要です。次の構文を使用します。
{call my_procedure(?)};ストアドプロシージャの場合、次の構文を使用して、INパラメーターが必要であり、OUTパラメーターが返されます。
{? = my_procedure(?)}を呼び出します。 OJキーワード:
このキーワードは、外部結合を表すために使用されます。構文は次のとおりです。
{oj outour-join}外部結合テーブル= {左|右| Full}外部join {table | external join}検索基準。例えば:
string sql = "{oj thistable右外側の従業員を選択します。