java Mysql的跨服务器不同表结构的联合查询,两不同服务器上的不同表查询
2017-04-22 10:00
281 查看
由于业务的需要,需要从两个数据库中取得数据,服务器A保存有角色用户配置表和角色表,服务器B有用户表和公司表。先不管架构为什么要这样设计数据表,因为确实有这样的需求,但是这确实是一个令人头疼的事情,但是还是要面带微笑~
解决思路一:
在数据库中联合不同数据库的表中的DDL中加入
解决思路二:
只能在java中把两个数据的结果把他取出来,然后自己手工遍历结果集,将他们拼接在一起,虽然这样不便于重用,但是能解决迫在眉睫的问题啊,唉~
java怎么在Servlet操作多个mysql数据库详细请看
http://blog.csdn.net/weixin_36751895/article/details/70313491
下面是具体的java代码:
运行结果:
解决思路一:
在数据库中联合不同数据库的表中的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; }
运行结果:
相关文章推荐
- 两不同服务器上的mysql跨库查询
- 一台MySql服务器不同数据库之间数据同步_解决方案(Java)
- JAVA连接MYSQL通过查询返回的结果集获取表结构字段类型
- mysql 多张表联合查询、一个字段 结构相同
- Sql 不同服务器之间查询表与插入表结构
- MYSQl left join 联合查询效率分析
- MYSQl left join联合查询效率分析
- 四、优化数据库,将不同功能的表分别建立在不同的库中,尽量避免表的联合查询,重视索引
- mysql 树形结构查询(存储过程)
- JAVA连接MYSQL,查询 ,添加,删除,语句
- MySQL的一个一条SQL语句查询所有不同种类产品的一部分结果实例的SQL语句
- JAVA 不同区域服务器引起的乱码解决
- MySQL 联合查询
- MySQL 表结构查询
- MYSQL的联合查询问题,难呀。。。。。
- 一个简单的Mysql的联合查询列子
- 编写一个Java应用程序,直接查询自己主机的IP地址和Internet上的某个www服务器地址
- JAVA连接MYSQL,查询 ,添加,删除,语句
- 通过java查询数据库表结构
- windws下mysql客户端登陆服务器选用字符集的不同造成的语句执行效果不正确