根据数据库定义语句DDL生成实体类和Mybatis增删改查代码

实体类生成器 自己编写的实体类生成器 支持数据库oracle 和 SqlServer 支持实体类生成程序:C# 和 java *注意: 电脑上一定要安装 framework才能运行本软件 有什么问题请联系qq:910579826 备注添加:实体类生成器 1. 用户首先选择要操作的数据库,选中后程序会自动创建数据库连接字符串。 2.选择要生成的实体类类型,程序会根据选中的类型自动生成相对应的实体类 3.在程序左侧会显示连接的数据库列表,选择要操作的数据库,会自动加载该数据库下的表信息。 4.选择要操作的表,在右侧会显示该表的表中的字段信息 5.程序自动处理数据库中的书库类型,将其转换为程序相对应的可以识别的数据类型。 6.在字段显示窗体,用户还可以手动选择数据类型。 7.用户可以选择要生成的字段信息,不想生成的字段只要取消选中状态即可 8.选择生成文件保存的路径 9.设置要生成的包名或名称空间名 10.点击生成按钮。这时,弹出一个编辑实体类窗体,在这里可以对即将要生成的实体类信息进行检查并修改信息。 11.修改完毕后,点击生成。完毕后提示生成成功! *备注:程序中每一步都有相对应的必要检测,当用户选择不符合必须选择或填写的信息时,将提示相对应的提示。 修改,创建操作时,都有确认提示。 说明: 根据数据库表结构,自动生成实例类 支持的数据库:oracle和SQLServer 可生成的实体类:C#实体类和Java实体类 软件特点: 同时支持Oracle和SQLServer两种数据库 同时支持Java和C#程序的实体类生成 同时支持任意数据库搭配任意程序的实体类生成 立即下载

根据Navicate的数据库定义语句DDL生成实体类、Service层、Controller层和Mybatis增删改查代码输出到控制台。


代码如下:

import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

/**
 * 根据数据库定义语句DDL生成实体类和Mybatis增删改查代码
 *
 * @author java_t_t
 * @since 2023-04-22
 */
public class UseDDLGenerateCode {
    /**
     * 换行符
     */
    private static final String LINE_SEPARATOR = System.getProperty("line.separator");

    /**
     * java默认import为:import java.lang.*
     */
    private static final String DEFAULT_IMPORT = "java.lang.";

    /**
     * String
     */
    private static final String STRING_TYPE = "java.lang.String";

    /**
     * 空字符串,主要用于生成实体类代码时调整格式用
     */
    private static final String SPACE = "";

    /**
     * 年月日格式化器
     */
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    /**
     * jdbc类型与java数据类型的映射
     */
    private static final Map<String, String> JDBC_JAVA_TYPE_MAP = new HashMap<>();
    /**
     * MySQL数据类型与jdbc数据类型的映射
     */
    private static final Map<String, String> DB_JDBC_TYPE_MAP = new HashMap<>();

    /**
     * package路径
     */
    private static String packagePath = "xxx";

    static {
        // ====================jdbc与java type映射====================
        // 数值类型
        JDBC_JAVA_TYPE_MAP.put("TINYINT", "java.lang.Integer");
        JDBC_JAVA_TYPE_MAP.put("SMALLINT", "java.lang.Integer");
        JDBC_JAVA_TYPE_MAP.put("MEDIUMINT", "java.lang.Integer");
        JDBC_JAVA_TYPE_MAP.put("INT", "java.lang.Integer");
        JDBC_JAVA_TYPE_MAP.put("INTEGER", "java.lang.Integer");
        JDBC_JAVA_TYPE_MAP.put("BIGINT", "java.lang.Long");
        JDBC_JAVA_TYPE_MAP.put("FLOAT", "java.lang.Float");
        JDBC_JAVA_TYPE_MAP.put("DOUBLE", "java.lang.Double");
        JDBC_JAVA_TYPE_MAP.put("DECIMAL", "java.math.BigDecimal");
        // 字符串类型
        JDBC_JAVA_TYPE_MAP.put("CHAR", "java.lang.String");
        JDBC_JAVA_TYPE_MAP.put("VARCHAR", "java.lang.String");
        JDBC_JAVA_TYPE_MAP.put("TINYTEXT", "java.lang.String");
        JDBC_JAVA_TYPE_MAP.put("TEXT", "java.lang.String");
        JDBC_JAVA_TYPE_MAP.put("MEDIUMTEXT", "java.lang.String");
        JDBC_JAVA_TYPE_MAP.put("LONGTEXT", "java.lang.String");
        JDBC_JAVA_TYPE_MAP.put("ENUM", "java.lang.String");
        JDBC_JAVA_TYPE_MAP.put("SET", "java.lang.String");
        // 时间类型
        JDBC_JAVA_TYPE_MAP.put("YEAR", "java.time.Year");
        JDBC_JAVA_TYPE_MAP.put("DATE", "java.time.LocalDate");
        JDBC_JAVA_TYPE_MAP.put("TIME", "java.time.LocalTime");
        JDBC_JAVA_TYPE_MAP.put("DATETIME", "java.time.LocalDateTime");
        JDBC_JAVA_TYPE_MAP.put("TIMESTAMP", "java.time.LocalDateTime");
        // 二进制类型(二进制对应是否正确待确定)
        JDBC_JAVA_TYPE_MAP.put("BIT", "java.lang.Byte[]");
        JDBC_JAVA_TYPE_MAP.put("BINARY", "java.lang.Byte[]");
        JDBC_JAVA_TYPE_MAP.put("VARBINARY", "java.lang.Byte[]");
        JDBC_JAVA_TYPE_MAP.put("TINYBLOB", "java.lang.Byte[]");
        JDBC_JAVA_TYPE_MAP.put("BLOB", "java.lang.Byte[]");
        JDBC_JAVA_TYPE_MAP.put("MEDIUMBLOB", "java.lang.Byte[]");
        JDBC_JAVA_TYPE_MAP.put("LONGBLOB", "java.lang.Byte[]");

        // ====================数据库字段类型与jdbc type映射====================
        // 数值类型
        DB_JDBC_TYPE_MAP.put("tinyint", "TINYINT");
        DB_JDBC_TYPE_MAP.put("smallint", "SMALLINT");
        DB_JDBC_TYPE_MAP.put("mediumint", "INTEGER");
        DB_JDBC_TYPE_MAP.put("int", "INTEGER");
        DB_JDBC_TYPE_MAP.put("integer", "INTEGER");
        DB_JDBC_TYPE_MAP.put("bigint", "BIGINT");
        DB_JDBC_TYPE_MAP.put("float", "FLOAT");
        DB_JDBC_TYPE_MAP.put("double", "DOUBLE");
        DB_JDBC_TYPE_MAP.put("decimal", "DECIMAL");
        // 字符串类型
        DB_JDBC_TYPE_MAP.put("char", "CHAR");
        DB_JDBC_TYPE_MAP.put("varchar", "VARCHAR");
        DB_JDBC_TYPE_MAP.put("tinytext", "VARCHAR");
        DB_JDBC_TYPE_MAP.put("text", "VARCHAR");
        DB_JDBC_TYPE_MAP.put("mediumtext", "VARCHAR");
        DB_JDBC_TYPE_MAP.put("longtext", "VARCHAR");
        DB_JDBC_TYPE_MAP.put("enum", "VARCHAR");
        DB_JDBC_TYPE_MAP.put("set", "VARCHAR");
        // 时间类型
        DB_JDBC_TYPE_MAP.put("year", "DATE");
        DB_JDBC_TYPE_MAP.put("date", "DATE");
        DB_JDBC_TYPE_MAP.put("time", "TIME");
        DB_JDBC_TYPE_MAP.put("datetime", "TIMESTAMP");
        DB_JDBC_TYPE_MAP.put("timestamp", "TIMESTAMP");
        // 二进制类型
        DB_JDBC_TYPE_MAP.put("bit", "BIT");
        DB_JDBC_TYPE_MAP.put("binary", "BINARY");
        DB_JDBC_TYPE_MAP.put("varbinary", "VARBINARY");
        DB_JDBC_TYPE_MAP.put("tinyblob", "BLOB");
        DB_JDBC_TYPE_MAP.put("blob", "BLOB");
        DB_JDBC_TYPE_MAP.put("mediumblob", "BLOB");
        DB_JDBC_TYPE_MAP.put("longblob", "BLOB");
    }

