最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)一鍵生成表controller,service,mapper文件

 更新時(shí)間:2023年05月17日 15:39:54   作者:zyqok  
這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)一鍵生成表controller,service,mapper文件,文中的示例代碼講解詳細(xì),需要的可以收藏一下

controller、service、Mapper文件的作用

Controller:控制器

業(yè)務(wù)模塊流程的控制,不同的業(yè)務(wù)流程有不同的控制器

負(fù)責(zé)請(qǐng)求轉(zhuǎn)發(fā),接收頁(yè)面過(guò)來(lái)的參數(shù),傳給service處理,接到返回值,并再次傳給頁(yè)面

  • 控制處理前端請(qǐng)求和響應(yīng),與前端進(jìn)行交互,給前端提供接口
  • 調(diào)用Service層(定義的接口)
  • 如果只是簡(jiǎn)單增刪可以調(diào)用Mapper(不推薦)

Service:服務(wù)

相對(duì)獨(dú)立,負(fù)責(zé)業(yè)務(wù)邏輯(功能)的設(shè)計(jì),是一個(gè)接口類

Mapper:(DAO)

訪問(wèn)數(shù)據(jù)庫(kù),對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,提供接口給Service層

  • 當(dāng)sql語(yǔ)句發(fā)生變化更改時(shí),我們可以只修改對(duì)應(yīng)的XML文件,而無(wú)需再修改Mapper,這樣每次更改sql語(yǔ)句時(shí),代碼就可以不用再次重新編譯!
  • 直接與數(shù)據(jù)庫(kù)打交道(執(zhí)行SQL語(yǔ)句),接口提供給service層

下圖為java約定俗成的幾個(gè)文件的作用

實(shí)現(xiàn)代碼

package com.unisoc.isupport.utils;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * @author Yuanqiang.Zhang
 * @since 2023/5/15
 */
