当前位置: 首页 > 工具软件 > SQL Buddy > 使用案例 >

MybatisPlus根据实体类生成sql

彭宜人
2023-12-01
package com.aunt.utils;

import com.aunt.bean.entity.LogUser;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.google.common.collect.Lists;
import net.bytebuddy.description.annotation.AnnotationDescription;
import org.apache.commons.lang3.StringUtils;

import javax.xml.bind.annotation.XmlElement;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.*;

/**
 * 通过实体类生成建表语句
 */
public class GenerateSqlFromEntity2 {
    //
    private static Map<String, String> javaTypeCast = new HashMap<>();
    private static Map<String, String> filedMap;
    private static String symbol;
    private static String space;


    static {
        space = "\n";
        symbol = ",";
        filedMap = new HashMap<>();
        javaTypeCast.put("Integer", "INTEGER");
        javaTypeCast.put("Short", "tinyint");
        javaTypeCast.put("Long", "bigint");
        javaTypeCast.put("BigDecimal", "decimal(19,2)");
        javaTypeCast.put("Double", "double precision not null");
        javaTypeCast.put("Float", "float");
        javaTypeCast.put("Boolean", "bit");
        javaTypeCast.put("Timestamp", "datetime");
        javaTypeCast.put("String", "VARCHAR(255)");
        javaTypeCast.put("Date", "datetime");
    }

    //
    public static String createTable(Class clazz) throws IOException {

        Field[] fields = null;
        fields = clazz.getDeclaredFields();
        String param = null;
        String column = null;
        Class annotationType = null;
        XmlElement xmlElement = null;
        TableName annotation = (TableName) clazz.getAnnotation(TableName.class);
        StringBuilder stb = new StringBuilder(50);
        String tableName = annotation.value();
        if (tableName == null || tableName.equals("")) {
            // 未传表明默认用类名
            tableName = clazz.getName();
            tableName = tableName.substring(tableName.lastIndexOf(".") + 1);
        }

        stb.append("create table ").append(tableName).append(" (\r\n");
        Map<String, String> map = getAnnoValue(clazz);
        ArrayList<Object> counter = Lists.newArrayList();

        map.entrySet().stream().forEach(op -> {
            counter.add(op.getKey());
            symbol = counter.size() - 1 == map.entrySet().size() - 1 ? "" : symbol;
            stb.append(op.getKey() + " " + javaTypeCast.get(op.getValue()).concat(symbol));
            stb.append("\r\n");

        });

        String sql = null;
        sql = stb.toString();

        // 去掉最后一个逗号
        int lastIndex = sql.lastIndexOf(",");
        sql = sql.substring(0, lastIndex) + sql.substring(lastIndex + 1);
        sql = sql.substring(0, sql.length() - 1)
                + ") ENGINE = INNODB DEFAULT  CHARSET= utf8;\r\n";

        return sql;
    }

    // main
    public static void main(String[] args) throws IOException {
        System.err.println(createTable(LogUser.class));
//        getAnnoValue(LogUser.class);
    }


    /**
     * 获取注解上的值 以及参数的类型
     *
     * @param clazz 目标
     * @return
     */
    public static Map<String, String> getAnnoValue(Class clazz) {
        List<Field> fields = Arrays.asList(clazz.getDeclaredFields());
        fields.stream().forEach(opt -> {
                    String value;
                    String name = null;
                    name = opt.getType().getName();
                    name = name.substring(10, name.length());
                    TableId tableId = opt.getAnnotation(TableId.class);
                    if (tableId == null) {
                        TableField tableField = opt.getAnnotation(TableField.class);
                        value = tableField.value();
                    } else {
                        value = opt.getName();
                    }
                    filedMap.put(value, name);
                }
        );
        return filedMap;
    }
}

最后效果

create table t_user (
birthday VARCHAR(255),
last_login_time bigint,
city VARCHAR(255),
sex VARCHAR(255),
del INTEGER,
register_time bigint,
password VARCHAR(255),
province VARCHAR(255),
phone VARCHAR(255),
idcard VARCHAR(255),
nickname VARCHAR(255),
id VARCHAR(255),
email VARCHAR(255)
) ENGINE = INNODB DEFAULT  CHARSET= utf8;

简单的demo

 类似资料: