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

如何讓java只根據(jù)數(shù)據(jù)庫(kù)表名自動(dòng)生成實(shí)體類(lèi)

 更新時(shí)間:2021年06月10日 08:42:15   作者:ypp91zr  
今天給大家?guī)?lái)的知識(shí)是關(guān)于Java的,文章圍繞著如何讓java只根據(jù)數(shù)據(jù)庫(kù)表名自動(dòng)生成實(shí)體類(lèi)展開(kāi),文中有非常詳細(xì)的介紹,需要的朋友可以參考下

根據(jù)數(shù)據(jù)庫(kù)表名生成實(shí)體類(lèi)

公司用的jpa,沒(méi)有用mybatis。所以也沒(méi)有用mybatis自動(dòng)生成。但有些數(shù)據(jù)庫(kù)表字段太多,就想著一勞永逸了,連數(shù)據(jù)庫(kù)注釋都搞上去

第一種

這里使用的是jdbcTemplate+Junit測(cè)試生成,方式可變。

SpringBoot版本是2.4.4,只需要加上@SpringBootTest就可以了。不用@RunWith

pom:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

代碼

package com.shinedata.bims.web;
 
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
 
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
/**
 * @ClassName TestController
 * @Author yupanpan
 * @Date 2021/4/12 14:24
 */
@SpringBootTest
public class TestController {
 
    @Autowired
    private JdbcTemplate jdbcTemplate;
 
    @Test
    public void database(){
        createEntity("1ceping", "t_evaluation_template_info_copy","com.shinedata.bims.entity",false);
    }
 
    /**
     *
     * @param dataBaseName 數(shù)據(jù)庫(kù)名
     * @param tableName 表名
     * @param packageName 包名
     * @param isAddEntitySuffix 類(lèi)名是否添加Entity后綴 true-添加 false-不添加
     */
    public void createEntity(String dataBaseName,String tableName,String packageName,boolean isAddEntitySuffix){
        String className=tableName;
        if(tableName.substring(0,2).equals("t_")){
            StringBuilder stringBuilder = new StringBuilder(tableName);
            stringBuilder.replace(0, 2, "");
            String initialsUpperCase = stringBuilder.substring(0, 1).toUpperCase();
            className=initialsUpperCase+stringBuilder.substring(1);
        }
        className=removeUnderline(className)+(isAddEntitySuffix?"Entity":"");
 
        StringBuffer classBuffer=new StringBuffer();
        classBuffer.append("import java.util.Date;\r\n");
        classBuffer.append("import java.time.LocalDateTime;\r\n");
        classBuffer.append("import com.alibaba.fastjson.JSONObject;\r\n");
        classBuffer.append("import java.lang.*;\r\n");
        classBuffer.append("import java.math.*;\r\n");
        classBuffer.append("import java.sql.*;\r\n");
        classBuffer.append("import lombok.Data;\r\n\r\n\r\n");
        classBuffer.append("@Data\r\n");
        classBuffer.append("public class " + className + " {\r\n\r\n");
        List<Map> filedMaps = getFiledMaps(dataBaseName, tableName);
        processAllAttrs(classBuffer,filedMaps);
        classBuffer.append("}\r\n");
        markerBean(className,classBuffer.toString(),packageName);
    }
 