    /**
     * 根据数据库定义语句DDL生成实体类和Mybatis增删改查代码
     *
     * @param ddl DDL语句(DDL从navicate复制出来,其它手写的格式不一定支持)
     * @return 解析后的表信息
     */
    public static void generateCode(String ddl) {
        TableInfo tableInfo = parseDDL(ddl);
        generateEntity(tableInfo);
        generateXmlMapper(tableInfo);
        generateMapper(tableInfo);
        generateService(tableInfo);
        generateServiceImpl(tableInfo);
        generateController(tableInfo);
    }

    /**
     * 生成MyBatis的XML文件
     *
     * @param tableInfo 表信息
     */
    private static void generateXmlMapper(TableInfo tableInfo) {
        List<String> xml = new ArrayList<>();
        xml.add("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        xml.add("<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">");
        xml.add(String.format("<mapper namespace=\"%s.mapper.%s\">", packagePath, tableInfo.getMapperName()));
        xml.addAll(generateInsert(tableInfo));
        xml.addAll(generateBatchInsert(tableInfo));
        xml.addAll(generateUpdate(tableInfo));
        xml.addAll(generateDelete(tableInfo));
        xml.addAll(generateGet(tableInfo));
        xml.addAll(generateCount(tableInfo));
        xml.addAll(generateList(tableInfo));
        xml.addAll(generateResultMap(tableInfo));
        xml.add("</mapper>");
        printCode(xml, tableInfo.getMapperName() + " XML");
    }

    /**
     * 生成MyBatis的resultMap代码
     *
     * @param tableInfo 表信息
     * @return
     */
    private static List<String> generateResultMap(TableInfo tableInfo) {
        List<String> codes = new ArrayList<>();
        codes.add(String.format("    <resultMap id=\"%sResultMap\" type=\"%s.entity.%s\">",
                caseFirstLetterToLower(tableInfo.getVariableNamePrefix()), packagePath, tableInfo.getEntityName()));
        List<Property> properties = tableInfo.getProperties();
        for (int index = 0; index < properties.size(); index++) {
            Property property = properties.get(index);
            codes.add(String.format("        <result column=\"%s\" property=\"%s\" jdbcType=\"%s\" javaType=\"%s\"/>",
                    property.getColumn(), property.getProperty(), property.getJdbcType(), property.getJavaType()));
        }
        codes.add("    </resultMap>");
        return codes;
    }

    /**
     * 生成MyBatis的list代码
     *
     * @param tableInfo 表信息
     * @return
     */
    private static List<String> generateList(TableInfo tableInfo) {
        List<String> codes = new ArrayList<>();
        codes.add(String.format("    <select id=\"list\" resultType=\"%s.entity.%s\">", packagePath,
                tableInfo.getEntityName()));
        codes.add("        SELECT");
        List<Property> properties = tableInfo.getProperties();
        for (int index = 0; index < properties.size(); index++) {
            Property property = properties.get(index);
            if (index < properties.size() - 1) {
                codes.add(String.format("            `%s` as `%s`,", property.getColumn(), property.getProperty()));
            } else {
                codes.add(String.format("            `%s` as `%s`", property.getColumn(), property.getProperty()));
            }
        }
        codes.add(String.format("        FROM `%s`", tableInfo.getJdbcTableName()));
        codes.add("        <where>");
        for (int index = 0; index < properties.size(); index++) {
            Property property = properties.get(index);
            codes.add(String.format("            <if test=\"param.%s != null\">", property.getProperty()));
            if (STRING_TYPE.equals(property.getJavaType())) {
                codes.add(String.format("                AND `%s` like CONCAT(\"%%\", #{param.%s}, \"%%\")",
                        property.getColumn(),
                        property.getProperty()));
            } else {
                codes.add(String.format("                AND `%s` = #{param.%s}", property.getColumn(), property.getProperty()));
            }
            codes.add(String.format("            </if>"));
        }
        codes.add("        </where>");
        codes.add("        LIMIT #{pageStart}, #{pageSize}");
        codes.add("    </select>");
        codes.add(SPACE);
        return codes;
    }

    /**
     * 生成MyBatis的Count代码
     *
     * @param tableInfo 表信息
     * @return
     */
    private static List<String> generateCount(TableInfo tableInfo) {
        List<String> codes = new ArrayList<>();
        codes.add("    <select id=\"count\" resultType=\"java.lang.Long\">");
        codes.add(String.format("        SELECT COUNT(*) FROM `%s`", tableInfo.getJdbcTableName()));
        List<Property> properties = tableInfo.getProperties();
        codes.add("        <where>");
        for (int index = 0; index < properties.size(); index++) {
            Property property = properties.get(index);
            codes.add(String.format("            <if test=\"param.%s != null\">", property.getProperty()));
            if (STRING_TYPE.equals(property.getJavaType())) {
                codes.add(String.format("                AND `%s` like CONCAT(\"%%\", #{param.%s}, \"%%\")",
                        property.getColumn(),
                        property.getProperty()));
            } else {
                codes.add(String.format("                AND `%s` = #{param.%s}", property.getColumn(), property.getProperty()));
            }
            codes.add(String.format("            </if>"));
        }
        codes.add("        </where>");
        codes.add("    </select>");
        codes.add(SPACE);
        return codes;
    }

