由於業務的需要,需要從兩個數據庫中取得數據,服務器A保存有角色用戶配置表和角色表,服務器B有用戶表和公司表。先不管架構爲什麼要這樣設計數據表,因爲確實有這樣的需求,但是這確實是一個令人頭疼的事情,但是還是要面帶微笑~
解決思路一:
在數據庫中聯合不同數據庫的表中的DDL中加入
CONNECTION='mysql://root:[email protected]:3306/test/app1
但是很遺憾的是這個需要兩個表的表結構要一樣,這裏需要的四張表的結構都是不一樣的。。。。
解決思路二:
只能在java中把兩個數據的結果把他取出來,然後自己手工遍歷結果集,將他們拼接在一起,雖然這樣不便於重用,但是能解決迫在眉睫的問題啊,唉~
java怎麼在Servlet操作多個mysql數據庫詳細請看
http://blog.csdn.net/weixin_36751895/article/details/70313491
下面是具體的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;
}
運行結果: