jacob Oacle 데이터 사전 구현

13053 단어 OaclesqljdbcExcel
jacob:Java COM Bridge  자바 와 com 구성 요소 간 의 교량
 
현재 최신 버 전 은 1.14 입 니 다.
 
  http://nchc.dl.sourceforge.net/sourceforge/jacob-project/jacob-1.14.3.zip jacob 를 조작 할 때 흔히 볼 수 있 는 문제 2 개 를 만 났 습 니 다.
1. 다음 오류 가 발생 하면   com.jacob.com.ComFailException: A COM exception has been encountered:    At Invoke of: Version    Description: An unknown COM error has occured.    dll 버 전이 틀 렸 음 을 나타 내 며 최신 버 전 으로 바 꾸 면 됩 니 다.2. 다음 오류 가 발생 하면    java.lang.UnsatisfiedLinkError: no jacob in java.library.path    dll 을 path 아래 에 놓 으 면 됩 니 다. path 를 설정 하거나 window / system 32 아래 에 놓 으 면 됩 니 다.
 
이상 은 jacob 에 대한 기본 적 인 소개 입 니 다.
 
다음은 Oacle 의 일부 조회 작업 과 jacob 의 결합 으로 데이터 사전 을 자동 으로 생 성 합 니 다.
 
디자인 에 있어 서 가능 한 한 결합 을 풀 려 고 하 는데, 일부 부분 이 여전히 우연히 합 쳐 져 있 는 것 을 발견 하 였 다.
 
맨 먼저
기본 데이터 클래스
package com.linpyi.databasedictionary;