    /**
     * 生成MyBatis的get代码
     *
     * @param tableInfo 表信息
     * @return
     */
    private static List<String> generateGet(TableInfo tableInfo) {
        List<String> codes = new ArrayList<>();
        codes.add(String.format("    <select id=\"get\" resultType=\"%s.entity.%s\">", packagePath,
                tableInfo.getEntityName()));
        codes.add("        SELECT");
        List<Property> properties = tableInfo.getProperties();
        for (int index = 0; index < properties.size(); index++) {
            Property property = properties.get(index);
            if (index < properties.size() - 1) {
                codes.add(String.format("            `%s` as `%s`,", property.getColumn(), property.getProperty()));
            } else {
                codes.add(String.format("            `%s` as `%s`", property.getColumn(), property.getProperty()));
            }
        }
        codes.add(String.format("        FROM `%s`", tableInfo.getJdbcTableName()));
        codes.add("        <where>");
        for (int index = 0; index < properties.size(); index++) {
            Property property = properties.get(index);
            codes.add(String.format("            <if test=\"param.%s != null\">", property.getProperty()));
            if (STRING_TYPE.equals(property.getJavaType())) {
                codes.add(String.format("                AND `%s` like CONCAT(\"%%\", #{param.%s}, \"%%\")",
                        property.getColumn(),
                        property.getProperty()));
            } else {
                codes.add(String.format("                AND `%s` = #{param.%s}", property.getColumn(), property.getProperty()));
            }
            codes.add(String.format("            </if>"));
        }
        codes.add("        </where>");
        codes.add("        LIMIT 1");
        codes.add("    </select>");
        codes.add(SPACE);
        return codes;
    }

    /**
     * 生成MyBatis的delete代码
     *
     * @param tableInfo 表信息
     * @return
     */
    private static List<String> generateDelete(TableInfo tableInfo) {
        List<String> codes = new ArrayList<>();
        codes.add(String.format("    <delete id=\"delete\" parameterType=\"%s.entity.%s\">",
                packagePath, tableInfo.getEntityName()));
        codes.add(String.format("        DELETE FROM `%s`", tableInfo.getJdbcTableName()));
        codes.add("        WHERE `id` = #{id} <!--todo modify condition>-->");
        codes.add("    </delete>");
        codes.add(SPACE);
        return codes;
    }

    /**
     * 生成MyBatis的update代码
     *
     * @param tableInfo 表信息
     * @return
     */
    private static List<String> generateUpdate(TableInfo tableInfo) {
        List<String> codes = new ArrayList<>();
        codes.add(String.format("    <update id=\"update\" parameterType=\"%s.entity.%s\">",
                packagePath, tableInfo.getEntityName()));
        codes.add(String.format("        UPDATE `%s` SET", tableInfo.getJdbcTableName()));
        List<Property> properties = tableInfo.getProperties();
        for (int index = 0; index < properties.size(); index++) {
            Property property = properties.get(index);
            if (index < properties.size() - 1) {
                codes.add(String.format("        `%s` = #{item.%s},", property.getColumn(), property.getProperty()));
            } else {
                codes.add(String.format("        `%s` = #{item.%s}", property.getColumn(), property.getProperty()));
            }
        }
        codes.add("        WHERE <!--todo add condition>-->");
        codes.add("    </update>");
        codes.add(SPACE);
        return codes;
    }

    /**
     * 生成MyBatis的batchInsert代码
     *
     * @param tableInfo 表信息
     * @return
     */
    private static List<String> generateBatchInsert(TableInfo tableInfo) {
        List<String> codes = new ArrayList<>();
        codes.add(String.format("    <insert id=\"batchInsert\" parameterType=\"%s.entity.%s\">",
                packagePath, tableInfo.getEntityName()));
        codes.add(String.format("        INSERT INTO `%s`(", tableInfo.getJdbcTableName()));
        List<Property> properties = tableInfo.getProperties();
        for (int index = 0; index < properties.size(); index++) {
            Property property = properties.get(index);
            if (index < properties.size() - 1) {
                codes.add(String.format("        `%s`,", property.getColumn()));
            } else {
                codes.add(String.format("        `%s`", property.getColumn()));
            }
        }
        codes.add("        ) VALUES");
        codes.add("        <foreach collection=\"list\" open=\"(\" separator=\"),(\" close=\")\" item=\"item\">");
        for (int index = 0; index < properties.size(); index++) {
            Property property = properties.get(index);
            if (index < properties.size() - 1) {
                codes.add(String.format("            #{item.%s},", property.getProperty()));
            } else {
                codes.add(String.format("            #{item.%s}", property.getProperty()));
            }
        }
        codes.add("        </foreach>");
        codes.add("    </insert>");
        codes.add(SPACE);
        return codes;
    }

    /**
     * 生成MyBatis的insert代码
     *
     * @param tableInfo 表信息
     * @return
     */
    private static List<String> generateInsert(TableInfo tableInfo) {
        List<String> codes = new ArrayList<>();
        codes.add(String.format("    <insert id=\"insert\" parameterType=\"%s.entity.%s\">",
                packagePath, tableInfo.getEntityName()));
        codes.add(String.format("        INSERT INTO `%s`(", tableInfo.getJdbcTableName()));
        List<Property> properties = tableInfo.getProperties();
        for (int index = 0; index < properties.size(); index++) {
            Property property = properties.get(index);
            if (index < properties.size() - 1) {
                codes.add(String.format("        `%s`,", property.getColumn()));
            } else {
                codes.add(String.format("        `%s`", property.getColumn()));
            }
        }
        codes.add("        ) VALUES (");
        for (int index = 0; index < properties.size(); index++) {
            Property property = properties.get(index);
            if (index < properties.size() - 1) {
                codes.add(String.format("        #{item.%s},", property.getProperty()));
            } else {
                codes.add(String.format("        #{item.%s})", property.getProperty()));
            }
        }
        codes.add("    </insert>");
        codes.add(SPACE);
        return codes;
    }

