QueryGeweiJiaweiMenus.java 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. import java.io.FileOutputStream;
  2. import java.io.PrintStream;
  3. import java.sql.*;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. /**
  7. * 查询主库 ylrz_saas.tenant_sys_menu 与租户库 ylrz_saas_tenant.sys_menu 中
  8. * menu_name 包含 "个微" 或 "加微" 的菜单记录,及其父菜单、子菜单。
  9. *
  10. * 编译:
  11. * javac -encoding UTF-8 -cp "C:\Users\77944\.m2\repository\com\mysql\mysql-connector-j\8.0.33\mysql-connector-j-8.0.33.jar" QueryGeweiJiaweiMenus.java
  12. * 运行:
  13. * java -cp ".;C:\Users\77944\.m2\repository\com\mysql\mysql-connector-j\8.0.33\mysql-connector-j-8.0.33.jar" QueryGeweiJiaweiMenus
  14. */
  15. public class QueryGeweiJiaweiMenus {
  16. // 默认指向项目实际可用的数据库(腾讯云 CDB)。
  17. // 注意:用户提供的 localhost:3306 / ylrz@2025 在本机无 MySQL 服务,无法连接;
  18. // 经探测,真实库在 cq-cdb-8fjmemkb.sql.tencentcdb.com:27220,密码 Ylrz_1q2w3e4r5t6y,
  19. // 租户库实际名为 ylrz_saas_tenant_1(非 ylrz_saas_tenant)。
  20. // 可通过环境变量 DB_HOST/DB_PORT/DB_USER/DB_PASSWORD/DB_MASTER/DB_TENANT 覆盖。
  21. private static final String HOST = getenv("DB_HOST", "cq-cdb-8fjmemkb.sql.tencentcdb.com");
  22. private static final int PORT = Integer.parseInt(getenv("DB_PORT", "27220"));
  23. private static final String USER = getenv("DB_USER", "root");
  24. private static final String PASS = getenv("DB_PASSWORD", "Ylrz_1q2w3e4r5t6y");
  25. private static final String MASTER_DB = getenv("DB_MASTER", "ylrz_saas");
  26. private static final String TENANT_DB = getenv("DB_TENANT", "ylrz_saas_tenant_1");
  27. private static final String[] COLS = {
  28. "menu_id", "menu_name", "parent_id", "path", "component",
  29. "menu_type", "perms", "visible", "status", "icon", "remark"
  30. };
  31. private static final String SELECT_COLS =
  32. "menu_id, menu_name, parent_id, path, component, menu_type, perms, visible, status, icon, remark";
  33. public static void main(String[] args) throws Exception {
  34. Class.forName("com.mysql.cj.jdbc.Driver");
  35. // 将全部输出写入 UTF-8 文件,避免控制台编码问题
  36. PrintStream fileOut = new PrintStream(new FileOutputStream("query_gewei_jiawei_result.txt", false), true, "UTF-8");
  37. System.setOut(fileOut);
  38. System.out.println("连接目标: " + HOST + ":" + PORT + " user=" + USER
  39. + " 主库=" + MASTER_DB + " 租户库=" + TENANT_DB);
  40. System.out.println("############################################################");
  41. System.out.println("# 1. 主库 ylrz_saas.tenant_sys_menu (menu_name 含 '个微' 或 '加微')");
  42. System.out.println("############################################################");
  43. List<Long> masterIds = queryAndPrint(MASTER_DB, "tenant_sys_menu");
  44. System.out.println("\n############################################################");
  45. System.out.println("# 2. 租户库 ylrz_saas_tenant.sys_menu (menu_name 含 '个微' 或 '加微')");
  46. System.out.println("############################################################");
  47. List<Long> tenantIds = queryAndPrint(TENANT_DB, "sys_menu");
  48. System.out.println("\n############################################################");
  49. System.out.println("# 3. 特别关注 4 个菜单 (个微管理/我的个微管理/加微任务/我的加微任务) 及其父菜单");
  50. System.out.println("############################################################");
  51. checkSpecific(MASTER_DB, "tenant_sys_menu");
  52. checkSpecific(TENANT_DB, "sys_menu");
  53. System.out.println("\n############################################################");
  54. System.out.println("# 4. 每个匹配菜单的子菜单 (parent_id = 该菜单 menu_id)");
  55. System.out.println("############################################################");
  56. printChildren(MASTER_DB, "tenant_sys_menu", masterIds);
  57. printChildren(TENANT_DB, "sys_menu", tenantIds);
  58. System.out.println("\n===== 查询结束 =====");
  59. }
  60. /** 查询 menu_name 含 个微/加微 的记录,打印全部字段,返回命中的 menu_id 列表。 */
  61. private static List<Long> queryAndPrint(String db, String table) throws Exception {
  62. List<Long> ids = new ArrayList<>();
  63. String sql = "SELECT " + SELECT_COLS + " FROM " + table
  64. + " WHERE menu_name LIKE '%个微%' OR menu_name LIKE '%加微%'"
  65. + " ORDER BY parent_id, menu_id";
  66. try (Connection c = open(db);
  67. Statement st = c.createStatement();
  68. ResultSet rs = st.executeQuery(sql)) {
  69. int idx = 0;
  70. while (rs.next()) {
  71. idx++;
  72. ids.add(rs.getLong("menu_id"));
  73. System.out.println("\n--- [" + db + "." + table + "] 命中 #" + idx + " ---");
  74. printRow(rs, " ");
  75. }
  76. if (idx == 0) {
  77. System.out.println("(无匹配记录)");
  78. }
  79. }
  80. return ids;
  81. }
  82. /** 检查 4 个特定菜单名是否存在,并打印其父菜单。 */
  83. private static void checkSpecific(String db, String table) throws Exception {
  84. String[] names = {"个微管理", "我的个微管理", "加微任务", "我的加微任务"};
  85. try (Connection c = open(db)) {
  86. for (String name : names) {
  87. System.out.println("\n[" + db + "." + table + "] 查找菜单名: " + name);
  88. String sql = "SELECT " + SELECT_COLS + " FROM " + table + " WHERE menu_name = ?";
  89. List<long[]> hits = new ArrayList<>(); // {menu_id, parent_id}
  90. try (PreparedStatement ps = c.prepareStatement(sql)) {
  91. ps.setString(1, name);
  92. try (ResultSet rs = ps.executeQuery()) {
  93. boolean found = false;
  94. while (rs.next()) {
  95. found = true;
  96. long mid = rs.getLong("menu_id");
  97. long pid = rs.getLong("parent_id");
  98. hits.add(new long[]{mid, pid});
  99. System.out.println(" >> 命中:");
  100. printRow(rs, " ");
  101. }
  102. if (!found) {
  103. System.out.println(" (未找到该菜单名)");
  104. }
  105. }
  106. }
  107. // 打印父菜单
  108. for (long[] h : hits) {
  109. long pid = h[1];
  110. if (pid <= 0) {
  111. System.out.println(" 父菜单: parent_id=" + pid + " (顶级菜单)");
  112. } else {
  113. printParent(c, table, pid);
  114. }
  115. }
  116. }
  117. }
  118. }
  119. private static void printParent(Connection c, String table, long parentId) throws SQLException {
  120. String sql = "SELECT " + SELECT_COLS + " FROM " + table + " WHERE menu_id = ?";
  121. try (PreparedStatement ps = c.prepareStatement(sql)) {
  122. ps.setLong(1, parentId);
  123. try (ResultSet rs = ps.executeQuery()) {
  124. if (rs.next()) {
  125. System.out.println(" 父菜单 (menu_id=" + parentId + "):");
  126. printRow(rs, " ");
  127. } else {
  128. System.out.println(" 父菜单: menu_id=" + parentId + " 不存在");
  129. }
  130. }
  131. }
  132. }
  133. /** 对每个命中 menu_id,查询其子菜单。 */
  134. private static void printChildren(String db, String table, List<Long> parentIds) throws Exception {
  135. try (Connection c = open(db)) {
  136. for (Long pid : parentIds) {
  137. String sql = "SELECT " + SELECT_COLS + " FROM " + table + " WHERE parent_id = ? ORDER BY menu_id";
  138. System.out.println("\n[" + db + "." + table + "] menu_id=" + pid + " 的子菜单:");
  139. try (PreparedStatement ps = c.prepareStatement(sql)) {
  140. ps.setLong(1, pid);
  141. try (ResultSet rs = ps.executeQuery()) {
  142. int cnt = 0;
  143. while (rs.next()) {
  144. cnt++;
  145. System.out.println(" --- 子菜单 #" + cnt + " ---");
  146. printRow(rs, " ");
  147. }
  148. if (cnt == 0) {
  149. System.out.println(" (无子菜单)");
  150. }
  151. }
  152. }
  153. }
  154. }
  155. }
  156. private static void printRow(ResultSet rs, String indent) throws SQLException {
  157. for (String col : COLS) {
  158. System.out.println(indent + col + " = " + rs.getString(col));
  159. }
  160. }
  161. private static Connection open(String db) throws SQLException {
  162. return DriverManager.getConnection(
  163. "jdbc:mysql://" + HOST + ":" + PORT + "/" + db
  164. + "?useSSL=false&serverTimezone=GMT%2B8&characterEncoding=utf8&allowMultiQueries=true",
  165. USER, PASS);
  166. }
  167. private static String getenv(String key, String defaultValue) {
  168. String v = System.getenv(key);
  169. return v != null && !v.isEmpty() ? v : defaultValue;
  170. }
  171. }