mysql의 동적 sql 응용 프로그램
/*--------------저장 프로세스 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를 좋아하지 않는 사람도 대들어라
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
깊이 중첩된 객체를 정확히 일치 검색 - PostgreSQL목차 * 🚀 * 🎯 * 🏁 * 🙏 JSON 객체 예시 따라서 우리의 현재 목표는 "고용주"사용자가 입력한 검색어(이 경우에는 '요리')를 얻고 이 용어와 정확히 일치하는 모든 사용자 프로필을 찾는 것입니다. 즐거운 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.