SetLevel.java 3.9 KB

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