1. 程式人生 > >java Mysql的跨伺服器不同表結構的聯合查詢,兩不同伺服器上的不同表查詢

java Mysql的跨伺服器不同表結構的聯合查詢,兩不同伺服器上的不同表查詢

由於業務的需要,需要從兩個資料庫中取得資料,伺服器A儲存有角色使用者配置表和角色表,伺服器B有使用者表和公司表。先不管架構為什麼要這樣設計資料表,因為確實有這樣的需求,但是這確實是一個令人頭疼的事情,但是還是要面帶微笑~

解決思路一:

在資料庫中聯合不同資料庫的表中的DDL中加入

CONNECTION='mysql://root:[email protected]:3306/test/app1
但是很遺憾的是這個需要兩個表的表結構要一樣,這裡需要的四張表的結構都是不一樣的。。。。

解決思路二:

只能在java中把兩個資料的結果把他取出來,然後自己手工遍歷結果集,將他們拼接在一起,雖然這樣不便於重用,但是能解決迫在眉睫的問題啊,唉~

java怎麼在Servlet操作多個mysql資料庫詳細請看

下面是具體的java程式碼:

	/**
	 * 需要聯表查詢,jlp的角色和角色使用者配置,mdb的使用者和公司
	 * @return 返回DTO的json物件的資料
	 * @throws Exception 
	 */
	public BackData byTableAndDataToMdb() throws Exception {
		Connection conJ=new DbConnect("A").getConnect();//取得jlp資料庫連結
		Connection conM=new DbConnect("B").getConnect();//取得mdb資料庫連結
		try{
			//A資料庫的使用者角色配置和角色表的聯合查詢
			String conSql="SELECT a.`UserId`,b.* FROM `UserRolesConfig` AS a LEFT JOIN `Roles` AS b ON a.`RoleId`=b.`RoleId`";
			//查詢B資料庫使用者表
			String userSql="SELECT Staff_Id,Staff_Name,Staff_No  FROM `User`";
			//查詢B資料庫公司表
			String corSql="SELECT CorpId,CorpName,CorpType FROM `crop`";			
			//獲取資料庫結果集
			PreparedStatement preCon	=	conJ.prepareStatement(conSql);
			PreparedStatement preUser	=	conM.prepareStatement(userSql);
			PreparedStatement preCor	=	conM.prepareStatement(corSql);
			
			ResultSet rsCon				=	preCon.executeQuery();
			ResultSet rsUser			=	preUser.executeQuery();
			ResultSet rsCor				=	preCor.executeQuery();
			
			//獲取結果集的Map集合
			Map<String,String> mapUser	=	getMapByResultSet(rsUser);
			Map<String,String> mapCro	=	getMapByResultSet(rsCor);
			
			//便利返回結果
			ResultSetMetaData md = rsCon.getMetaData();//獲取鍵名
			int count = md.getColumnCount();//獲取行的數量
			String back="";
			while (rsCon.next()) {
				back+="{";
				for(int i=1;i<=count;i++){	
					if(md.getColumnName(i).equals("UserId")){
						back+="\""+md.getColumnName(i)+"\":\""+rsCon.getString(i)+"\","
								+(mapUser.get(rsCon.getString(i))==null?mapUser.get("null"):mapUser.get(rsCon.getString(i)));
					}else if(md.getColumnName(i).equals("CorpId")){
						back+="\""+md.getColumnName(i)+"\":\""+rsCon.getString(i)+"\","
								+(mapCro.get(rsCon.getString(i))==null?mapCro.get("null"):mapCro.get(rsCon.getString(i)));;
					}else{
						back+="\""+md.getColumnName(i)+"\":\""+rsCon.getString(i)+"\"";
					}
					if(i!=count){
						back+=",";
					}
				}
				back+="},";
			}
			if(back.equals("")){
				return new BackData(false,null, "查詢為空!");
			}else{
				return new BackData(true,"["+back.substring(0, back.length()-1)+"]",null);
			}	
		}catch(Exception e){
			e.printStackTrace();
			throw new Exception("資料格式錯誤:"+e.getMessage());
			
		}finally{
			//關閉資料庫連線
			try {
				conJ.close();
				conM.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	/**
	 * 根據結果集便利資料返回Map集合
	 * @param rs 資料庫查詢結果集
	 * @return 執行成功返回Map集合,否則丟擲一個異常
	 * @throws Exception
	 */
	public Map<String,String> getMapByResultSet(ResultSet rs)throws Exception{		
		Map<String,String> map=new HashMap<String, String>();		
		ResultSetMetaData md = rs.getMetaData();//獲取鍵名
		int count = md.getColumnCount();//獲取行的數量		
		while (rs.next()) {
			String key=rs.getString(1);
			String value="";
			//便利id以外的資料
			for(int i=2;i<=count;i++){				
				value+="\""+md.getColumnName(i)+"\":\""+rs.getString(i)+"\"";
				if(i!=count){
					value+=",";
				}
			}
			map.put(key, value);	
		}
		//提供沒有值的null
		String key="null";
		String value="";
		for(int i=2;i<=count;i++){				
			value+="\""+md.getColumnName(i)+"\":\"\"";
			if(i!=count){
				value+=",";
			}
		}
		map.put(key, value);
		
		return map;
	}

執行結果:



相關推薦

java Mysql伺服器不同結構聯合查詢不同伺服器不同查詢

由於業務的需要,需要從兩個資料庫中取得資料,伺服器A儲存有角色使用者配置表和角色表,伺服器B有使用者表和公司表。先不管架構為什麼要這樣設計資料表,因為確實有這樣的需求,但是這確實是一個令人頭疼的事情,但是還是要面帶微笑~ 解決思路一: 在資料庫中聯合不同資料庫的表中的DDL

mysql 復制結構 / 從結果中導入數據到新

ica 數據 cal null type records ted fault set 這只會復制結構: mysql> create table a like mysql1; Query OK, 0 rows affected (0.03 sec) mysql>

Mysql結構匯入 Powerdesigner 並將註釋作為 name 列

步驟一: 安裝MYSQL的ODBC驅動 Connector/ODBC 5.1.10 下載地址: 選擇win-32 MIS安裝包,進行直接安裝就可以了。 步驟二: 配置OBDC驅動連線 步驟三:  開啟PowerDesigner : 1)檔案->新建

二級考試MySQL數據庫怎麽用?mysql拷貝數據庫庫文件復制還原後顯示不存在怎麽辦

adb 輸入 顯示 怎麽辦 config 錯誤提示 當我 不同的 虛擬 問題環境,最近準備mysql考試,用的 **教育的題庫,做操作題的時候發現把題庫給的數據庫文件復制data目錄,能顯示表,但是不能操作表 1 查看mysql存放數據庫文件的目錄

HBASE介紹HBASE的特點結構邏輯檢視RowKey列簇時間戳Cell

HBASE資料庫介紹,HBASE的特點,表結構邏輯檢視,RowKey,列簇,時間戳,Cell HBASE資料庫 1. Hbase基礎 1.1 hbase資料庫介紹 1、簡介nosql hbase是bigtable的開源java版本。是建立在hdfs之上,提供高可靠性、高效能、列儲

java常見的邏輯練習題有1234 四個數能組成多少個不同且無重複數字的三位數 並且是多少?

題目:有1234 四個數,能組成多少個不同且無重複數字的三位數 ,並且是多少? 分析:首先題目要求的是組成三位數,所以我們可以先將所有的三位數拿出來,用for迴圈遍歷所有三位數,即: 第一步 for (int i = 100; i <= 999; i++)

Sqlite結構讀取工具word批量轉html線上雲剪貼簿檔案批量提取工具;

工欲善其事必先利其器,本週為您推薦工具排行 Sqlite表結構讀取工具,word批量轉html,線上雲剪貼簿,檔案批量提取工具;     本週我們又要發乾貨了,準備好接受了嗎? 為什麼是乾貨,就是因為不是水貨,因為幹了,所以是乾貨,也就是實打實的。當然哈

mysql 把一張的某列更新到另外一張

mysql 把一張表的某列,更新到另外一張表 由於第二張表的列出來的是集合,但是我們只需要集合的第一條記錄 1、先把需要的列和對應關係導到另外臨時表中 create table tmp1 as select a.SCWXDID,a.wxff from wz_scwxd_sub a;

Informix資料結構分析資料整理之欄位型別說明和查詢SQL語句

查詢所有Informix資料表字段型別SQL語句: select a.tabname,b.colname,b.coltype,case   b.coltype when '0' then 'CHAR' when '1' then 'SMALLINT' when '2' the

JAVA逐行讀取指定檔案中的內容每行中的不同內容用任意個空格分開。

檔案中的內容格式為(中間可以用任意個空格隔開):1         張三       品德優良a         JACK       SMArtpackage ReadFileLine;/*Readline類儲存檔案中每行中不同模組的資訊,並以類似指標的方式儲存每一行*/p

【097】Nginx實現一臺伺服器個域名釋出不同的前端專案並且個域名都用80埠。

有時候你可能需要在一個伺服器上,用 nginx 釋出兩個前端專案。並且這兩個前端專案使用不同的域名,域名都繫結80埠。本文說明此場景下的操作過程。Nginx使用的是 Docker 官方映象。本文依據的作業系統是 Linux Centos7.3 。 假設 you

一個鏈中包含環請找出該鏈的環的入口結點

size alt 情況 每次 png -1 節點 pan mage 方法一、用HashSet來解決 1 public ListNode EntryNodeOfLoop(ListNode pHead){ 2 HashSet<ListNode> h

單提交前判斷webuploader是否

time inpu urn success pre load click nbsp ces function busUpLoadImg(postUrl,id) { .......//省略部分不用修改   uploader.on(‘uploadSuccess‘, f

如果在一個標簽類並用css樣式中引用時個類必須寫在一起不能有空格。

nbsp clas div 樣式表 ext style borde 引用 order 例: <html>   <style type="text/css">     .mui-table-view-cell.mui-collapse{      bo

專案近半名已經確認現在需要引用其他資料庫用同義詞

前提:  專案近半,表名已經確認,現在需要引用其他資料庫表,用同義詞 1.建立dblink 當用戶要跨本地資料庫,訪問另外一個數據庫表中的資料時,本地資料庫中必須建立了遠端資料庫的dblink,通過dblink本地資料庫可以像訪問本地資料庫一樣訪問遠端資料庫表中的資料。 c

No.20程式碼練習:求二進位制1的個數二進位制奇偶位輸出整數每一位個數二進位制中不同位的位數

學習不易,需要堅持。 寫一個函式返回引數二進位制中 1 的個數 比如: 15 0000 1111 4 個 1 程式原型: int count_one_bits(unsigned int value) { // 返回 1的位數 }

個陣列提取相同元素個陣列提取不同元素

兩個陣列提取相同元素 const getArrEqual = (arr1, arr2) => { let newArr = []; for (let i = 0; i < arr2.length; i++) { for (let j = 0; j <

flask 伺服器上面下載多個檔案 客戶端一次性傳多個檔案

  #encoding=utf8 import flask,os,sys,time from flask import request,send_from_directory import multiEmbeddings  import tensorflow as tf &n

基於tk.mybatis:mapper實現的通用多查詢更新操作及傳jar到maven中心倉庫(一)

一、前言    本人使用mybatis也有些年頭了。對於mybatis的使用也有點個人的心得。個人感覺mybatis在使用起來比hibernate方便且輕量級,這也是我喜歡使用mybatis的原因之一。但是每次在過了一段時間之後就會出現mybatis的xml檔案裡面的sql語

TP5 Join連結串列查詢有相同欄位會被覆蓋問題

一:可以定義需要哪張表的欄位 用別名。 //Join 連結串列查詢如果兩表中有相同的欄位,需要標明查詢哪個表中的欄位可以用別名 $data=Db::name('article')->alias('a') ->join('item i','a.itemid