    /**
     * 創(chuàng)建實(shí)體類(lèi)文件
     * @param className 類(lèi)名(不包含.java文件名后綴) 根據(jù)表名首字母大寫(xiě)并去掉開(kāi)頭t_和所有下劃線-駝峰命名
     * @param content 添加的內(nèi)容(字段注釋等)
     * @param packageName 包名(com.xxx.xxx.xxx)
     */
    public void markerBean(String className, String content, String packageName) {
        String folder = System.getProperty("user.dir") + "/src/main/java/" + packageName.replace(".","/") + "/";
        File file = new File(folder);
        if (!file.exists()) {
            file.mkdirs();
        }
        String fileName = folder + className + ".java";
        try {
            File newjava = new File(fileName);
            FileWriter fw = new FileWriter(newjava);
            fw.write("package\t" + packageName + ";\r\n");
            fw.write(content);
            fw.flush();
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 解析輸出屬性
     *
     * @return
     */
    private void processAllAttrs(StringBuffer sb,List<Map> filedMaps) {
        for (int i = 0; i < filedMaps.size(); i++) {
            Map map = filedMaps.get(i);
            String fieldType = MapUtils.getString(map, "fieldType");
            String fieldName = MapUtils.getString(map, "fieldName");
            String fieldComment = MapUtils.getString(map, "fieldComment");
            if(StringUtils.isNotBlank(fieldComment)){
                sb.append("\t/**\r\n").append("\t* ").append(fieldComment).append("\n").append("\t*/\r\n");
            }
            sb.append("\tprivate " + fieldType + " " + fieldName + ";\r\n\r\n");
        }
    }
 
    /**
     * 獲取表字段信息(列名、類(lèi)型、注釋等)
     * @param dataBaseName
     * @param tableName
     * @return
     */
    private List<Map> getFiledMaps(String dataBaseName,String tableName) {
        String sql="SELECT * FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA ='"+dataBaseName+"' AND TABLE_NAME = '"+tableName+"'";
        List<Map> tableFieldList = jdbcTemplate.query(sql, new RowMapper<Map>() {
            @Override
            public Map<String,String> mapRow(ResultSet resultSet, int rowNum) throws SQLException {
                Map<String,String> fieldMap = new HashMap();
                String column_name = resultSet.getString("COLUMN_NAME");
                setFieldName(column_name.toLowerCase(),fieldMap);
                String data_type = resultSet.getString("DATA_TYPE");
                setFieldType(data_type.toUpperCase(),fieldMap);
                fieldMap.put("fieldComment",resultSet.getString("COLUMN_COMMENT"));
                return fieldMap;
            }
        });
        return tableFieldList;
    }
 
 
    private void setFieldName(String columnName, Map fieldMap) {
        fieldMap.put("fieldName",removeUnderline(columnName));
    }
 
    /**
     * 去下劃線
     * @param string
     * @return
     */
    public String removeUnderline(String string){
        StringBuilder columnNameBuilder=new StringBuilder(string);
        if(!string.contains("_")){
            return string;
        }else {
            int i = columnNameBuilder.indexOf("_");
            columnNameBuilder.replace(i,i+1, "").replace(i,i+1,columnNameBuilder.substring(i,i+1).toUpperCase());
            return removeUnderline(columnNameBuilder.toString());
        }
    }
 
    private void setFieldType(String columnType,Map fieldMap){
        String fieldType="String";
        if(columnType.equals("INT")||columnType.equals("INTEGER")){
            fieldType="Integer";
        }else if(columnType.equals("BIGINT")){
            fieldType="Long";
        }else if(columnType.equals("DATETIME")){
            fieldType="Date";
        }else if(columnType.equals("TEXT")||columnType.equals("VARCHAR")||columnType.equals("TINYTEXT")||columnType.equals("LONGTEXT")){
            fieldType="String";
        }else if(columnType.equals("DOUBLE")){
            fieldType="Double";
        }else if(columnType.equals("BIT")){
            fieldType="Boolean";
        }else if(columnType.equals("FLOAT")){
            fieldType="Float";
        }else if(columnType.equals("DECIMAL")){
            fieldType="BigDecimal";
        }else if(columnType.equals("DATE")){
            fieldType="Date";
        }else if(columnType.equals("TIMESTAMP")){
            fieldType="LocalDateTime";
        }else if(columnType.equals("CHAR")){
            fieldType="Char";
        }else if(columnType.equals("JSON")){//mysql5.7版本才開(kāi)始有的
            fieldType="JSONObject";
        }
        fieldMap.put("fieldType",fieldType);
    }
 
}

生成的類(lèi)

用的lombok,就懶得去搞getset了

第二種

搞的是直接main方法運(yùn)行下就生成,大同小異。不用Junit,方便一些,就是個(gè)工具。和第一種結(jié)果一樣的

package com.shinedata.bims.web;
 
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
 
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.*;
import java.util.*;
 
/**
 * @ClassName TableToEntityUtils
 * @Author yupanpan
 * @Date 2021/6/8 17:25
 */
public class TableToEntityUtils {
 
 
    static final String USER = "root";
    static final String PASS = "xxxxxxxxxxx";
//    static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    // MySQL 8.0 以下版本 - JDBC 驅(qū)動(dòng)名及數(shù)據(jù)庫(kù) URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://xxxxxxxxxxxxxxxxxxxxxxx:3306/1ceping?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&allowMultiQueries=true&rewriteBatchedStatements=true";
 
    public static void main(String[] args) throws Exception {
        createEntity("1ceping", "t_evaluation_template_info_copy","com.shinedata.bims.entity",false);
    }
 
    /**
     *
     * @param dataBaseName 數(shù)據(jù)庫(kù)名
     * @param tableName 表名
     * @param packageName 包名
     * @param isAddEntitySuffix 類(lèi)名是否添加Entity后綴 true-添加 false-不添加
     */
    public static void createEntity(String dataBaseName, String tableName, String packageName, boolean isAddEntitySuffix) throws Exception{
        String className=tableName;
        if(tableName.substring(0,2).equals("t_")){
            StringBuilder stringBuilder = new StringBuilder(tableName);
            stringBuilder.replace(0, 2, "");
            String initialsUpperCase = stringBuilder.substring(0, 1).toUpperCase();
            className=initialsUpperCase+stringBuilder.substring(1);
        }
        className=removeUnderline(className)+(isAddEntitySuffix?"Entity":"");
 
        StringBuffer classBuffer=new StringBuffer();
        classBuffer.append("import java.util.Date;\r\n");
        classBuffer.append("import java.time.LocalDateTime;\r\n");
        classBuffer.append("import com.alibaba.fastjson.JSONObject;\r\n");
        classBuffer.append("import java.lang.*;\r\n");
        classBuffer.append("import java.math.*;\r\n");
        classBuffer.append("import java.sql.*;\r\n");
        classBuffer.append("import lombok.Data;\r\n\r\n\r\n");
        classBuffer.append("@Data\r\n");
        classBuffer.append("public class " + className + " {\r\n\r\n");
        List<Map> filedMaps = getFiledMaps(dataBaseName, tableName);
        processAllAttrs(classBuffer,filedMaps);
        classBuffer.append("}\r\n");
        markerBean(className,classBuffer.toString(),packageName);
    }
 
    /**
     * 創(chuàng)建實(shí)體類(lèi)文件
     * @param className 類(lèi)名(不包含.java文件名后綴) 根據(jù)表名首字母大寫(xiě)并去掉開(kāi)頭t_和所有下劃線-駝峰命名
     * @param content 添加的內(nèi)容(字段注釋等)
     * @param packageName 包名(com.xxx.xxx.xxx)
     */
    public static void markerBean(String className, String content, String packageName) throws Exception {
//      這里不使用System.getProperty("user.dir")了。user.dir是根據(jù)運(yùn)行時(shí)環(huán)境來(lái)的
        File f2 = new File(TableToEntityUtils.class.getResource("/").getPath());
        String homePath=f2.getCanonicalPath().replace("\\target\\classes", "");
        String folder = homePath + "/src/main/java/" + packageName.replace(".","/") + "/";
        File file = new File(folder);
        if (!file.exists()) {
            file.mkdirs();
        }
        String fileName = folder + className + ".java";
        try {
            File newjava = new File(fileName);
            FileWriter fw = new FileWriter(newjava);
            fw.write("package\t" + packageName + ";\r\n");
            fw.write(content);
            fw.flush();
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 去下劃線
     * @param string
     * @return
     */
    public static String removeUnderline(String string){
        StringBuilder columnNameBuilder=new StringBuilder(string);
        if(!string.contains("_")){
            return string;
        }else {
            int i = columnNameBuilder.indexOf("_");
            columnNameBuilder.replace(i,i+1, "").replace(i,i+1,columnNameBuilder.substring(i,i+1).toUpperCase());
            return removeUnderline(columnNameBuilder.toString());
        }
    }
 
    /**
     * 獲取表字段信息(列名、類(lèi)型、注釋等)
     * @param dataBaseName
     * @param tableName
     * @return
     */
    private static List<Map> getFiledMaps(String dataBaseName, String tableName) {
        Connection conn = null;
        Statement stmt = null;
        List<Map> tableFieldList=new ArrayList<>();
        try{
            // 注冊(cè) JDBC 驅(qū)動(dòng)
            Class.forName(JDBC_DRIVER);
            conn = DriverManager.getConnection(DB_URL,USER,PASS);
            // 執(zhí)行查詢(xún)
            stmt = conn.createStatement();
            String sql= "SELECT * FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA ='"+dataBaseName+"' AND TABLE_NAME= '"+tableName+"'";
            ResultSet rs = stmt.executeQuery(sql);
            while (rs.next()) {
                Map<String,String> fieldMap = new HashMap();
                String column_name = rs.getString("COLUMN_NAME");
                setFieldName(column_name.toLowerCase(),fieldMap);
                String data_type = rs.getString("DATA_TYPE");
                setFieldType(data_type.toUpperCase(),fieldMap);
                fieldMap.put("fieldComment",rs.getString("COLUMN_COMMENT"));
                tableFieldList.add(fieldMap);
            }
            rs.close();
            stmt.close();
            conn.close();
        }catch(SQLException se){
            // 處理 JDBC 錯(cuò)誤
            se.printStackTrace();
        }catch(Exception e){
            // 處理 Class.forName 錯(cuò)誤
            e.printStackTrace();
        }finally{
            // 關(guān)閉資源
            try{
                if(stmt!=null){
                    stmt.close();
                }
            }catch(SQLException se2){
            }// 什么都不做
            try{
                if(conn!=null) conn.close();
            }catch(SQLException se){
                se.printStackTrace();
            }
        }
        return tableFieldList;
    }
 
    /**
     * 解析輸出屬性
     *
     * @return
     */
    private static void processAllAttrs(StringBuffer sb, List<Map> filedMaps) {
        for (int i = 0; i < filedMaps.size(); i++) {
            Map map = filedMaps.get(i);
            String fieldType = MapUtils.getString(map, "fieldType");
            String fieldName = MapUtils.getString(map, "fieldName");
            String fieldComment = MapUtils.getString(map, "fieldComment");
            if(StringUtils.isNotBlank(fieldComment)){
                sb.append("\t/**\r\n").append("\t* ").append(fieldComment).append("\n").append("\t*/\r\n");
            }
            sb.append("\tprivate " + fieldType + " " + fieldName + ";\r\n\r\n");
        }
    }
 
    private static void setFieldName(String columnName, Map fieldMap) {
        fieldMap.put("fieldName",removeUnderline(columnName));
    }
 
    private static void setFieldType(String columnType, Map fieldMap){
        String fieldType="String";
        if(columnType.equals("INT")||columnType.equals("INTEGER")){
            fieldType="Integer";
        }else if(columnType.equals("BIGINT")){
            fieldType="Long";
        }else if(columnType.equals("DATETIME")){
            fieldType="Date";
        }else if(columnType.equals("TEXT")||columnType.equals("VARCHAR")||columnType.equals("TINYTEXT")||columnType.equals("LONGTEXT")){
            fieldType="String";
        }else if(columnType.equals("DOUBLE")){
            fieldType="Double";
        }else if(columnType.equals("BIT")){
            fieldType="Boolean";
        }else if(columnType.equals("FLOAT")){
            fieldType="Float";
        }else if(columnType.equals("DECIMAL")){
            fieldType="BigDecimal";
        }else if(columnType.equals("DATE")){
            fieldType="Date";
        }else if(columnType.equals("TIMESTAMP")){
            fieldType="LocalDateTime";
        }else if(columnType.equals("CHAR")){
            fieldType="Char";
        }else if(columnType.equals("JSON")){//mysql5.7版本才開(kāi)始有的
            fieldType="JSONObject";
        }
        fieldMap.put("fieldType",fieldType);
    }
}

到此這篇關(guān)于如何讓java只根據(jù)數(shù)據(jù)庫(kù)表名自動(dòng)生成實(shí)體類(lèi)的文章就介紹到這了,更多相關(guān)根據(jù)數(shù)據(jù)庫(kù)表名生成實(shí)體類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解如何通過(guò)Java實(shí)現(xiàn)類(lèi)似Nginx代理

    詳解如何通過(guò)Java實(shí)現(xiàn)類(lèi)似Nginx代理

    最近遇到一個(gè)問(wèn)題,在內(nèi)網(wǎng)環(huán)境中部署的項(xiàng)目需要調(diào)用外網(wǎng)完成一些應(yīng)用,一般情況我們可以通過(guò)增加一臺(tái)機(jī)器,部署到可以訪問(wèn)外網(wǎng)的服務(wù)器上,然后內(nèi)網(wǎng)直接連接該機(jī)器通過(guò)Nginx進(jìn)行代理即可,所以本文介紹了如何通過(guò)Java實(shí)現(xiàn)類(lèi)似Nginx代理,需要的朋友可以參考下
    2024-08-08
  • Spring和SpringMVC掃描注解類(lèi)沖突的解決方案

    Spring和SpringMVC掃描注解類(lèi)沖突的解決方案

    這篇文章主要介紹了Spring和SpringMVC掃描注解類(lèi)沖突的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java 中模仿源碼自定義ArrayList

    Java 中模仿源碼自定義ArrayList

    這篇文章主要介紹了Java 中模仿源碼自定義ArrayList的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Spring Boot集成Swagger2項(xiàng)目實(shí)戰(zhàn)

    Spring Boot集成Swagger2項(xiàng)目實(shí)戰(zhàn)

    在日常的工作中,我們往往需要給前端(WEB端、IOS、Android)或者第三方提供接口,這個(gè)時(shí)候我們就需要給他們提供一份詳細(xì)的API說(shuō)明文檔。這篇文章我們就來(lái)分享一種API文檔維護(hù)的方式,即通過(guò)Swagger來(lái)自動(dòng)生成Restuful API文檔
    2018-01-01
  • Kafka中消息隊(duì)列的兩種模式講解

    Kafka中消息隊(duì)列的兩種模式講解

    這篇文章主要介紹了Kafka中消息隊(duì)列的兩種模式講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 聊聊@RequestParam,@PathParam,@PathVariable等注解的區(qū)別

    聊聊@RequestParam,@PathParam,@PathVariable等注解的區(qū)別

    這篇文章主要介紹了聊聊@RequestParam,@PathParam,@PathVariable等注解的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • 在CentOS7(有圖形化界面)上安裝maven和idea的詳細(xì)教程

    在CentOS7(有圖形化界面)上安裝maven和idea的詳細(xì)教程

    這篇文章主要介紹了在CentOS7(有圖形化界面)上安裝maven和idea的詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 源碼分析Java中ThreadPoolExecutor的底層原理

    源碼分析Java中ThreadPoolExecutor的底層原理

    這篇文章主要帶大家從源碼分析一下Java中ThreadPoolExecutor的底層原理,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下
    2023-05-05
  • java objectUtils 使用可能會(huì)出現(xiàn)的問(wèn)題

    java objectUtils 使用可能會(huì)出現(xiàn)的問(wèn)題

    這篇文章主要介紹了java objectUtils 使用可能會(huì)出現(xiàn)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • spring初始化源碼代碼淺析

    spring初始化源碼代碼淺析

    Spring框架被廣泛應(yīng)用于我們的日常工作中,但是很長(zhǎng)時(shí)間以來(lái)我們都是只會(huì)使用,不懂它的作用原理,下面這篇文章主要給大家介紹了關(guān)于spring初始化源碼的相關(guān)資料,需要的朋友可以參考下
    2023-04-04

最新評(píng)論

枣阳市| 通榆县| 白城市| 松滋市| 盈江县| 方正县| 荥阳市| 福泉市| 承德市| 和平县| 高密市| 景洪市| 廊坊市| 莆田市| 合肥市| 平顶山市| 布拖县| 宽城| 栾川县| 河北省| 双鸭山市| 罗源县| 宜都市| 张家口市| 图们市| 垫江县| 修水县| 涿州市| 青岛市| 枣强县| 长沙县| 邢台市| 威宁| 周宁县| 江城| 渝中区| 博野县| 堆龙德庆县| 惠来县| 桐柏县| 诸暨市|