    /**
     * 生成java实体类代码
     *
     * @param tableInfo 表信息
     */
    private static void generateEntity(TableInfo tableInfo) {
        List<String> codes = new ArrayList<>();
        codes.add(String.format("package %s.entity;", packagePath));
        codes.add(SPACE);
        codes.add("import lombok.Getter;");
        codes.add("import lombok.Setter;");
        codes.add(SPACE);
        codes.add(String.format("/**" + LINE_SEPARATOR +
                " * %s" + LINE_SEPARATOR +
                " *" + LINE_SEPARATOR +
                " * @author auto" + LINE_SEPARATOR +
                " * @since %s" + LINE_SEPARATOR +
                " */", tableInfo.getJdbcTableName(), FORMATTER.format(LocalDateTime.now())));
        codes.add("@Setter");
        codes.add("@Getter");
        codes.add(String.format("public class %s {", tableInfo.getEntityName()));
        Set<String> imported = new HashSet<>();
        for (Property property : tableInfo.getProperties()) {
            String javaType = property.getJavaType();
            if (!javaType.startsWith(DEFAULT_IMPORT) && !imported.contains(javaType)) {
                codes.add(2, String.format("import %s;", javaType));
                imported.add(javaType);
            }
            javaType = javaType.substring(javaType.lastIndexOf(".") + 1);
            String comment = (property.getComment() == null || property.getComment().isEmpty())
                    ? property.getColumn() : property.getComment();
            String field = String.format("    /**" + LINE_SEPARATOR +
                    "     * %s" + LINE_SEPARATOR +
                    "     */" + LINE_SEPARATOR +
                    "    private %s %s;", comment, javaType, property.getProperty());
            codes.add(field);
            codes.add(SPACE);
        }
        if (!imported.isEmpty()) {
            codes.add(imported.size() + 2, SPACE);
        }
        if (SPACE.equals(codes.get(codes.size() - 1))) {
            codes.remove(codes.size() - 1);
        }
        codes.add("}");
        printCode(codes, tableInfo.getEntityName());
    }

    /**
     * 生成Controller代码
     *
     * @param tableInfo 表信息
     */
    private static void generateController(TableInfo tableInfo) {
        String serviceVar = caseFirstLetterToLower(tableInfo.getServiceName());
        List<String> codes = new ArrayList<>();
        codes.add(String.format("package %s.controller;", packagePath));
        codes.add(SPACE);
        codes.add(String.format("import %s.entity.%s;", packagePath, tableInfo.getEntityName()));
        codes.add(String.format("import %s.service.%s;", packagePath, tableInfo.getServiceName()));
        codes.add("import org.springframework.beans.factory.annotation.Autowired;");
        codes.add("import org.springframework.web.bind.annotation.GetMapping;");
        codes.add("import org.springframework.web.bind.annotation.PostMapping;");
        codes.add("import org.springframework.web.bind.annotation.RequestBody;");
        codes.add("import org.springframework.web.bind.annotation.RequestMapping;");
        codes.add("import org.springframework.web.bind.annotation.RequestParam;");
        codes.add("import org.springframework.web.bind.annotation.RestController;");
        codes.add(SPACE);
        codes.add("import java.util.List;");
        codes.add(SPACE);
        codes.add(String.format("/**" + LINE_SEPARATOR +
                " * %s" + LINE_SEPARATOR +
                " *" + LINE_SEPARATOR +
                " * @author auto" + LINE_SEPARATOR +
                " * @since %s" + LINE_SEPARATOR +
                " */", tableInfo.getControllerName(), FORMATTER.format(LocalDateTime.now())));
        codes.add("@RestController");
        codes.add(String.format("@RequestMapping(\"/%s\")", tableInfo.getJdbcTableName()));
        codes.add(String.format("public class %s {", tableInfo.getControllerName()));
        codes.add("    @Autowired");
        codes.add(String.format("    private %s %s;", tableInfo.getServiceName(), serviceVar));

        codes.add(SPACE);
        codes.add("    /**" + LINE_SEPARATOR +
                "     * 保存单条数据" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param body 数据" + LINE_SEPARATOR +
                "     */");
        codes.add("    @PostMapping(\"/save\")");
        codes.add(String.format("    public void save(@RequestBody %s body) {", tableInfo.getEntityName()));
        codes.add(String.format("        %s.save(body);", serviceVar));
        codes.add("    }");

        codes.add(SPACE);
        codes.add("    /**" + LINE_SEPARATOR +
                "     * 批量保存数据" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param list 多条数据" + LINE_SEPARATOR +
                "     */");
        codes.add("    @PostMapping(\"/batchSave\")");
        codes.add(String.format("    public void batchSave(@RequestBody List<%s> list) {", tableInfo.getEntityName()));
        codes.add(String.format("        %s.batchSave(list);", serviceVar));
        codes.add("    }");

        codes.add(SPACE);
        codes.add("    /**" + LINE_SEPARATOR +
                "     * 更新数据" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param body 单条数据" + LINE_SEPARATOR +
                "     */");
        codes.add("    @PostMapping(\"/update\")");
        codes.add(String.format("    public void update(@RequestBody %s body) {", tableInfo.getEntityName()));
        codes.add(String.format("        %s.update(body);", serviceVar));
        codes.add("    }");

        codes.add(SPACE);
        codes.add("    /**" + LINE_SEPARATOR +
                "     * 根据id删除数据" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param id id" + LINE_SEPARATOR +
                "     */");
        codes.add("    @GetMapping(\"/delete\")");
        codes.add("    public void delete(@RequestParam(value = \"id\") Integer id) {");
        codes.add(String.format("        %s.delete(id);", serviceVar));
        codes.add("    }");

        codes.add(SPACE);
        codes.add("    /**" + LINE_SEPARATOR +
                "     * 单条查询" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param params 查询参数" + LINE_SEPARATOR +
                "     * @return 查询结果" + LINE_SEPARATOR +
                "     */");
        codes.add("    @GetMapping(\"/get\")");
        codes.add(String.format("    public %s get(%s params) {", tableInfo.getEntityName(), tableInfo.getEntityName()));
        codes.add(String.format("        return %s.get(params);", serviceVar));
        codes.add("    }");

        codes.add(SPACE);
        codes.add("    /**" + LINE_SEPARATOR +
                "     * 批量查询" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param params    查询参数" + LINE_SEPARATOR +
                "     * @param pageIndex 页码" + LINE_SEPARATOR +
                "     * @param pageSize  页面大小" + LINE_SEPARATOR +
                "     * @return 查询结果" + LINE_SEPARATOR +
                "     */");
        codes.add("    @GetMapping(\"/list\")");
        codes.add(String.format("    public List<%s> list(%s params,", tableInfo.getEntityName(),
                tableInfo.getEntityName()));
        String formatSpace = generateFormatSpace(codes.get(codes.size() - 1));
        codes.add(formatSpace.concat("@RequestParam(required = false, name = \"pageIndex\", defaultValue = \"1\") Integer pageIndex,"));
        codes.add(formatSpace.concat("@RequestParam(required = false, name = \"pageSize\", defaultValue = \"10\") Integer pageSize) {"));
        codes.add(String.format("        return %s.list(params, pageIndex, pageSize);", serviceVar));
        codes.add("    }");

        codes.add("}");
        printCode(codes, tableInfo.getControllerName());
    }

    /**
     * 生成对应的格式化空格
     *
     * @param methodCode 方法定义代码
     * @return 格式化空格
     */
    private static String generateFormatSpace(String methodCode) {
        int indexOf = methodCode.indexOf("(");
        if (indexOf == -1) {
            return SPACE;
        }
        StringBuilder sb = new StringBuilder();
        while (indexOf-- >= 0) {
            sb.append(" ");
        }
        return sb.toString();
    }

