JdbcServiceImpl.java 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. package com.uas.search.service.impl;
  2. import static com.uas.search.constant.SearchConstants.PCB_TABLE_NAME;
  3. import static com.uas.search.constant.SearchConstants.PRODUCTS_PRIVATE_TABLE_NAME;
  4. import static com.uas.search.constant.SearchConstants.TRADE_GOODS_TABLE_NAME;
  5. import com.uas.search.constant.SearchConstants;
  6. import com.uas.search.dao.GoodsDao;
  7. import com.uas.search.model.Brand;
  8. import com.uas.search.model.Component;
  9. import com.uas.search.model.Kind;
  10. import com.uas.search.model.PCB;
  11. import com.uas.search.model.Products;
  12. import com.uas.search.model.Property;
  13. import com.uas.search.model.PropertyValue;
  14. import com.uas.search.model.TradeGoods;
  15. import com.uas.search.model.V_Products;
  16. import com.uas.search.service.JdbcService;
  17. import com.uas.search.util.CollectionUtils;
  18. import java.lang.annotation.Annotation;
  19. import java.lang.reflect.Field;
  20. import java.util.ArrayList;
  21. import java.util.HashSet;
  22. import java.util.List;
  23. import java.util.Set;
  24. import javax.persistence.Column;
  25. import org.springframework.beans.factory.annotation.Autowired;
  26. import org.springframework.dao.EmptyResultDataAccessException;
  27. import org.springframework.jdbc.core.JdbcTemplate;
  28. import org.springframework.stereotype.Service;
  29. /**
  30. *
  31. * Created by wangyc on 2018/6/11.
  32. *
  33. * @version 2018/6/11 15:47 wangyc
  34. * @param <T>
  35. */
  36. @Service
  37. public class JdbcServiceImpl<T> implements JdbcService{
  38. private final JdbcTemplate jdbcTemplate;
  39. private final GoodsDao goodsDao;
  40. @Autowired
  41. public JdbcServiceImpl(JdbcTemplate jdbcTemplate, GoodsDao goodsDao) {
  42. this.jdbcTemplate = jdbcTemplate;
  43. this.goodsDao = goodsDao;
  44. }
  45. @Override
  46. public Long getTotalElements(String tablename) {
  47. return jdbcTemplate.queryForObject(String.format("select count(1) from %s", tablename), Long.class);
  48. }
  49. @Override
  50. public List<Long> getLimitId(String tablename, String direction, String sortField, Long start, Integer size) {
  51. List<Long> ids = new ArrayList<>();
  52. Long startId = jdbcTemplate.queryForObject(String.format("select %s from %s order by %s limit %s,1", sortField,
  53. tablename, sortField, start), Long.class);
  54. ids.add(startId);
  55. try {
  56. Long endId = jdbcTemplate.queryForObject(String.format("select %s from %s order by %s limit %s,1", sortField,
  57. tablename, sortField, start + size - 1), Long.class);
  58. ids.add(endId);
  59. } catch (EmptyResultDataAccessException e) {
  60. Long endId = jdbcTemplate.queryForObject(String.format("select max(%s) from %s", sortField,
  61. tablename, sortField, start + size - 1), Long.class);
  62. ids.add(endId);
  63. ids.add(1L);
  64. }
  65. return ids;
  66. }
  67. @Override
  68. public String abstractTransform(Class className, String property) throws NoSuchFieldException {
  69. Field id = className.getDeclaredField("id");
  70. Annotation annotation = id.getAnnotation(Column.class);
  71. return ((Column) annotation).name();
  72. }
  73. @Override
  74. public List<T> getData(String tableName, Long startId, Long endId, String sortField, String direct) {
  75. String sql = String.format("select * from %s where %s between %d and %d order by %s %s", tableName, sortField,
  76. startId, endId, sortField, direct);
  77. List<T> data = null;
  78. // 器件索引
  79. if (SearchConstants.COMPONENT_TABLE_NAME.equals(tableName)) {
  80. data = queryComponents(sql, true);
  81. }
  82. // Product索引
  83. if (PRODUCTS_PRIVATE_TABLE_NAME.equals(tableName)) {
  84. data = queryVProducts(sql);
  85. }
  86. // Goods索引
  87. if (TRADE_GOODS_TABLE_NAME.equals(tableName)) {
  88. data = queryGoods(sql);
  89. }
  90. // PCB索引
  91. if (PCB_TABLE_NAME.equals(tableName)) {
  92. data = queryPCB(sql);
  93. }
  94. return data;
  95. }
  96. /**
  97. * 获取Component
  98. * @param sql sql
  99. * @param needProperties 是否需要获取属性值
  100. * @return
  101. */
  102. private List<T> queryComponents(String sql, boolean needProperties) {
  103. List<Component> components = jdbcTemplate.query(sql.replace("where", "left join product$brand on product$brand.br_id=product$component.cmp_brid left join product$kind on product$kind.ki_id = product$component.cmp_kiid where"), new Component());
  104. String propertyValueSql = "select * from product$propertyvalue left join product$property on product$propertyvalue.pv_propertyid = product$property.pt_id where pv_componentid = ";
  105. if (!CollectionUtils.isEmpty(components) && needProperties) {
  106. for (Component component : components) {
  107. component.setProperties(new HashSet<>(jdbcTemplate.query(propertyValueSql + component.getId(), new PropertyValue())));
  108. }
  109. }
  110. return (List<T>) components;
  111. }
  112. /**
  113. * 获取V_Products
  114. * @param sql sql
  115. * @return
  116. */
  117. private List<T> queryVProducts(String sql) {
  118. return jdbcTemplate.query(sql, new V_Products());
  119. }
  120. /**
  121. * 获取Goods
  122. * @param sql sql
  123. * @return
  124. */
  125. private List<T> queryGoods(String sql) {
  126. return jdbcTemplate.query(sql, new TradeGoods());
  127. }
  128. /**
  129. * 下载pcb
  130. * @param sql sql
  131. * @return
  132. */
  133. private List<T> queryPCB(String sql) {
  134. List<PCB> pcbs = jdbcTemplate.query(sql, new PCB());
  135. if (!CollectionUtils.isEmpty(pcbs)) {
  136. String kindSql = "select * from product$kind where ki_id = ";
  137. String brandSql = "select * from product$brand where br_id = ";
  138. String productSql = "select * from products where pr_id = ";
  139. for (PCB pcb : pcbs) {
  140. if (pcb.getKindId() != null) {
  141. List<Kind> kinds = jdbcTemplate.query(kindSql + pcb.getKindId(), new Kind());
  142. if (!CollectionUtils.isEmpty(kinds)) {
  143. pcb.setKind(kinds.get(0));
  144. }
  145. }
  146. if (pcb.getBrandId() != null) {
  147. List<Brand> brands = jdbcTemplate.query(brandSql + pcb.getBrandId(), new Brand());
  148. if (!CollectionUtils.isEmpty(brands)) {
  149. pcb.setBrand(brands.get(0));
  150. }
  151. }
  152. if (pcb.getProductId() != null) {
  153. List<Products> productses = jdbcTemplate.query(productSql + pcb.getProductId(), new Products());
  154. if (!CollectionUtils.isEmpty(productses)) {
  155. pcb.setProducts(productses.get(0));
  156. }
  157. }
  158. }
  159. }
  160. return (List<T>) pcbs;
  161. }
  162. }