SetRootId.java 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package cn.com.qmth.export;
  2. import java.io.IOException;
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import java.sql.SQLException;
  8. import java.util.ArrayList;
  9. import java.util.HashMap;
  10. import java.util.List;
  11. import java.util.Map;
  12. public class SetRootId {
  13. public static void main(String[] args) {
  14. System.out.println("开始处理");
  15. Connection connect = null;
  16. try {
  17. Class.forName("com.mysql.cj.jdbc.Driver");
  18. String url = "jdbc:mysql://localhost:3306/"+Param.dbName+"?serverTimezone=GMT%2B8";
  19. String user = Param.dbUser;
  20. String password = Param.dbPass;
  21. connect = DriverManager.getConnection(url, user, password);
  22. List<Knowledge> ks=getKnowledge(connect);
  23. setRootId(ks);
  24. if (ks.size() <= 1000) {
  25. updateKnowledge(connect, ks);
  26. System.out.println("处理:1");
  27. } else {
  28. int size = ks.size();
  29. int len = 1000;
  30. int count = (size + len - 1) / len;
  31. for (int i = 0; i < count; i++) {
  32. List<Knowledge> subList = ks.subList(i * len, ((i + 1) * len > size ? size : len * (i + 1)));
  33. updateKnowledge(connect, subList);
  34. System.out.println("处理:"+(i+1)+"/"+count);
  35. }
  36. }
  37. } catch (Exception e) {
  38. throw new RuntimeException(e);
  39. } finally {
  40. if (connect != null) {
  41. try {
  42. connect.close();
  43. } catch (SQLException e) {
  44. }
  45. }
  46. System.out.println("结束处理");
  47. }
  48. }
  49. private static void updateKnowledge(Connection connect,List<Knowledge> ks) throws SQLException, IOException {
  50. PreparedStatement preState = null;
  51. try {
  52. String sql = "update wq_knowledge_system set root_id=? where id=?";
  53. preState = connect.prepareStatement(sql);
  54. for(Knowledge k:ks) {
  55. preState.setLong(1, k.getRootId());
  56. preState.setLong(2, k.getId());
  57. preState.addBatch();
  58. }
  59. preState.executeBatch();
  60. } finally {
  61. if (preState != null) {
  62. preState.close();
  63. }
  64. }
  65. }
  66. private static void setRootId(List<Knowledge> ks) {
  67. Map<Long,Knowledge> map=new HashMap<>();
  68. for(Knowledge k:ks) {
  69. map.put(k.getId(), k);
  70. }
  71. for(Knowledge k:ks) {
  72. getAndSetRootId(map, k);
  73. }
  74. }
  75. private static void getAndSetRootId(Map<Long,Knowledge> map,Knowledge k) {
  76. if(k.getParentId()==0) {
  77. k.setRootId(k.getId());
  78. }else {
  79. Knowledge pk=map.get(k.getParentId());
  80. getAndSetRootId(map, pk);
  81. k.setRootId(pk.getRootId());
  82. }
  83. }
  84. private static List<Knowledge> getKnowledge(Connection connect) throws SQLException, IOException {
  85. List<Knowledge> as = new ArrayList<>();
  86. PreparedStatement preState = null;
  87. ResultSet resultSet = null;
  88. try {
  89. String sql = "select id,parent_id,root_id from wq_knowledge_system order by parent_id,id";
  90. preState = connect.prepareStatement(sql);
  91. resultSet = preState.executeQuery();
  92. while (resultSet.next()) {
  93. Knowledge a = new Knowledge();
  94. a.setId(resultSet.getLong("id"));
  95. a.setParentId(resultSet.getLong("parent_id"));
  96. as.add(a);
  97. }
  98. return as;
  99. } finally {
  100. if (resultSet != null) {
  101. resultSet.close();
  102. }
  103. if (preState != null) {
  104. preState.close();
  105. }
  106. }
  107. }
  108. }