mirror of
				https://github.com/dromara/RuoYi-Vue-Plus.git
				synced 2025-11-04 16:23:42 +08:00 
			
		
		
		
	update 优化根据表名称查询列信息
This commit is contained in:
		@@ -1,13 +1,9 @@
 | 
			
		||||
package org.dromara.generator.mapper;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.dynamic.datasource.annotation.DS;
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 | 
			
		||||
import org.apache.ibatis.annotations.Param;
 | 
			
		||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 | 
			
		||||
import org.dromara.generator.domain.GenTableColumn;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 业务字段 数据层
 | 
			
		||||
 *
 | 
			
		||||
@@ -15,14 +11,5 @@ import java.util.List;
 | 
			
		||||
 */
 | 
			
		||||
@InterceptorIgnore(dataPermission = "true", tenantLine = "true")
 | 
			
		||||
public interface GenTableColumnMapper extends BaseMapperPlus<GenTableColumn, GenTableColumn> {
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据表名称查询列信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param tableName 表名称
 | 
			
		||||
     * @param dataName  数据源名称
 | 
			
		||||
     * @return 列信息
 | 
			
		||||
     */
 | 
			
		||||
    @DS("#dataName")
 | 
			
		||||
    List<GenTableColumn> selectDbTableColumnsByName(@Param("tableName") String tableName, String dataName);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.anyline.metadata.Column;
 | 
			
		||||
import org.anyline.metadata.Table;
 | 
			
		||||
import org.anyline.proxy.ServiceProxy;
 | 
			
		||||
import org.apache.velocity.Template;
 | 
			
