您的位置:首页 > 编程语言 > Java开发

java Mysql的跨服务器不同表结构的联合查询,两不同服务器上的不同表查询

2017-04-22 10:00 281 查看
由于业务的需要,需要从两个数据库中取得数据,服务器A保存有角色用户配置表和角色表,服务器B有用户表和公司表。先不管架构为什么要这样设计数据表,因为确实有这样的需求,但是这确实是一个令人头疼的事情,但是还是要面带微笑~

解决思路一:

在数据库中联合不同数据库的表中的DDL中加入

CONNECTION='mysql://root:123456@127.0.0.1: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;
}

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java mysql