package me.zhengjie.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import me.zhengjie.domain.GenConfig; import me.zhengjie.domain.ColumnInfo; import me.zhengjie.domain.vo.TableInfo; import me.zhengjie.exception.BadRequestException; import me.zhengjie.repository.ColumnInfoRepository; import me.zhengjie.service.GeneratorService; import me.zhengjie.utils.GenUtil; import me.zhengjie.utils.PageUtil; import me.zhengjie.utils.StringUtils; import org.springframework.stereotype.Service; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * @author Zheng Jie * @date 2019-01-02 */ @Service @SuppressWarnings("all") public class GeneratorServiceImpl implements GeneratorService { @PersistenceContext private EntityManager em; private final ColumnInfoRepository columnInfoRepository; public GeneratorServiceImpl(ColumnInfoRepository columnInfoRepository) { this.columnInfoRepository = columnInfoRepository; } @Override public Object getTables() { // 使用预编译防止sql注入 String sql = "select table_name ,create_time , engine, table_collation, table_comment from information_schema.tables " + "where table_schema = (select database()) " + "order by create_time desc"; Query query = em.createNativeQuery(sql); return query.getResultList(); } @Override public Object getTables(String name, int[] startEnd) { // 使用预编译防止sql注入 String sql = "select table_name ,create_time , engine, table_collation, table_comment from information_schema.tables " + "where table_schema = (select database()) " + "and table_name like ? order by create_time desc"; Query query = em.createNativeQuery(sql); query.setFirstResult(startEnd[0]); query.setMaxResults(startEnd[1]-startEnd[0]); query.setParameter(1, StringUtils.isNotBlank(name) ? ("%" + name + "%") : "%%"); List result = query.getResultList(); List tableInfos = new ArrayList<>(); for (Object obj : result) { Object[] arr = (Object[]) obj; tableInfos.add(new TableInfo(arr[0],arr[1],arr[2],arr[3], ObjectUtil.isNotEmpty(arr[4])? arr[4] : "-")); } Query query1 = em.createNativeQuery("SELECT COUNT(*) from information_schema.tables where table_schema = (select database())"); Object totalElements = query1.getSingleResult(); return PageUtil.toPage(tableInfos,totalElements); } @Override public List getColumns(String tableName) { List columnInfos = columnInfoRepository.findByTableNameOrderByIdAsc(tableName); if(CollectionUtil.isNotEmpty(columnInfos)){ return columnInfos; } else { columnInfos = query(tableName); return columnInfoRepository.saveAll(columnInfos); } } public List query(String tableName){ // 使用预编译防止sql注入 String sql = "select column_name, is_nullable, data_type, column_comment, column_key, extra from information_schema.columns " + "where table_name = ? and table_schema = (select database()) order by ordinal_position"; Query query = em.createNativeQuery(sql); query.setParameter(1,tableName); List result = query.getResultList(); List columnInfos = new ArrayList<>(); for (Object obj : result) { Object[] arr = (Object[]) obj; columnInfos.add( new ColumnInfo( tableName, arr[0].toString(), arr[1].equals("NO"), arr[2].toString(), ObjectUtil.isNotNull(arr[3]) ? arr[3].toString() : null, ObjectUtil.isNotNull(arr[4]) ? arr[4].toString() : null, ObjectUtil.isNotNull(arr[5]) ? arr[5].toString() : null) ); } return columnInfos; } @Override public void sync(List columnInfos) { } @Override public void save(List columnInfos) { columnInfoRepository.saveAll(columnInfos); } @Override public Object generator(GenConfig genConfig, List columns) { if(genConfig.getId() == null){ throw new BadRequestException("请先配置生成器"); } try { GenUtil.generatorCode(columns,genConfig); } catch (IOException e) { throw new RuntimeException(e); } return null; } }