    /**
     * 生成ServiceImpl代码
     *
     * @param tableInfo 表信息
     */
    private static void generateServiceImpl(TableInfo tableInfo) {
        String mapperVar = caseFirstLetterToLower(tableInfo.getMapperName());
        List<String> codes = new ArrayList<>();
        codes.add(String.format("package %s.service.impl;", packagePath));
        codes.add(SPACE);
        codes.add(String.format("import %s.entity.%s;", packagePath, tableInfo.getEntityName()));
        codes.add(String.format("import %s.mapper.%s;", packagePath, tableInfo.getMapperName()));
        codes.add(String.format("import %s.service.%s;", packagePath, tableInfo.getServiceName()));
        codes.add("import org.springframework.beans.factory.annotation.Autowired;");
        codes.add("import org.springframework.stereotype.Service;");
        codes.add(SPACE);
        codes.add("import java.util.List;");
        codes.add(SPACE);
        codes.add(String.format("/**" + LINE_SEPARATOR +
                " * %s" + LINE_SEPARATOR +
                " *" + LINE_SEPARATOR +
                " * @author auto" + LINE_SEPARATOR +
                " * @since %s" + LINE_SEPARATOR +
                " */", tableInfo.getServiceImplName(), FORMATTER.format(LocalDateTime.now())));
        codes.add("@Service");
        codes.add(String.format("public class %s implements %s {", tableInfo.getServiceImplName(), tableInfo.getServiceName()));
        codes.add("    @Autowired");
        codes.add(String.format("    private %s %s;", tableInfo.getMapperName(), mapperVar));

        codes.add(SPACE);
        codes.add("    @Override");
        codes.add(String.format("    public void save(%s item) {" + LINE_SEPARATOR +
                "        %s.insert(item);" + LINE_SEPARATOR +
                "    }", tableInfo.getEntityName(), mapperVar));

        codes.add(SPACE);
        codes.add("    @Override");
        codes.add(String.format("    public void batchSave(List<%s> list) {" + LINE_SEPARATOR +
                "        %s.batchInsert(list);" + LINE_SEPARATOR +
                "    }", tableInfo.getEntityName(), mapperVar));

        codes.add(SPACE);
        codes.add("    @Override");
        codes.add(String.format("    public void update(%s item) {" + LINE_SEPARATOR +
                "        %s.update(item);" + LINE_SEPARATOR +
                "    }", tableInfo.getEntityName(), mapperVar));

        codes.add(SPACE);
        codes.add("    @Override");
        codes.add(String.format("    public void delete(Integer id) {" + LINE_SEPARATOR +
                "        %s.delete(id);" + LINE_SEPARATOR +
                "    }", mapperVar));

        codes.add(SPACE);
        codes.add("    @Override");
        codes.add(String.format("    public %s get(%s param) {" + LINE_SEPARATOR +
                "        return %s.get(param);" + LINE_SEPARATOR +
                "    }", tableInfo.getEntityName(), tableInfo.getEntityName(), mapperVar));

        codes.add(SPACE);
        codes.add("    @Override");
        codes.add(String.format("    public List<%s> list(%s param, Integer pageIndex, Integer pageSize) {" + LINE_SEPARATOR +
                "        return %s.list(param, (pageIndex - 1) * pageSize, pageSize);" + LINE_SEPARATOR +
                "    }", tableInfo.getEntityName(), tableInfo.getEntityName(), mapperVar));

        codes.add("}");
        printCode(codes, tableInfo.getServiceImplName());
    }

    /**
     * 生成Service代码
     *
     * @param tableInfo 表信息
     */
    private static void generateService(TableInfo tableInfo) {
        List<String> codes = new ArrayList<>();
        codes.add(String.format("package %s.service;", packagePath));
        codes.add(SPACE);
        codes.add(String.format("import %s.entity.%s;", packagePath, tableInfo.getEntityName()));
        codes.add(SPACE);
        codes.add("import java.util.List;");
        codes.add(SPACE);
        codes.add(String.format("/**" + LINE_SEPARATOR +
                " * %s" + LINE_SEPARATOR +
                " *" + LINE_SEPARATOR +
                " * @author auto" + LINE_SEPARATOR +
                " * @since %s" + LINE_SEPARATOR +
                " */", tableInfo.getServiceName(), FORMATTER.format(LocalDateTime.now())));
        codes.add(String.format("public interface %s {", tableInfo.getServiceName()));

        codes.add("    /**" + LINE_SEPARATOR +
                "     * 保存单条数据" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param item 数据" + LINE_SEPARATOR +
                "     */");
        codes.add(String.format("    void save(%s item);", tableInfo.getEntityName()));

        codes.add(SPACE);
        codes.add("    /**" + LINE_SEPARATOR +
                "     * 批量保存数据" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param list 多条数据" + LINE_SEPARATOR +
                "     */");
        codes.add(String.format("    void batchSave(List<%s> list);", tableInfo.getEntityName()));

        codes.add(SPACE);
        codes.add("    /**" + LINE_SEPARATOR +
                "     * 更新数据" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param item 单条数据" + LINE_SEPARATOR +
                "     */");
        codes.add(String.format("    void update(%s item);", tableInfo.getEntityName()));

        codes.add(SPACE);
        codes.add("    /**" + LINE_SEPARATOR +
                "     * 根据id删除数据" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param id id" + LINE_SEPARATOR +
                "     */");
        codes.add(String.format("    void delete(Integer id);"));

        codes.add(SPACE);
        codes.add("    /**" + LINE_SEPARATOR +
                "     * 单条查询" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param param 查询参数" + LINE_SEPARATOR +
                "     * @return 查询结果" + LINE_SEPARATOR +
                "     */");
        codes.add(String.format("    %s get(%s param);", tableInfo.getEntityName(), tableInfo.getEntityName()));

        codes.add(SPACE);
        codes.add("    /**" + LINE_SEPARATOR +
                "     * 批量查询" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param param     查询参数" + LINE_SEPARATOR +
                "     * @param pageIndex 页码" + LINE_SEPARATOR +
                "     * @param pageSize  页面大小" + LINE_SEPARATOR +
                "     * @return 查询结果" + LINE_SEPARATOR +
                "     */");
        codes.add(String.format("    List<%s> list(%s param, Integer pageIndex, Integer pageSize);",
                tableInfo.getEntityName(), tableInfo.getEntityName()));

        codes.add("}");
        printCode(codes, tableInfo.getServiceName());
    }