public class GeneratorTool {
    /**
     * 數(shù)據(jù)庫(kù)連接信息
     */
    private static String IP = "172.0.0.1";
    private static int PORT = 3306;
    private static String DATABASE_NAME = "zyq_test";
    private static String USERNAME = "root";
    private static String PASSWORD = "root";
    /**
     * 創(chuàng)建者
     */
    private static String AUTHOR = "YuanQiang.Zhang";
    /**
     * 基礎(chǔ)包路徑
     */
    private static String BASE_PACKAGE = "com.zdb";
    /**
     * 需要生成的表
     */
    private static String[] TABLE_NAMES = {"z_word"};
    /**
     * 忽略的前綴
     */
    private static String[] IGNORE_PREFIX = {"z_"};
    /**
     * 主方法運(yùn)行
     *
     * @param args args
     */
    public static void main(String[] args) {
        Connection conn = getConnection();
        for (String tableName : TABLE_NAMES) {
            createTableFiles(conn, tableName);
        }
    }
    private static String getWithoutPrefixTableName(String tableName) {
        if (IGNORE_PREFIX.length == 0) {
            return tableName;
        }
        for (String s : IGNORE_PREFIX) {
            if (tableName.startsWith(s)) {
                return tableName.substring(s.length());
            }
        }
        return tableName;
    }
    public static void createTableFiles(Connection conn, String tableName) {
        List<String[]> fields = getTableFields(conn, tableName);
        String withoutPrefixTableName = getWithoutPrefixTableName(tableName);
        String className = getClassName(withoutPrefixTableName);
        createEntity(fields, tableName, className, withoutPrefixTableName);
//        createMapper(withoutPrefixTableName, className);
//        createMapperXml(withoutPrefixTableName, className);
//        createService(withoutPrefixTableName, className);
//        createServiceImpl(withoutPrefixTableName, className);
//        createController(withoutPrefixTableName, className);
    }
    public static void createController(String tableName, String className) {
        StringBuilder sb = new StringBuilder();
        sb.append(String.format("package %s.controller;\n\n", BASE_PACKAGE));
        sb.append(String.format("import %s.service.%sService;\n", BASE_PACKAGE, className));
        sb.append("import lombok.extern.slf4j.Slf4j;\n");
        sb.append("import org.springframework.web.bind.annotation.RequestMapping;\n");
        sb.append("import org.springframework.web.bind.annotation.RestController;\n");
        sb.append("import org.springframework.beans.factory.annotation.Autowired;\n\n");
        sb.append("/**\n");
        sb.append(String.format(" * @author %s\n", AUTHOR));
        sb.append(String.format(" * @since %s\n", formatDateTime(new Date())));
        sb.append(" */\n");
        sb.append("@RestController\n");
        sb.append("@Slf4j\n");
        String path = String.valueOf(className.toCharArray()[0]).toLowerCase() + className.substring(1);
        sb.append(String.format("@RequestMapping(\"/%s\")\n", path));
        sb.append(String.format("public class %sController {\n\n", className));
        sb.append("    @Autowired\n");
        sb.append(String.format("    private %sService service;\n\n", className));
        sb.append("}\n");
        String fileName = className + "Controller.java";
        String filePath = getBasePath() + "/controller/" + fileName;
        File file = new File(filePath);
        if (file.exists()) {
            System.out.println(tableName + " 的 Controller 類已經(jīng)存在,不再生成。");
        } else {
            writeFileContent(file, sb.toString());
            System.out.println(tableName + " 的 Controller 類生成完畢。");
        }
    }
    public static void createServiceImpl(String tableName, String className) {
        StringBuilder sb = new StringBuilder();
        sb.append(String.format("package %s.service.impl;\n\n", BASE_PACKAGE));
        sb.append("import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n");
        sb.append(String.format("import %s.entity.%s;\n", BASE_PACKAGE, className));
        sb.append(String.format("import %s.mapper.%sMapper;\n", BASE_PACKAGE, className));
        sb.append(String.format("import %s.service.%sService;\n", BASE_PACKAGE, className));
        sb.append("import lombok.extern.slf4j.Slf4j;\n");
        sb.append("import org.springframework.beans.factory.annotation.Autowired;\n");
        sb.append("import org.springframework.stereotype.Service;\n\n");
        sb.append("/**\n");
        sb.append(String.format(" * @author %s\n", AUTHOR));
        sb.append(String.format(" * @since %s\n", formatDateTime(new Date())));
        sb.append(" */\n");
        sb.append("@Slf4j\n");
        sb.append("@Service\n");
        sb.append(String.format("public class %sServiceImpl extends ServiceImpl<%sMapper, %s> implements %sService { \n\n", className, className, className, className));
        sb.append("    @Autowired\n");
        sb.append(String.format("    private %sMapper mapper;\n\n", className));
        sb.append("}\n");
        String fileName = className + "ServiceImpl.java";
        String filePath = getBasePath() + "/service/impl/" + fileName;
        File file = new File(filePath);
        if (file.exists()) {
            System.out.println(tableName + " 的 ServiceImpl 已經(jīng)存在,不再生成。");
        } else {
            writeFileContent(file, sb.toString());
            System.out.println(tableName + " 的 ServiceImpl 生成完畢。");
        }
    }
    public static void createService(String tableName, String className) {
        StringBuilder sb = new StringBuilder();
        sb.append(String.format("package %s.service;\n\n", BASE_PACKAGE));
        sb.append("import com.baomidou.mybatisplus.extension.service.IService;\n");
        sb.append(String.format("import %s.entity.%s;\n\n", BASE_PACKAGE, className));
        sb.append("/**\n");
        sb.append(String.format(" * @author %s\n", AUTHOR));
        sb.append(String.format(" * @since %s\n", formatDateTime(new Date())));
        sb.append(" */\n");
        sb.append(String.format("public interface %sService extends IService<%s> {\n\n", className, className));
        sb.append("}\n");
        String fileName = className + "Service.java";
        String filePath = getBasePath() + "/service/" + fileName;
        File file = new File(filePath);
        if (file.exists()) {
            System.out.println(tableName + " 的 Service 類已經(jīng)存在,不再生成。");
        } else {
            writeFileContent(file, sb.toString());
            System.out.println(tableName + " 的 Service 類生成完畢。");
        }
    }
    public static void createMapperXml(String tableName, String className) {
        StringBuilder sb = new StringBuilder();
        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
        sb.append("<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n");
        sb.append(String.format("<mapper namespace=\"%s.mapper.%sMapper\">\n\n", BASE_PACKAGE, className));
        sb.append("</mapper>\n");
        String fileName = className + "Mapper.xml";
        String filePath = "src/main/resources/mapper/" + fileName;
        File file = new File(filePath);
        if (file.exists()) {
            System.out.println(tableName + " 的 Mapper.xml 已經(jīng)存在,不再生成。");
        } else {
            writeFileContent(file, sb.toString());
            System.out.println(tableName + " 的 Mapper.xml 生成完畢。");
        }
    }
    public static void createMapper(String tableName, String className) {
        StringBuilder sb = new StringBuilder();
        sb.append(String.format("package %s.mapper;\n\n", BASE_PACKAGE));
        sb.append(String.format("import %s.entity.%s;\n", BASE_PACKAGE, className));
        sb.append("import com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n");
        sb.append("/**\n");
        sb.append(String.format(" * @author %s\n", AUTHOR));
        sb.append(String.format(" * @since %s\n", formatDateTime(new Date())));
        sb.append(" */\n");
        sb.append(String.format("public interface %sMapper extends BaseMapper<%s> {\n\n", className, className));
        sb.append("}\n");
        String fileName = className + "Mapper.java";
        String filePath = getBasePath() + "/mapper/" + fileName;
        File file = new File(filePath);
        if (file.exists()) {
            System.out.println(tableName + " 的 Mapper 類已經(jīng)存在,不再生成。");
        } else {
            writeFileContent(file, sb.toString());
            System.out.println(tableName + " 的 Mapper 類生成完畢。");
        }
    }
    public static void createEntity(List<String[]> fields, String tableName, String className, String withoutPrefixTableName) {
        StringBuilder sb = new StringBuilder();
        sb.append(String.format("package %s.entity;\n\n", BASE_PACKAGE));
        sb.append("import com.baomidou.mybatisplus.annotation.*;\n");
        sb.append("import lombok.Data;\n\n");
        // 判斷是否有 timestamp 類型
        if (hasDate(fields)) {
            sb.append("import java.util.Date;\n\n");
        }
        sb.append("/**\n");
        sb.append(" * @author " + AUTHOR + "\n");
        sb.append(" * @since " + formatDateTime(new Date()) + "\n");
        sb.append(" */\n");
        sb.append("@Data\n");
        sb.append(String.format("@TableName(\"%s\")\n", tableName));
        sb.append(String.format("public class %s {\n\n", className));
        for (String[] attrs : fields) {
            String columnName = attrs[0];
            String dataType = attrs[1];
            String columnComment = attrs[2];
            String columnKey = attrs[3];
            if ("PRI".equals(columnKey)) {
                sb.append("    /** 主鍵 */\n");
                sb.append(String.format("    @TableId(value = \"%s\", type = IdType.AUTO)\n", columnName));
            } else {
                if (Objects.nonNull(columnComment) && !columnComment.isEmpty()) {
                    sb.append(String.format("    /** %s */\n", columnComment));
                }
                sb.append(String.format("    @TableField(value = \"%s\")\n", columnName));
            }
            String fieldName = getFieldName(columnName);
            if (dataType.endsWith("int")) {
                if ("bigint".equals(dataType)) {
                    sb.append(String.format("    private Long %s;\n", fieldName));
                } else {
                    sb.append(String.format("    private Integer %s;\n", fieldName));
                }
            } else if (dataType.endsWith("char") || dataType.endsWith("text")) {
                sb.append(String.format("    private String %s;\n", fieldName));
            } else if ("timestamp".equals(dataType) || "datetime".equals(dataType)) {
                sb.append(String.format("    private Date %s;\n", fieldName));
            } else if ("double".equals(dataType)) {
                sb.append(String.format("    private Double %s;\n", fieldName));
            } else {
                System.err.println("發(fā)現(xiàn)沒(méi)有判斷到的數(shù)據(jù)類型:" + dataType);
            }
            sb.append("\n");
        }
        sb.append("\n}");
        String fileName = className + ".java";
        String filePath = getBasePath() + "/entity/" + fileName;
        File file = new File(filePath);
        if (file.exists()) {
            System.out.println(withoutPrefixTableName + " 的 Entity 類已經(jīng)存在,不再生成。");
        } else {
            writeFileContent(file, sb.toString());
            System.out.println(withoutPrefixTableName + " 的 Entity 類生成完畢。");
        }
    }
    private static String getBasePath() {
        return "src/main/java/" + BASE_PACKAGE.replace(".", "/");
    }
    private static String getFieldName(String columnName) {
        if (!columnName.contains("_")) {
            StringBuilder sb = new StringBuilder();
            char[] chars = columnName.toCharArray();
            sb.append(String.valueOf(chars[0]).toLowerCase());
            if (chars.length <= 1) {
                return sb.toString();
            } else {
                for (int i = 1; i < chars.length; i++) {
                    sb.append(chars[i]);
                }
            }
            return sb.toString();
        }
        String s = getClassName(columnName);
        return String.valueOf(s.toCharArray()[0]).toLowerCase() + s.substring(1);
    }
    private static boolean hasDate(List<String[]> fields) {
        if (Objects.isNull(fields) || fields.isEmpty()) {
            return false;
        }
        for (String[] attrs : fields) {
            String dataType = attrs[1];
            if ("timestamp".equals(dataType) || "datetime".equals(dataType)) {
                return true;
            }
        }
        return false;
    }
    private static List<String[]> getTableFields(Connection conn, String tableName) {
        String sql = "SELECT * FROM information_schema.columns WHERE table_schema = '" + DATABASE_NAME + "' AND table_name = '" + tableName + "'";
        List<String[]> fields = new ArrayList<>();
        try {
            Statement stat = conn.createStatement();
            ResultSet rs = stat.executeQuery(sql);
            while (rs.next()) {
                String columnName = rs.getString("COLUMN_NAME");
                String dataType = rs.getString("DATA_TYPE");
                String columnComment = rs.getString("COLUMN_COMMENT");
                String columnKey = rs.getString("COLUMN_KEY");
                String[] attrs = new String[4];
                attrs[0] = columnName;
                attrs[1] = dataType;
                attrs[2] = columnComment;
                attrs[3] = columnKey;
                fields.add(attrs);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return fields;
    }
    /**
     * 獲取類名
     *
     * @param tableName 表名
     * @return 類名
     */
    private static String getClassName(String tableName) {
        char[] chars = tableName.toCharArray();
        boolean flag = true;
        StringBuilder sb = new StringBuilder();
        for (char c : chars) {
            if (c == '_') {
                flag = true;
                continue;
            }
            if (flag) {
                sb.append(String.valueOf(c).toUpperCase());
            } else {
                sb.append(String.valueOf(c).toLowerCase());
            }
            flag = false;
        }
        return sb.toString();
    }
    /**
     * 獲取數(shù)據(jù)庫(kù)鏈接
     *
     * @return Connection
     */
    private static Connection getConnection() {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = String.format("jdbc:mysql://%s:%s/%s", IP, PORT, DATABASE_NAME);
            return DriverManager.getConnection(url, USERNAME, PASSWORD);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 將內(nèi)容寫入到文件中
     *
     * @param file    文件
     * @param content 內(nèi)容
     */
    public static void writeFileContent(File file, String content) {
        String parentPath = file.getParent();
        if (Objects.nonNull(parentPath) && !parentPath.isEmpty()) {
            File parent = new File(parentPath);
            if (!parent.exists()) {
                parent.mkdirs();
            }
        }
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try (FileWriter writer = new FileWriter(file)) {
            writer.write(content);
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private static String formatDateTime(Date date) {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(date);
    }
}

到此這篇關(guān)于Java實(shí)現(xiàn)一鍵生成表controller,service,mapper文件的文章就介紹到這了,更多相關(guān)Java生成文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于mybatis一對(duì)多查詢內(nèi)層排序的問(wèn)題

    基于mybatis一對(duì)多查詢內(nèi)層排序的問(wèn)題

    這篇文章主要介紹了基于mybatis一對(duì)多查詢內(nèi)層排序的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • Spring實(shí)現(xiàn)方式、隔離級(jí)別與傳播機(jī)制全攻略

    Spring實(shí)現(xiàn)方式、隔離級(jí)別與傳播機(jī)制全攻略

    本文介紹了Spring事務(wù)的基礎(chǔ)概念、實(shí)現(xiàn)方式、核心注解配置、隔離級(jí)別和傳播機(jī)制,并通過(guò)實(shí)際場(chǎng)景詳細(xì)解析了事務(wù)傳播機(jī)制的7種行為,感興趣的朋友跟隨小編一起看看吧
    2026-04-04
  • SpringCloud中Gateway的使用教程詳解

    SpringCloud中Gateway的使用教程詳解

    SpringCloud?Gateway是Spring體系內(nèi)的一個(gè)全新項(xiàng)目,它旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的統(tǒng)一的API路由管理方式。本文就來(lái)為大家詳細(xì)講講Gateway的使用教程,需要的可以參考一下
    2022-08-08
  • 基于controller使用map接收參數(shù)的注意事項(xiàng)

    基于controller使用map接收參數(shù)的注意事項(xiàng)

    這篇文章主要介紹了基于controller使用map接收參數(shù)的注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 多個(gè)sheet Excel 數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法

    多個(gè)sheet Excel 數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法

    這篇文章主要介紹了多個(gè)sheet Excel 數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • java檢測(cè)一個(gè)字符串是否是時(shí)間格式

    java檢測(cè)一個(gè)字符串是否是時(shí)間格式

    這篇文章主要為大家詳細(xì)介紹了一個(gè)Java方法isValidDate,用于驗(yàn)證字符串是否符合24小時(shí)制時(shí)間格式"HH:mm",文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2026-03-03
  • Spring 框架之Springfox使用詳解

    Spring 框架之Springfox使用詳解

    Springfox是Spring框架的API文檔工具,集成Swagger規(guī)范,自動(dòng)生成文檔并支持多語(yǔ)言/版本,模塊化設(shè)計(jì)便于擴(kuò)展,但存在版本兼容性、性能開(kāi)銷及對(duì)WebFlux支持不足等缺點(diǎn),適合傳統(tǒng)SpringMVC項(xiàng)目,本文介紹Springfox使用,感興趣的朋友一起看看吧
    2025-06-06
  • JavaWeb項(xiàng)目中DLL文件動(dòng)態(tài)加載方法

    JavaWeb項(xiàng)目中DLL文件動(dòng)態(tài)加載方法

    在JavaWeb項(xiàng)目中,有時(shí)候我們需要在運(yùn)行時(shí)動(dòng)態(tài)加載DLL文件(在Windows中是DLL,在Linux中是SO文件),這通常用于實(shí)現(xiàn)一些特定的功能,比如調(diào)用本機(jī)代碼或者使用某些特定于操作系統(tǒng)的API,本文將介紹如何在JavaWeb項(xiàng)目中動(dòng)態(tài)加載DLL文件,需要的朋友可以參考下
    2024-12-12
  • Spring中使用@Value注解注入屬性文件中的值詳解

    Spring中使用@Value注解注入屬性文件中的值詳解

    這篇文章主要介紹了Spring中使用@Value注解注入屬性文件中的值詳解,通過(guò)Spring的@Value注解可以將xml中關(guān)聯(lián)的屬性文件中的值注入變量中,這樣就不需要通過(guò)創(chuàng)建Properties然后根據(jù)屬性文件讀取屬性值了,需要的朋友可以參考下
    2023-12-12
  • Java正則表達(dá)式超詳細(xì)講解(簡(jiǎn)單易懂版)

    Java正則表達(dá)式超詳細(xì)講解(簡(jiǎn)單易懂版)

    前段時(shí)間使用Java的正則表達(dá)式做一些字符串匹配的任務(wù),現(xiàn)將學(xué)到的正則表達(dá)式的知識(shí)整理成文,這篇文章主要介紹了Java正則表達(dá)式的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-06-06

最新評(píng)論

同仁县| 夏津县| 赫章县| 汝州市| 麻阳| 冀州市| 全州县| 永昌县| 南川市| 苗栗县| 建昌县| 黄梅县| 乌兰县| 彩票| 宜兰市| 平安县| 长葛市| 视频| 武定县| 松潘县| 舟山市| 扎鲁特旗| 寿光市| 安图县| 巫溪县| 双牌县| 怀来县| 漠河县| 大化| 泰顺县| 凉城县| 睢宁县| 营山县| 班玛县| 丰台区| 朝阳县| 万安县| 洛扎县| 颍上县| 台南市| 永靖县|