SetLevel.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. import cn.com.qmth.export.bean.Knowledge;
  13. import cn.com.qmth.export.bean.Param;
  14. public class SetLevel {
  15. public static void main(String[] args) {
  16. System.out.println("开始处理");
  17. Connection connect = null;
  18. try {
  19. Class.forName("com.mysql.cj.jdbc.Driver");
  20. String url = "jdbc:mysql://localhost:3306/" + Param.dbName + "?serverTimezone=GMT%2B8";
  21. connect = DriverManager.getConnection(url, Param.dbUser, Param.dbPass);
  22. List<Knowledge> ks = getKnowledge(connect);
  23. setLevel(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 mdl_question_categories set level=? where id=?";
  53. preState = connect.prepareStatement(sql);
  54. for (Knowledge k : ks) {
  55. preState.setInt(1, k.getLevel());
  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 setLevel(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. getAndSetLevel(map, k);
  73. }
  74. }
  75. private static void getAndSetLevel(Map<Long, Knowledge> map, Knowledge k) {
  76. if (k.getParentId() == 0) {
  77. k.setLevel(0);
  78. } else {
  79. Knowledge pk = map.get(k.getParentId());
  80. if (pk.getLevel() == null) {
  81. getAndSetLevel(map, pk);
  82. }
  83. k.setLevel(pk.getLevel() + 1);
  84. }
  85. }
  86. private static List<Knowledge> getKnowledge(Connection connect) throws SQLException, IOException {
  87. List<Knowledge> as = new ArrayList<>();
  88. PreparedStatement preState = null;
  89. ResultSet resultSet = null;
  90. try {
  91. String sql = "select id,parent from mdl_question_categories";
  92. preState = connect.prepareStatement(sql);
  93. resultSet = preState.executeQuery();
  94. while (resultSet.next()) {
  95. Knowledge a = new Knowledge();
  96. a.setId(resultSet.getLong("id"));
  97. a.setParentId(resultSet.getLong("parent"));
  98. as.add(a);
  99. }
  100. return as;
  101. } finally {
  102. if (resultSet != null) {
  103. resultSet.close();
  104. }
  105. if (preState != null) {
  106. preState.close();
  107. }
  108. }
  109. }
  110. }