JDBC操作呼び出しQracle中プロセスまたは関数取得データ


JavaではSQL言語文字列を直接データベースに転送することでデータベース内のデータを呼び出すことができますが、ネットワークからSQL文を注入されやすく、転送データ量が効率に大きく影響するなど、多くの欠点があります.
だから普通のJAVAプログラムはデータベースを操作する方式はすべて事前にデータベースの中でPL/SQLプログラミングで私达の操作する过程あるいは関数を创立することを通じて(通って)、それからJAVAプログラムがJDBCを通じて直接データベースの中の过程を呼び出して私达の目的を达成して、このように彼の人はネットのこっそりとSQL文を注入して私达のデータベースのデータを盗み取ることができなくて、また,伝送されるデータ量も小さくなり,効率が最適化される.
次の例では、データベースのプロシージャと関数をJDBCで呼び出して、データの取得と変更の目的を達成します.
1.まずscottユーザーでログインし、LOLテーブルを新規作成し、テーブルにデータを挿入します.
--     
create table lol(heronum number(5),heroname varchar2(10),herotype varchar2(10));

 
(テーブル内の各データに連続した番号を付けるシーケンスを作成します)
--      ()
create or replace sequence seq_lol
start with 1   -- 0  
increment by 1  --    1
maxvalue 100  --    100
nocycle      --   
nocache      --    (           )

 
 
 
--       
insert into lol values(seq_lol.nextval,'  ','  ');
insert into lol values(seq_lol.nextval,'  ','  ');
insert into lol values(seq_lol.nextval,' ','  ');
insert into lol values(seq_lol.nextval,'  ','  ');
insert into lol values(seq_lol.nextval,'  ','  ');

2.(データを修正する)表に挿入された最初のデータが間違っていることを発見しました.ゲレンは近戦タイプであるべきです.ここではheronameを入力することでこのデータのherotypeを修正するプロセスを定義します.
--           ,       
create or replace procedure pro_updateTypeByName(v_heroname varchar2,v_herotype varchar2) is

begin
  update lol set herotype=v_herotype where heroname=v_heroname;
end;

3.JDBCでデータベースを呼び出す過程で、名前をゲレンのヒーローのタイプに変更する.
(1)まずJAVAに接続データベースを取得するための接続オブジェクトのクラスを書く(ここでは、このクラスの構造方法を私有化することで、外部がその中の静的方法を呼び出すことでしかオブジェクトを得ることができず、この取得オブジェクトの静的方法で一連の判断を行い、プログラムの実行中に1つの接続オブジェクトしか存在しないようにすることで、プログラムのリソースを節約し、データベースとJAVAの接続効率を最適化することができる).
/**
 *      ,         
 * @author yy
 *
 */
public class DBUtil {
	private static Connection conn;
	//        ,                      
	private DBUtil(){
		
	}
	public static Connection getconn(){
		if(conn==null){
			try {
				//    (             JDBC )
				Class.forName("oracle.jdbc.driver.OracleDriver");
				String url = "jdbc:oracle:thin:@172.19.238.127:1521:ORCL";
				//       
				conn = DriverManager.getConnection(url, "scott", "scott");
				return conn;
			} catch (Exception e) {
				e.printStackTrace();
			}
			return null;
		}
		return conn;
	}
}

     (2).データベース内のプロセスを実行するためのメソッドを作成する操作クラスを定義します.
public class EXEChw {
	/**
	 *         
	 * @param name         
	 * @param newtype        
	 */
	public void setTypeByName(String name,String newtype){
		try{
		//         
		Connection conn = DBUtil.getconn();
		//       SQL  (   ?      ,    SQL         ,           BUG)
		String sql = "{call pro_updateTypeByName(?,?)}";
		//      
		CallableStatement cstm = conn.prepareCall(sql);
		// ?  
		cstm.setString(1, name);
		cstm.setString(2, newtype);
		//    
		cstm.execute();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

     (3).メソッドを呼び出してデータベース内のプロセスを実行し、データベース内の内容を変更し、ゲレンのタイプを近戦に変更します.
EXEChw eh = new EXEChw();
eh.setTypeByName("  ", "  ");

     (4).データベースでlolテーブルを表示し、上記の操作がゲレンのタイプを変更したかどうかを確認します.
SQL> select * from lol;
 
HERONUM HERONAME   HEROTYPE
------- ---------- ----------
      1            
      2            
      3             
      4            
      5            
 
SQL> 

 3.(データを取得)ヒーローの番号を入力することで、このヒーローのすべての情報を取得します.
    (1).このプロシージャをデータベースに作成します.
--           ,            
create or replace procedure pro_getAllByNum(v_heronum in number,v_heroname out varchar2,v_herotype out varchar2) is

begin
  select heroname,herotype into v_heroname,v_herotype from lol where heronum=v_heronum;
end;

    (2).EXChwクラスにおいて、このプロセスをJDBCで呼び出すことにより、この番号付けヒーローの名前とタイプの出力を得る方法を作成する.
 
	/**
	 *             
	 * @param num      
	 */
	public void getNameTypeByNum(int num){
		try{
		//         
		Connection conn = DBUtil.getconn();
		//       SQL  (   ?      ,    SQL         ,           BUG)
		String sql = "{call pro_getAllByNum(?,?,?)}";
		//      
		CallableStatement cstm = conn.prepareCall(sql);
		//    ?  
		cstm.setInt(1, num);
		//     ?       
		cstm.registerOutParameter(2, java.sql.Types.VARCHAR);
		cstm.registerOutParameter(3, java.sql.Types.VARCHAR);
		//    
		cstm.execute();
		//         
		String name = cstm.getString(2);
		String type = cstm.getString(3);
		//  
		System.out.println("  :"+name+",  :"+type);
		}catch(Exception e){
			e.printStackTrace();
		}
	}

     (3).JAVAの出力は
  : ,  :  

 4.lolテーブルのすべてのデータの表示(カーソルの使用)
遅すぎて、明日は≡'(*>▽<*)と書きます~