    /**
     * 生成Mapper代码
     *
     * @param tableInfo 表信息
     */
    private static void generateMapper(TableInfo tableInfo) {
        List<String> codes = new ArrayList<>();
        codes.add(String.format("package %s.mapper;", packagePath));
        codes.add(SPACE);
        codes.add(String.format("import %s.entity.%s;", packagePath, tableInfo.getEntityName()));
        codes.add("import org.apache.ibatis.annotations.Mapper;");
        codes.add("import org.apache.ibatis.annotations.Param;");
        codes.add(SPACE);
        codes.add("import java.util.List;");
        codes.add(SPACE);
        codes.add(String.format("/**" + LINE_SEPARATOR +
                " * %s" + LINE_SEPARATOR +
                " *" + LINE_SEPARATOR +
                " * @author auto" + LINE_SEPARATOR +
                " * @since %s" + LINE_SEPARATOR +
                " */", tableInfo.getJdbcTableName(), FORMATTER.format(LocalDateTime.now())));
        codes.add("@Mapper");
        codes.add(String.format("public interface %s {", tableInfo.getMapperName()));

        codes.add("    /**" + LINE_SEPARATOR +
                "     * 保存单条数据" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param item 数据" + LINE_SEPARATOR +
                "     */");
        codes.add(String.format("    void insert(@Param(\"item\") %s item);", tableInfo.getEntityName()));

        codes.add(SPACE);
        codes.add("    /**" + LINE_SEPARATOR +
                "     * 批量保存数据" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param list 多条数据" + LINE_SEPARATOR +
                "     */");
        codes.add(String.format("    void batchInsert(@Param(\"list\") List<%s> list);", tableInfo.getEntityName()));

        codes.add(SPACE);
        codes.add("    /**" + LINE_SEPARATOR +
                "     * 更新数据" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param item 单条数据" + LINE_SEPARATOR +
                "     */");
        codes.add(String.format("    void update(@Param(\"item\") %s item);", tableInfo.getEntityName()));

        codes.add(SPACE);
        codes.add("    /**" + LINE_SEPARATOR +
                "     * 根据id删除数据" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param id id" + LINE_SEPARATOR +
                "     */");
        codes.add(String.format("    void delete(@Param(\"id\") Integer id);"));

        codes.add(SPACE);
        codes.add("    /**" + LINE_SEPARATOR +
                "     * 单条查询" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param param 查询参数" + LINE_SEPARATOR +
                "     * @return 查询结果" + LINE_SEPARATOR +
                "     */");
        codes.add(String.format("    %s get(@Param(\"param\") %s param);", tableInfo.getEntityName(), tableInfo.getEntityName()));

        codes.add(SPACE);
        codes.add("    /**" + LINE_SEPARATOR +
                "     * 查询记录总数" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param param 查询参数" + LINE_SEPARATOR +
                "     * @return 查询结果" + LINE_SEPARATOR +
                "     */");
        codes.add(String.format("    Long count(@Param(\"param\") %s param);", tableInfo.getEntityName()));

        codes.add(SPACE);
        codes.add("    /**" + LINE_SEPARATOR +
                "     * 批量查询" + LINE_SEPARATOR +
                "     *" + LINE_SEPARATOR +
                "     * @param param     查询参数" + LINE_SEPARATOR +
                "     * @param pageStart 当前页面起始索引" + LINE_SEPARATOR +
                "     * @param pageSize  页面大小" + LINE_SEPARATOR +
                "     * @return 查询结果" + LINE_SEPARATOR +
                "     */");
        codes.add(String.format("    List<%s> list(@Param(\"param\") %s param, @Param(\"pageStart\") " +
                "Integer pageStart, @Param(\"pageSize\") Integer pageSize);", tableInfo.getEntityName(), tableInfo.getEntityName()));

        codes.add("}");
        printCode(codes, tableInfo.getMapperName());
    }

    /**
     * 打印生成的代码
     *
     * @param codes 代码
     * @param type  生成代码类型
     */
    private static void printCode(List<String> codes, String type) {
        System.out.println("====================" + type + "====================");
        System.out.println(String.join(LINE_SEPARATOR, codes));
    }

    /**
     * 解析数据库定义语句DDL
     *
     * @param ddl DDL语句(DDL从navicate复制出来,其它手写的格式不一定支持)
     * @return 解析后的表信息
     */
    private static TableInfo parseDDL(String ddl) {
        TableInfo tableInfo = new TableInfo();
        List<Property> properties = new ArrayList<>();
        String[] lines = ddl.split(LINE_SEPARATOR);
        for (String line : lines) {
            if (line == null || line.trim().isEmpty()) {
                continue;
            }
            line = line.trim().toLowerCase(Locale.ROOT);
            if (line.contains("create table")) {
                setClassName(tableInfo, line);
            } else {
                Property property = parseProperty(line);
                if (property == null) {
                    continue;
                }
                properties.add(property);
            }
        }
        tableInfo.setProperties(properties);
        return tableInfo;
    }

    /**
     * 解析表字段(类属性)
     *
     * @param line 表字段
     * @return 类属性(表字段)信息
     */
    private static Property parseProperty(String line) {
        if (!line.startsWith("`")) {
            return null;
        }
        String[] split = line.split(" ");
        Property property = new Property();
        for (int index = 0; index < split.length; index++) {
            String str = split[index];
            if (index == 0) {
                String column = str.substring(1, str.length() - 1);
                property.setColumn(column);
                property.setProperty(underLineToCamel(column));
                continue;
            }
            if (index == 1) {
                int endIndex = str.indexOf("(");
                String dbType = endIndex < 0 ? str : str.substring(0, endIndex);
                property.setDbType(dbType);
                property.setJdbcType(DB_JDBC_TYPE_MAP.getOrDefault(dbType, "UNKNOW"));
                property.setJavaType(JDBC_JAVA_TYPE_MAP.getOrDefault(property.getJdbcType(), "UNKNOW"));
                continue;
            }
            if ("comment".equals(str) && ++index < split.length) {
                String comment = split[index];
                comment = comment.substring(1, comment.length() - 2).trim();
                property.setComment(comment);
            }
        }
        return property;
    }

    /**
     * 设置表名信息,包括数据库表名和对应的实体类类名
     *
     * @param tableInfo 表信息
     * @param line      建表语句的CREATE TABLE所在行
     */
    private static void setClassName(TableInfo tableInfo, String line) {
        int start = line.indexOf("`") + 1;
        String jdbcTableName = line.substring(start, line.indexOf("`", start));
        String camel = underLineToCamel(jdbcTableName);
        String classNamePrefix = caseFirstLetterToUpper(camel);
        tableInfo.setJdbcTableName(jdbcTableName);
        tableInfo.setVariableNamePrefix(classNamePrefix);
        tableInfo.setEntityName(classNamePrefix + "Entity");
        tableInfo.setMapperName(classNamePrefix + "Mapper");
        tableInfo.setServiceName(classNamePrefix + "Service");
        tableInfo.setServiceImplName(classNamePrefix + "ServiceImpl");
        tableInfo.setControllerName(classNamePrefix + "Controller");
    }

