content: package com.open.capacity.security.service.impl;
  
  import com.google.common.collect.Maps;
  import com.open.capacity.security.dto.BeanField;
  import com.open.capacity.security.dto.GenerateInput;
  import com.open.capacity.security.service.GenerateService;
  import com.open.capacity.security.utils.StrUtil;
  import com.open.capacity.security.utils.TemplateUtil;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.jdbc.core.JdbcTemplate;
  import org.springframework.jdbc.core.RowMapper;
  import org.springframework.stereotype.Service;
  import org.springframework.util.CollectionUtils;
  
  import java.math.BigDecimal;
  import java.sql.ResultSet;
  import java.sql.SQLException;
  import java.util.Date;
  import java.util.List;
  import java.util.Map;
  
  @Service
  public class GenerateServiceImpl implements GenerateService {
  
      /**
       * mysql类型与java类型部分对应关系
       */
      private static Map<String, String> map = Maps.newHashMap();
  
      static {
          map.put("int", Integer.class.getSimpleName());
          map.put("tinyint", Integer.class.getSimpleName());
          map.put("double", Double.class.getSimpleName());
          map.put("float", Float.class.getSimpleName());
          map.put("decimal", BigDecimal.class.getSimpleName());
          map.put("date", Date.class.getSimpleName());
          map.put("timestamp", Date.class.getSimpleName());
          map.put("datetime", Date.class.getSimpleName());
          map.put("varchar", String.class.getSimpleName());
          map.put("text", String.class.getSimpleName());
          map.put("longtext", String.class.getSimpleName());
  
      }
  
      @Autowired
      private JdbcTemplate jdbcTemplate;
      private RowMapper<BeanField> beanFieldMapper = new RowMapper<BeanField>() {
  
          @Override
          public BeanField mapRow(ResultSet rs, int paramInt) throws SQLException {
              BeanField beanField = new BeanField();
              beanField.setColumnName(rs.getString("column_name"));
              beanField.setColumnType(rs.getString("data_type"));
              beanField.setColumnComment(rs.getString("column_comment"));
              beanField.setColumnDefault(rs.getString("column_default"));
  
              return beanField;
          }
      };
  
      @Override
      public List<BeanField> listBeanField(String tableName) {
          List<BeanField> beanFields = jdbcTemplate.query(
                  "select column_name, data_type, column_comment, column_default FROM information_schema.columns WHERE table_name= ? and table_schema = (select database())",
                  new String[]{tableName}, beanFieldMapper);
          if (CollectionUtils.isEmpty(beanFields)) {
              throw new IllegalArgumentException("表" + tableName + "不存在");
          }
  
          beanFields.parallelStream().forEach(b -> {
              b.setName(StrUtil.str2hump(b.getColumnName()));
              String type = map.get(b.getColumnType());
              if (type == null) {
                  type = String.class.getSimpleName();
              }
              b.setType(type);
              if ("id".equals(b.getName())) {
                  b.setType(Long.class.getSimpleName());
              }
  
              b.setColumnDefault(b.getColumnDefault() == null ? "" : b.getColumnDefault());
          });
  
          return beanFields;
      }
  
      @Override
      public String upperFirstChar(String string) {
          String name = StrUtil.str2hump(string);
          String firstChar = name.substring(0, 1);
          name = name.replaceFirst(firstChar, firstChar.toUpperCase());
  
          return name;
      }
  
      @Override
      public void saveCode(GenerateInput input) {
          TemplateUtil.saveJava(input);
          TemplateUtil.saveJavaDao(input);
          TemplateUtil.saveController(input);
          TemplateUtil.saveHtmlList(input);
      }
  
  }
  