mysql의 동적 sql 응용 프로그램

실행 환경:mysql 5.x, 버전 5.0 이상 선택
/*--------------저장 프로세스 1, 데이터베이스에 있는 모든 테이블 정보 체크 아웃 -----------------------*/

/*author:henry
  procedure name:sys_tables
  create_date:20091023
*/
create procedure sys_tables(in databasename varchar(20))
begin 
/*declare tmp_id int;*/ 
/*create temporary #table_field(id,fieldname)*/ 
drop table if exists tmp_tables; 
create temporary table  tmp_tables 
( 
`id` int not null, 
`tablename` varchar(40) not null, 
`tabletype` varchar(40) not null 
); 
set @rowno:=0; 
set @str=concat("insert tmp_tables(id,tablename,tabletype) select @rowno:=@rowno+1, table_name,table_type from information_schema.tables where table_schema='",databasename); 
set @str=concat(@str,"'"); 
prepare stmt1 from @str; 
execute stmt1; 
deallocate prepare stmt1; 
/*select @tmp_id:=min(id) from tmp_tables; 
while @tmp_id is not null do 

select @tmp_table_name:=tablename from tmp_tables where id=@tmp_id; 
call sys_tables_fmt(@tmp_table_name); 
delete from tmp_tables where id=@tmp_id; 
select @tmp_id:=min(id) from tmp_tables; 
end while;*/ 
select * from tmp_tables; 
drop temporary table tmp_tables; 
end

/*--------------저장 프로세스 2, 대응하는 테이블 정보 꺼내기 --------------------*/

/*author:henry
  procedure name:sys_tables
  create_date:20091023
*/
create procedure sys_tables_fmt(in tablename varchar(20))
begin
/*set @str=concat("select column_name from ",tablename)*/
/*     #table_field(id,fieldname)*/
drop table if exists table_field;
create temporary table  table_field
(
	`id` int not null,
	`fieldname` varchar(40) not null,
	`datatype` varchar(20) not null
);
set @rowno=0;
set @str=concat("insert table_field(id,fieldname,datatype) select ordinal_position as rowno,column_name,data_type from information_schema.columns where table_schema='wobuild' and table_name='",tablename);
set @str=concat(@str,"'");
prepare stmt1 from @str;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

select * from table_field;
drop temporary table table_field;

end

/*--------------------jdbc에서 호출된 -----------------*/
테스트할 때 여러 결과 집합의 값을 확정할 수 없기 때문에 이 두 개의 저장 프로세스로 나누어 처리했습니다.
java 백엔드 코드, 주요 매개 변수는 schemaobj="testbase";:물론 동적 매개 변수로 전송할 수도 있다.
package com.woBuild.dataBaseDao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class TestDao {
	public static ArrayList selectDown() {
        ArrayList lise = new ArrayList();
        Connection con = null;
        //PreparedStatement s = null;
        ResultSet rs_par = null;
        ResultSet rs_chi = null;
        CallableStatement cstmpar=null;
        CallableStatement cstmchi=null;
        con = DataBaseConnection.createConnection();
        String rel="";
        String bean_obj="";
        String schema_obj="testbase";
        try {
        	String PROC_EXEC_SQL_PAR="{CALL sys_tables(?)}" ;
        	cstmpar = con.prepareCall(PROC_EXEC_SQL_PAR); 
        	cstmpar.setString(1,schema_obj); 
        	rs_par = cstmpar.executeQuery();
        	while(rs_par.next()){
        	      String tablename=rs_par.getString("tablename").trim();
        	      bean_obj=tablename;
        	      String tabletype=rs_par.getString("tabletype").trim();
        	      if(tabletype.equals("BASE TABLE")){
        	    	  String PROC_EXEC_SQL_CHI="{CALL sys_tables_fmt(?)}" ;
        	    	  cstmchi = con.prepareCall(PROC_EXEC_SQL_CHI); 
        	    	  cstmchi.setString(1,bean_obj); 
        	          rs_chi = cstmchi.executeQuery();
        	          while(rs_chi.next()){ 
                	      String datatype=rs_chi.getString("datatype").trim();
                	      String fieldname=rs_chi.getString("fieldname").trim();
                	      if(datatype.equals("varchar")||datatype.equals("char")||datatype.equals("datetime")){
                	    	  rel+="String "+fieldname+"=rs.getString(\""+fieldname+"\");
"; } else if(datatype.equals("int")){ rel+="Integer "+fieldname+"=rs.getInt(\""+fieldname+"\");
"; } } rs_chi.beforeFirst(); while(rs_chi.next()){ String fieldname=rs_chi.getString("fieldname").trim(); String fieldnameTmp=fieldname.substring(0, 1).toUpperCase()+fieldname.substring(1, fieldname.length()); rel+=bean_obj+".set"+fieldnameTmp+"("+fieldname+")
"; } System.out.println(rel); rel=""; } } } catch (SQLException ex1) { ex1.printStackTrace(); } finally { try { cstmpar.close(); cstmchi.close(); rs_par.close(); rs_chi.close(); con.close(); } catch (SQLException e) { e.printStackTrace(); } } return lise; } public static void main(String[] args){ List li=TestDao.selectDown(); } }

/*------------------데이터베이스 연결은 쓰지 않습니다-----------------*/
실행된 결과는 데이터베이스에 대응하는 setXXX, 그리고 getXXX를 생성하는 것이다. 이를 통해 확장을 발휘할 수 있다. 서로 다른 데이터베이스 자바 코드는 움직이지 않고 해당하는 저장 과정을 바꾸면 된다. 우리는 이 확장을 통해 우리가 원하는 bean과 대응하는save(),query(),update()를 자동으로 생성할 수 있다. 여기서 군말하지 않는다.
간단히 말하자면 나는hibernate를 좋아하지 않기 때문에hibernate를 좋아하지 않는 사람도 대들어라

좋은 웹페이지 즐겨찾기