public class DataBaseInfo {
	private String column_Name;//    
	private String data_type;//    
	private String data_length;//    
	private String data_null;//      
	private String data_comments;//    
	public String getColumn_Name() {
		return column_Name;
	}
	public void setColumn_Name(String column_Name) {
		this.column_Name = column_Name;
	}
	public String getData_type() {
		return data_type;
	}
	public void setData_type(String data_type) {
		this.data_type = data_type;
	}
	public String getData_length() {
		return data_length;
	}
	public void setData_length(String data_length) {
		this.data_length = data_length;
	}
	public String getData_null() {
		return data_null;
	}
	public void setData_null(String data_null) {
		this.data_null = data_null;
	}
	public String getData_comments() {
		return data_comments;
	}
	public void setData_comments(String data_comments) {
		this.data_comments = data_comments;
	}
	public String toString(){
		return ""+column_Name+"\r"+data_type+"\r"+data_length+"\r"+data_null+"\r"+data_comments+"
"; } }

 
 
데이터 인터페이스 쓰기
package com.linpyi.databasedictionary;

import java.util.Map;

public interface DataBaseOperate {

	@SuppressWarnings("unchecked")
	public Map dealDataBase();
}

 
Oacle 데이터 베 이 스 를 작성 하여 데이터 인 터 페 이 스 를 실현 합 니 다. 나중에 다른 데이터 베이스 가 있 으 면 이 인 터 페 이 스 를 사용 할 수 있 습 니 다.
package com.linpyi.databasedictionary;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 *   oracle    
 *      oracle            map 
 * @author lpy 
 *
 */
public class DataBaseDictionaryOperateOracle implements DataBaseOperate {

	private Statement stmt = null;
	private ResultSet rs = null;
	private Connection con = null;

	// private FileOutputStream fileOut = null;

	@SuppressWarnings("unchecked")
	public Map dealDataBase(){

		// TODO Auto-generated method stub
		try {
			Class.forName(DataBasicInfo.dataDriver);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		try {
			con = DriverManager.getConnection(DataBasicInfo.dataUrl,
					DataBasicInfo.userName, DataBasicInfo.userPwd);
			stmt = con.createStatement();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		StringBuffer strbuf = new StringBuffer();
		strbuf.append("SELECT A.*,B.comments");
		strbuf.append(" FROM all_tab_columns A,DBA_COL_COMMENTS B");
		strbuf.append(" WHERE A.owner=B.owner");
		strbuf.append(" AND A.table_name=B.table_name");
		strbuf.append(" AND A.COLUMN_NAME=B.COLUMN_NAME");
		// owner        
		strbuf.append(" AND A.owner='" + DataBasicInfo.dataName + "'");
		strbuf.append(" ORDER BY A.TABLE_NAME");
		System.out.println(strbuf.toString());
		Map map = new HashMap<String, ArrayList>();
		try {
			rs = stmt.executeQuery(strbuf.toString());
			String tb = "";
			ArrayList list = null;
			while (rs.next()) {
				//           sheet,      
				String line = "";
				String tablename = rs.getString("TABLE_NAME");
				//  tablename         ,          ,     list
				if (!tb.equals(rs.getString("TABLE_NAME"))) {
					list = new ArrayList();
					DataBaseInfo databaseInfoHead = new DataBaseInfo();
					databaseInfoHead.setColumn_Name("   ");
					databaseInfoHead.setData_type("    ");
					databaseInfoHead.setData_length("    ");
					databaseInfoHead.setData_null("    ");
					databaseInfoHead.setData_comments("    ");
					list.add(databaseInfoHead);
				} else {
					if (tb.length() > 0) {
						map.put(tb, list);//         , list  map
					}
				}
				DataBaseInfo databaseInfo = new DataBaseInfo();
				databaseInfo.setColumn_Name(rs.getString("COLUMN_NAME"));
				databaseInfo.setData_comments(rs.getString("COMMENTS"));
				databaseInfo.setData_null(rs.getString("NULLABLE"));
				String type = rs.getString("DATA_TYPE");
				databaseInfo.setData_type(type);

				String data_length = "";
				if (!type.equals("NUMBER")) {
					data_length = rs.getString("DATA_LENGTH") + "\t";
				} else {
					String scale = rs.getString("DATA_SCALE");
					if (scale == "null")
						scale = "";
					else
						scale = "," + scale;
					data_length = rs.getString("DATA_PRECISION") + scale + "\t";
				}

				databaseInfo.setData_length(data_length);
				list.add(databaseInfo);
				tb = tablename;
			}

			map.put(tb, list);//       

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				stmt.close();
				con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

		return map;
	}


}

 
jacob 인 터 페 이 스 를 실현 하여 나중에 다른 확장 을 편리 하 게 합 니 다.
public interface JacobOperate {
	public void operate();
}

 jacob 는 워드 를 사용 하여 위의 인 터 페 이 스 를 실현 하고 나중에 엑셀 또는 html 로 바 꿀 수 있 습 니 다.
package com.linpyi.databasedictionary;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

/**
 * jacob     word   
 * @author lpy
 *
 */
public class JacobWordOperate implements JacobOperate {

	private DataBaseOperate dataBaseOperate;

	public JacobWordOperate(DataBaseOperate dataBaseOperate) {
		this.dataBaseOperate = dataBaseOperate;
	}

	@SuppressWarnings("unchecked")
	public void operate() {
		// TODO Auto-generated method stub
		Map map = null;

		map = dataBaseOperate.dealDataBase();

		System.out.println("  ="+map.size());
		ActiveXComponent wordApp = new ActiveXComponent("Word.Application"); //   word
		Dispatch.put(wordApp, "Visible", new Variant(true));// //  word  
		Dispatch docs = wordApp.getProperty("Documents").toDispatch();
		Dispatch document = Dispatch.call(docs, "Add").toDispatch();// create
		Dispatch selection = Dispatch.get(wordApp, "Selection").toDispatch();
		Dispatch align = Dispatch.get(selection, "ParagraphFormat")
				.toDispatch(); //           
		Dispatch font = Dispatch.get(selection, "Font").toDispatch(); //           
		//     ////////////////////////
//		Dispatch.put(align, "Alignment", "1"); // 1:   2:   3:  
//		Dispatch.put(font, "Bold", "1"); //     
//		Dispatch.put(font, "Color", "1,0,0,0"); //       
//		Dispatch.call(selection, "TypeText", "Word    "); //       
		//     ////////////////////////
		Dispatch tables = Dispatch.get(document, "Tables").toDispatch();
		
		Iterator ito = map.keySet().iterator();
		int k=1;
		while (ito.hasNext()) {
			Dispatch.put(align, "Alignment", "3"); // 1:   2:   3:  
			Dispatch.put(font, "Bold", "1"); //     
			Dispatch.put(font, "Color", "1,0,0,0"); //       
			String tableName = (String) ito.next();//        
			Dispatch.call(selection, "TypeText", "table name:"+tableName); //       
			ArrayList list = (ArrayList) map.get(tableName);//             
			Dispatch range = Dispatch.get(selection, "Range").toDispatch();
			Dispatch table1 = Dispatch.call(tables, "Add", range, list.size(),
					new Variant(5), new Variant(1)).toDispatch(); //     ,  ,      
			Dispatch t1 = Dispatch.call(tables, "Item", k)//     ,       ,             (k   )
			.toDispatch();
			k++;
			for (int i = 1; i <= list.size(); i++) {
				//         
				Dispatch.call(Dispatch.get(t1, "columns").toDispatch(), "AutoFit");//     
				DataBaseInfo info = (DataBaseInfo) list.get(i-1);
				Dispatch cell = Dispatch.call(t1, "Cell", new Variant(i),
						new Variant(1)).toDispatch();//  , 				
				Dispatch.call(cell, "Select");
				Dispatch.put(selection, "Text", info.getColumn_Name()); //   word   
				Dispatch.put(font, "Bold", "0"); //     (1:   0:    )
				Dispatch.put(font, "Color", "1,1,1,0"); //     
				Dispatch.put(font, "Italic", "1"); //    1:   0:    


				Dispatch cell1 = Dispatch.call(t1, "Cell", new Variant(i),
						new Variant(2)).toDispatch();//  , 
				Dispatch.call(cell1, "Select");
				Dispatch.put(selection, "Text", info.getData_type()); //   word   
				Dispatch.put(font, "Bold", "0"); //     (1:   0:    )
				Dispatch.put(font, "Color", "1,1,1,0"); //     
				Dispatch.put(font, "Italic", "1"); //    1:   0:    
				Dispatch range1 = Dispatch.get(cell1, "Range").toDispatch();


				Dispatch cell2 = Dispatch.call(t1, "Cell", new Variant(i),
						new Variant(3)).toDispatch();//  , 
				Dispatch.call(cell2, "Select");
				Dispatch.put(selection, "Text", info.getData_length()); //   word   
				Dispatch.put(font, "Bold", "0"); //     (1:   0:    )
				Dispatch.put(font, "Color", "1,1,1,0"); //     
				Dispatch.put(font, "Italic", "1"); //    1:   0:    

				Dispatch cell3 = Dispatch.call(t1, "Cell", new Variant(i),
						new Variant(4)).toDispatch();//  , 
				Dispatch.call(cell3, "Select");
				Dispatch.put(selection, "Text", info.getData_null()); //   word   
				Dispatch.put(font, "Bold", "0"); //     (1:   0:    )
				Dispatch.put(font, "Color", "1,1,1,0"); //     
				Dispatch.put(font, "Italic", "1"); //    1:   0:    


				Dispatch cell4 = Dispatch.call(t1, "Cell", new Variant(i),
						new Variant(5)).toDispatch();//  , 
				Dispatch.call(cell4, "Select");
				Dispatch.put(selection, "Text", info.getData_comments()); //   word   
				Dispatch.put(font, "Bold", "0"); //     (1:   0:    )
				Dispatch.put(font, "Color", "1,1,1,0"); //     
				Dispatch.put(font, "Italic", "1"); //    1:   0:    
//				Dispatch.put(font, "Underline", "1"); //    
				Dispatch.call(selection, "MoveDown"); //       (             )
			}			
			Dispatch.call(selection, "MoveDown"); //       (             )
		}

		//     ////////////////////////
		Dispatch.call(document, "SaveAs", DataBasicInfo.savaPath+DataBasicInfo.dataName+".doc");
	}

}

 
기본 정보 클래스 입 니 다. 여 기 는 정적 클래스 를 사용 하고 프로필 도 사용 할 수 있 습 니 다.
package com.linpyi.databasedictionary;

/**
 *      
 * @author lpy
 *
 */
public class DataBasicInfo {
	public static String dataDriver="oracle.jdbc.driver.OracleDriver";
	public static String dataUrl="jdbc:oracle:thin:@192.168.1.101:1521:ora";
	public static String userName="system";
	public static String userPwd="manager";
	public static String dataName="";
	public static String savaPath="d:/";
}

 
client
package com.linpyi.databasedictionary;

public class Client {
	public static void main(String args[]) {
		JacobOperate operate = new JacobWordOperate(
				new DataBaseDictionaryOperateOracle());
		operate.operate();
	}
}

 
 
사실은 jacob 를 빌려 서 워드 삽입 표를 만 들 었 습 니 다. 사실 표 에서 결합 을 풀 면 다음 에 설명 할 데 이 터 를 추가 합 니 다.
 
정 보 를 고 치 는 것 은 그리 번 거 롭 지 않 을 것 이다. 아마도 좀 더 설계 해 야 할 것 이다.
 
코드 는 더 최적화 할 수 있 을 것 이다.

좋은 웹페이지 즐겨찾기