    /**
     * 下划线转小驼峰
     *
     * @param underLine 下划线风格的变量名
     * @return 小驼峰风格的变量名
     */
    private static String underLineToCamel(String underLine) {
        StringBuilder camel = new StringBuilder();
        String[] words = underLine.split("_");
        for (int index = 0; index < words.length; index++) {
            String word = words[index];
            if (word.isEmpty()) {
                continue;
            }
            camel.append(index == 0 ? word : caseFirstLetterToUpper(word));
        }
        return camel.toString();
    }

    /**
     * 首字母转大写
     *
     * @param word 单词
     * @return 首字母转大写的单词
     */
    private static String caseFirstLetterToUpper(String word) {
        if (word.isEmpty() || word.length() == 1) {
            return word.toUpperCase(Locale.ROOT);
        }
        char letter = word.charAt(0);
        if (letter <= 'Z') {
            return word;
        }
        char upperLetter = (char) (letter - ('a' - 'A'));
        return upperLetter + word.substring(1);
    }

    /**
     * 首字母转小写
     *
     * @param word 单词
     * @return 首字母转小写的单词
     */
    private static String caseFirstLetterToLower(String word) {
        if (word.isEmpty() || word.length() == 1) {
            return word.toLowerCase(Locale.ROOT);
        }
        char letter = word.charAt(0);
        if (letter >= 'a') {
            return word;
        }
        char lowerLetter = (char) (letter + ('a' - 'A'));
        return lowerLetter + word.substring(1);
    }

    /**
     * 表信息
     */
    @Getter
    @Setter
    static class TableInfo {
        /**
         * 数据库表名
         */
        private String jdbcTableName;

        /**
         * 变量名前缀(表名转小驼峰)
         */
        private String variableNamePrefix;

        /**
         * 实体类类名
         */
        private String entityName;

        /**
         * mapper类类名
         */
        private String mapperName;

        /**
         * service类类名
         */
        private String serviceName;

        /**
         * service实现类类类名
         */
        private String serviceImplName;

        /**
         * controller类类名
         */
        private String controllerName;

        /**
         * 类属性(表字段)集合
         */
        private List<Property> properties;
    }

    /**
     * 类属性(表字段)
     */
    @Getter
    @Setter
    static class Property {
        /**
         * 表字段名
         */
        private String column;

        /**
         * 类属性名
         */
        private String property;

        /**
         * 数据库表字段类型
         */
        private String dbType;

        /**
         * jdbc类型
         */
        private String jdbcType;

        /**
         * 类属性数据类型
         */
        private String javaType;

        /**
         * 说明信息
         */
        private String comment;
    }

    public static void main(String[] args) {
        String ddl = "CREATE TABLE `person_info` (\n" +
                "  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',\n" +
                "  `name` varchar(255) NOT NULL COMMENT 'name''\"''',\n" +
                "  `sex` tinyint(1) NOT NULL COMMENT '性`别',\n" +
                "  `address` varchar(255) NOT NULL COMMENT '地址',\n" +
                "  `birthday` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '生日',\n" +
                "  `find_type` int(11) DEFAULT NULL COMMENT '测试下划线命名法',\n" +
                "  `picture` varchar(255) COMMENT '证件照',\n" +
                "  PRIMARY KEY (`id`)\n" +
                ") ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;";
        packagePath = "com.example.study";
        generateCode(ddl);
    }
}
根据映射文件生成实体类和ddl 本文档用于根据hibernate的映射文件生成相应的实体类和ddl 立即下载

相关推荐

由DDL获取JAVA实体类

根据DDL获取基本的JAVA 实体类 复制DDL create table开始部分,点击获取即可

根据数据定义语言(DDL)生成对应实体类

代码实现提供数据定义语言DDL生产对应的实体类,查看MySQL对应的Java数据类型。

qq_45714939的博客 704

TCGA之GDC-client工具下载安装与使用

文章主要是对GDC-client工具下载TCGA数据库数据整个过程的一个记录 1.下载GDC-client工具 GDC-client工具网址:GDC Data Transfer Tool | NCI Genomic Data Commons (cancer.gov) 我这里下的是上图中红圈中的版本, 2.解压安装 从网上了解的是不能解压到带中文的路径里,解压后是一个.exe文件,为了能直接在cmd命令行下使用,将其加入系统环境: 点击新建之后,输入将文件解压到的路径,然后...

better_strong的博客 1万+

Navicat 根据表生成实体类字段和备注

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34380781的博客 3976

STM32低功耗模式下ADC采样抖动的5个隐藏陷阱及解决方案(实测避坑)

本文深入探讨了STM32低功耗模式下ADC采样抖动的5个常见陷阱及解决方案,包括多通道采样电压跃迁、外设开关信号稳定、低功耗模式与ADC时钟同步、输入阻抗失配以及基准电压稳定性问题。通过实测数据和优化代码示例,帮助工程师有效规避ADC采样数据抖动问题,提升物联网设备的测量精度和稳定性。

weixin_30316097的博客 383

【回眸】Tessy集成测试软件使用指南(一)新手使用篇

这个专栏的文章前4篇都在记录如何使用Tessy进行单元测试,集成测试需要有一定单元测试基础,且做集成测试之前,需要做好单元测试,否则将会大幅增加软件单元代码纠错的代价。集成测试所花费的时间通常远远超过单元测试。如果直接从单元测试到系统测试,结果往往是不理想的。集成测试可以检测由于单元相互交互而导致的错误,通常由一组专业的测试人员执行。

啤酒鸭的物联网开发记录博客 5290

实体类一键生成DDL语句(含注解 注释【没听错是注释】) 实体类一键生成建表语句 实体类逆向生成数据库表 支持注解注释生成 springboot项目 注解生成 注释生成 代码简单 功能强大

实体类一键生成DDL

CC学java 3137

结构力学本构模型:复合材料模型:复合材料热力学行为技术教程_2024-08-07_06-54-53.Tex

热塑性复合材料是一种由热塑性树脂基体和增强纤维组成的复合材料。与热固性复合材料不同,热塑性复合材料在加热时可以软化,冷却时硬化,这一过程可以重复进行,因此它们具有可回收和可再加工的特性。热塑性树脂,如聚酰胺(尼龙)、聚碳酸酯、聚醚醚酮(PEEK)等,与碳纤维、玻璃纤维等增强材料结合,可以制备出具有高强度、高刚度和良好耐热性的复合材料。热粘弹性理论是研究材料在温度变化和时间依赖性载荷作用下的变形和应力响应。复合材料,由于其独特的微观结构,展现出复杂的热粘弹性行为。

810

mybatis中执行DDL语句