		||||
@@ -239,7 +240,7 @@ public class GenTableServiceImpl implements IGenTableService {
 | 
			
		||||
                int row = baseMapper.insert(table);
 | 
			
		||||
                if (row > 0) {
 | 
			
		||||
                    // 保存列信息
 | 
			
		||||
                    List<GenTableColumn> genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName, dataName);
 | 
			
		||||
                    List<GenTableColumn> genTableColumns = selectDbTableColumnsByName(tableName, dataName);
 | 
			
		||||
                    List<GenTableColumn> saveColumns = new ArrayList<>();
 | 
			
		||||
                    for (GenTableColumn column : genTableColumns) {
 | 
			
		||||
                        GenUtils.initColumnField(column, table);
 | 
			
		||||
@@ -255,6 +256,31 @@ public class GenTableServiceImpl implements IGenTableService {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据表名称查询列信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param tableName 表名称
 | 
			
		||||
     * @param dataName  数据源名称
 | 
			
		||||
     * @return 列信息
 | 
			
		||||
     */
 | 
			
		||||
    @DS("#dataName")
 | 
			
		||||
    private List<GenTableColumn> selectDbTableColumnsByName(String tableName, String dataName) {
 | 
			
		||||
        LinkedHashMap<String, Column> columns = ServiceProxy.service().metadata().table(tableName).getColumns();
 | 
			
		||||
        List<GenTableColumn> tableColumns = new ArrayList<>();
 | 
			
		||||
        columns.forEach((columnName, column) -> {
 | 
			
		||||
            GenTableColumn tableColumn = new GenTableColumn();
 | 
			
		||||
            tableColumn.setIsPk(String.valueOf(column.isPrimaryKey()));
 | 
			
		||||
            tableColumn.setColumnName(column.getName());
 | 
			
		||||
            tableColumn.setColumnComment(column.getComment());
 | 
			
		||||
            tableColumn.setColumnType(column.getTypeName().toLowerCase());
 | 
			
		||||
            tableColumn.setSort(column.getPosition());
 | 
			
		||||
//            tableColumn.setIsRequired();
 | 
			
		||||
//            tableColumn.setIsIncrement();
 | 
			
		||||
            tableColumns.add(tableColumn);
 | 
			
		||||
        });
 | 
			
		||||
        return tableColumns;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 预览代码
 | 
			
		||||
     *
 | 
			
		||||
@@ -350,7 +376,7 @@ public class GenTableServiceImpl implements IGenTableService {
 | 
			
		||||
        List<GenTableColumn> tableColumns = table.getColumns();
 | 
			
		||||
        Map<String, GenTableColumn> tableColumnMap = StreamUtils.toIdentityMap(tableColumns, GenTableColumn::getColumnName);
 | 
			
		||||
 | 
			
		||||
        List<GenTableColumn> dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(table.getTableName(), table.getDataName());
 | 
			
		||||
        List<GenTableColumn> dbTableColumns = selectDbTableColumnsByName(table.getTableName(), table.getDataName());
 | 
			
		||||
        if (CollUtil.isEmpty(dbTableColumns)) {
 | 
			
		||||
            throw new ServiceException("同步数据失败,原表结构不存在");
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -7,87 +7,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
			
		||||
    <resultMap type="org.dromara.generator.domain.GenTableColumn" id="GenTableColumnResult">
 | 
			
		||||
    </resultMap>
 | 
			
		||||
 | 
			
		||||
    <select id="selectDbTableColumnsByName" parameterType="String" resultMap="GenTableColumnResult">
 | 
			
		||||
        <if test="@org.dromara.common.mybatis.helper.DataBaseHelper@isMySql()">
 | 
			
		||||
            select column_name,
 | 
			
		||||
                   (case when (is_nullable = 'no' <![CDATA[ && ]]> column_key != 'PRI') then '1' else '0' end) as is_required,
 | 
			
		||||
                   (case when column_key = 'PRI' then '1' else '0' end) as is_pk,
 | 
			
		||||
                   ordinal_position as sort,
 | 
			
		||||
                   column_comment,
 | 
			
		||||
                   (case when extra = 'auto_increment' then '1' else '0' end) as is_increment,
 | 
			
		||||
                   column_type
 | 
			
		||||
            from information_schema.columns where table_schema = (select database()) and table_name = (#{tableName})
 | 
			
		||||
            order by ordinal_position
 | 
			
		||||
        </if>
 | 
			
		||||
        <if test="@org.dromara.common.mybatis.helper.DataBaseHelper@isOracle()">
 | 
			
		||||
            select lower(temp.column_name) as column_name,
 | 
			
		||||
                    (case when (temp.nullable = 'N'  and  temp.constraint_type != 'P') then '1' else '0' end) as is_required,
 | 
			
		||||
                    (case when temp.constraint_type = 'P' then '1' else '0' end) as is_pk,
 | 
			
		||||
                    temp.column_id as sort,
 | 
			
		||||
                    temp.comments as column_comment,
 | 
			
		||||
                    (case when temp.constraint_type = 'P' then '1' else '0' end) as is_increment,
 | 
			
		||||
                    lower(temp.data_type) as column_type
 | 
			
		||||
            from (
 | 
			
		||||
                select col.column_id, col.column_name,col.nullable, col.data_type, colc.comments, uc.constraint_type, row_number()
 | 
			
		||||
                    over (partition by col.column_name order by uc.constraint_type desc) as row_flg
 | 
			
		||||
                from user_tab_columns col
 | 
			
		||||
                left join user_col_comments colc on colc.table_name = col.table_name and colc.column_name = col.column_name
 | 
			
		||||
                left join user_cons_columns ucc on ucc.table_name = col.table_name and ucc.column_name = col.column_name
 | 
			
		||||
                left join user_constraints uc on uc.constraint_name = ucc.constraint_name
 | 
			
		||||
                where col.table_name = upper(#{tableName})
 | 
			
		||||
            ) temp
 | 
			
		||||
            WHERE temp.row_flg = 1
 | 
			
		||||
            ORDER BY temp.column_id
 | 
			
		||||
        </if>
 | 
			
		||||
        <if test="@org.dromara.common.mybatis.helper.DataBaseHelper@isPostgerSql()">
 | 
			
		||||
            SELECT column_name, is_required, is_pk, sort, column_comment, is_increment, column_type
 | 
			
		||||
            FROM (
 | 
			
		||||
                SELECT c.relname AS table_name,
 | 
			
		||||
                       a.attname AS column_name,
 | 
			
		||||
                       d.description AS column_comment,
 | 
			
		||||
                       CASE WHEN a.attnotnull AND con.conname IS NULL THEN 1 ELSE 0
 | 
			
		||||
                       END AS is_required,
 | 
			
		||||
                       CASE WHEN con.conname IS NOT NULL THEN 1 ELSE 0
 | 
			
		||||
                       END AS is_pk,
 | 
			
		||||
                       a.attnum AS sort,
 | 
			
		||||
                       CASE WHEN "position"(pg_get_expr(ad.adbin, ad.adrelid),
 | 
			
		||||
                           ((c.relname::text || '_'::text) || a.attname::text) || '_seq'::text) > 0 THEN 1 ELSE 0
 | 
			
		||||
                       END AS is_increment,
 | 
			
		||||
                       btrim(
 | 
			
		||||
                           CASE WHEN t.typelem <![CDATA[ <> ]]> 0::oid AND t.typlen = '-1'::integer THEN 'ARRAY'::text ELSE
 | 
			
		||||
                                CASE WHEN t.typtype = 'd'::"char" THEN format_type(t.typbasetype, NULL::integer)
 | 
			
		||||
                                ELSE format_type(a.atttypid, NULL::integer) END
 | 
			
		||||
                           END, '"'::text
 | 
			
		||||
                       ) AS column_type
 | 
			
		||||
                FROM pg_attribute a
 | 
			
		||||
                    JOIN (pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid) ON a.attrelid = c.oid
 | 
			
		||||
                    LEFT JOIN pg_description d ON d.objoid = c.oid AND a.attnum = d.objsubid
 | 
			
		||||
                    LEFT JOIN pg_constraint con ON con.conrelid = c.oid AND (a.attnum = ANY (con.conkey))
 | 
			
		||||
                    LEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum
 | 
			
		||||
                    LEFT JOIN pg_type t ON a.atttypid = t.oid
 | 
			
		||||
                WHERE (c.relkind = ANY (ARRAY ['r'::"char", 'p'::"char"]))
 | 
			
		||||
                    AND a.attnum > 0
 | 
			
		||||
                    AND n.nspname = 'public'::name
 | 
			
		||||
                ORDER BY c.relname, a.attnum
 | 
			
		||||
            ) temp
 | 
			
		||||
            WHERE table_name = (#{tableName})
 | 
			
		||||
                AND column_type <![CDATA[ <> ]]> '-'
 | 
			
		||||
        </if>
 | 
			
		||||
        <if test="@org.dromara.common.mybatis.helper.DataBaseHelper@isSqlServer()">
 | 
			
		||||
            SELECT
 | 
			
		||||
                cast(A.NAME as nvarchar) as column_name,
 | 
			
		||||
                cast(B.NAME as nvarchar) + (case when B.NAME = 'numeric' then '(' + cast(A.prec as nvarchar) + ',' + cast(A.scale as nvarchar) + ')' else '' end) as column_type,
 | 
			
		||||
                cast(G.[VALUE] as nvarchar) as column_comment,
 | 
			
		||||
                (SELECT 1 FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE Z WHERE TABLE_NAME = D.NAME and A.NAME = Z.column_name  ) as is_pk,
 | 
			
		||||
                colorder as sort
 | 
			
		||||
            FROM SYSCOLUMNS A
 | 
			
		||||
                LEFT JOIN SYSTYPES B ON A.XTYPE = B.XUSERTYPE
 | 
			
		||||
                INNER JOIN SYSOBJECTS D ON A.ID = D.ID AND D.XTYPE='U' AND D.NAME != 'DTPROPERTIES'
 | 
			
		||||
                LEFT JOIN SYS.EXTENDED_PROPERTIES G ON A.ID = G.MAJOR_ID AND A.COLID = G.MINOR_ID
 | 
			
		||||
                LEFT JOIN SYS.EXTENDED_PROPERTIES F ON D.ID = F.MAJOR_ID AND F.MINOR_ID = 0
 | 
			
		||||
            WHERE D.NAME = #{tableName}
 | 
			
		||||
            ORDER BY A.COLORDER
 | 
			
		||||
        </if>
 | 
			
		||||
    </select>
 | 
			
		||||
 | 
			
		||||
</mapper>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user