mybatis实现create,drop,alter等操作

一个想法 8188

Pixhawk2.4.8接口及引脚定义

pixhawk2.4.8接口定义图解

加斯顿工程师的博客 8753

【优化模型】求解混合整数线性规划 MILP 问题

混合整数线性规划(Mixed Integer Linear Programming,MILP)是一类优化问题,其中目标函数和约束条件均为线性,并且包含整数变量。MILP 在实际应用中具有广泛的应用,可以解决很多实际问题,如生产调度、网络设计、资源分配等。f — 系数向量。系数向量,指定为实数向量或实数数组。intcon — 整数约束组成的向量。整数约束组成的向量,指定为正整数向量。intcon 中的值指示决策变量 x 中应取整数值的分量。A — 线性不等式约束。线性不等式约束,指定为实矩阵。

Fanjufei的博客 2501

mybatis generator 自动生成 在线生成器 生成service controller 含基础增删改查 自动生成工具 只需要建表SQL语句

在线生成(目前只支持mysql):http://t.cn/Aij3HjSd 先来一个测试sql (需要注意的是,复制sql的时候,不要有特殊符号,从数据库管理工具例如navicat的DDL信息复制 ) CREATE TABLE `sys_admin_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `user_name` varchar(...

idanlan的博客 3878

假新闻检测论文分享(30)MMDFND: Multi-modal Multi-Domain Fake News Detection

现有的假新闻检测方法通常集中在单一领域的新闻上,如健康或政治。然而,社交媒体上的新闻往往来自多个领域,这给单一领域的假新闻检测方法带来了两个主要挑战:数据稀缺性:处理较小、单一领域的新闻数据集时,由于训练数据的稀缺,模型的有效性显著下降。跨领域检测的准确性下降:单一领域的假新闻检测方法在跨领域新闻数据集上的准确性大幅降低。缓解领域间模态语义偏差:通过DPLE网络提取跨领域和领域特定的知识,缓解了不同领域间文本和图像的语义差异。

weixin_41964296的博客 671

SpringBoot项目实战(38)--Beetl模板实现代码生成器(七)-- 自定义元数据表生成增删改查

本文介绍了基于Beetl模版,结合自定义的数据库元数据信息表实现增删改查低代码生成,生成的低代码是基于mybatis-plus数据库框架的。通过自定义数据库元数据库表,可以设置字段组件类型、是否在列表页或编辑页显示、是否作为查询条件字段等。

baozhengw的专栏 1215

Autosar诊断实战系列07-Dcm之0x19 06扩展数据配置及工程问题讨论

19 06扩展数据如何配置?如果某DTC没有出现过故障扩展数据该如何响应?

initiallizer的博客 1705

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Mybatis的mapper.xml配置文件——详解

&amp;amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;amp;gt; select * from user where id = #{id} select * from orders

qq_42780864的博客 4万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

MyBatis实现增删改查&优化

MyBatis增删改查&优化 一、概述 0、框架介绍 框架是一款半成品软件,我们可以基于这个半成品软件继续开发,来完成我们个性化的需求! 前提:ORM介绍 ORM(Object Relational Mapping): 对象关系映射 指的是持久化数据和实体对象的映射模式,为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。 如图: 具体映射关系如下图: 1.现在JDBC代码的问题 1.存在大量的冗余代码,不同表的DAO操作,操作步骤只是Sql语句不同 2.给?

程序员小王的博客 1888

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

AI如何革新MyBatis开发:从Generator到智能代码生成

作为一名常年与数据库打交道的开发人员,我深刻体会到手写MyBatis实体类和Mapper文件的繁琐。最近尝试用AI改造传统代码生成流程,发现效率提升的不是一点点。的AI辅助功能确实让ORM开发轻松不少。特别是部署测试时,不用折腾本地环境就能直接验证生成效果,对于需要快速验证数据库交互的项目特别友好。尤其当项目涉及几十张表时,这种重复劳动会消耗大量时间。

CyanWave34的博客 686

JDBC---Mybatis数据库连接

本文介绍了使用Maven和SpringBoot进行Web后端开发的基础知识。主要内容包括:1)通过Spring Initializr创建项目模块的两种方法;2)Maven依赖配置和JUnit单元测试;3)SpringBoot入门操作,包括三层架构和IOC注解;4)MySQL数据库安装及DDL操作;5)JDBC连接数据库和基本CRUD操作;6)MyBatis框架的使用,包括配置、注解方式和XML映射配置;7)SpringBoot配置文件的优化,从properties转换到yml格式。文章详细说明了从基础环境搭

2401_86386329的博客 1027

mybatis-plus简单使用

mybatis-plus简单使用官方网址mybatis和JPA比较mybatis-plus和mybatis比较mysql建表DDL、DMLmaven添加依赖包基本使用通用新增方法常用注解排除非表字段的3种方式Mybatis-Plus查询方法普通查询(selectById、selectBatchIds、selectByMap)条件构造器查询select不列出全部字段condition作用实体类作为条...

@龙猫的博客 1万+

mybatis使用非增删改查语句

项目中一直使用mybatis,但是对于它的了解还是停留在会用的阶段,会用基本的sql和一些动态sql并且进行的操作也都只是DML(Data Manipulation Language 数据操控语言)的,对于DDL(Data Definition Language 数据定义语言)的操作还未知,最近项目中恰巧需要进行DDL操作,进行简单的记录。原文链接:https://blog.youkuaiyun.com/ww130929/article/details/70210771。

m0_53694418的博客 276

mybatis 中 DDL && DML

      在mapper.xml中一般都是对表数据进行DML(增删改查)操作,很少通过MyBatis对数据库进行DDL(create, alter, drop)操作,下面就mybatis的DDL给大家做个简单介绍。 在相关mapper.xml文件中DDL的配置代码如下: &lt;update id="alterTableName"&gt; alter table ...

fz13768884254的博客 2996

MyBatis-Plus代码生成器实战:从原理到配置,一键生成CRUD代码

在Java企业级开发中,ORM框架是连接数据库与业务逻辑的关键组件,它通过对象关系映射原理,将数据库表结构映射为Java对象,简化了数据持久化操作。MyBatis作为一款流行的半自动化ORM框架,提供了灵活的SQL编写能力,而MyBatis-Plus在其基础上增强了通用CRUD操作,进一步提升了开发效率。其核心价值在于通过代码生成器自动化生成基础数据访问层代码,将开发者从重复的实体类、Mapper接口和XML文件编写中解放出来,实现标准化与工程化。这一技术特别适用于快速构建后台管理系统、微服务数据层等需要大

weixin_34238633的博客 456
上一篇: OpenPDF使用教程及样例代码
下一篇: 分别使用dom4j和jdk自带的方法解析xml文件
java_t_t
博客等级 码龄9年 171粉丝 107原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值