首页 > 其他分享 >注解加反射动态创建表

注解加反射动态创建表

时间:2022-11-10 16:01:58浏览次数:68  
标签:lang 反射 java String sql 动态创建 import 注解 annotation

场景:一个实体,几十个字段,Java实体类建一遍,数据库建一遍,痛苦面具

 

所需代码:

package me.xiaomaju.base;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Description 注解 表名
 * @Author @xmj
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TableNameAnnotation {

    String value(); //表名

}
TableNameAnnotation
package me.xiaomaju.base;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Description 注解 列名
 * @Author @xmj
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TableColumnAnnotation {

    String value();//列名

    MySQLColumnType type() default MySQLColumnType.VARCHAR; //类型,默认varchar

    int length() default 20;//长度,默认20

}
TableColumnAnnotation
package me.xiaomaju.base;

/**
 * @Description 列类型枚举
 * @Author @xmj
 */
public enum MySQLColumnType {
    CHAR,
    VARCHAR,
    INT,
    DOUBLE,
    FLOAT
}
MySQLColumnType
package me.xiaomaju.base;

import java.lang.reflect.Field;

/**
 * @Description 动态建表SQL工具类
 * @Author @xmj
 */
public class DynamicSQLUtils {

    public static void main(String[] args) {
        String sql = getSQL("me.xiaomaju.entity.CiOrderDO");
        System.out.println(sql);
    }

    public static String getSQL(String str){
        StringBuffer sql=new StringBuffer();
        Class<?> clazz= null;
        try {
            clazz = Class.forName(str);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        TableNameAnnotation tn=clazz.getAnnotation(TableNameAnnotation.class);
        String tableName=tn.value();
        sql.append("DROP TABLE IF EXISTS "+tableName+" ; ");
        sql.append("CREATE TABLE "+tableName+" ( ");
        Field[] fields=clazz.getDeclaredFields();
        TableColumnAnnotation field = null;
        for(Field f:fields){
            field =f.getAnnotation(TableColumnAnnotation.class);
            sql.append(field.value()+" "+field.type()+"("+field.length()+"),");
        }
        sql.deleteCharAt(sql.length()-1);
        sql.append(")");
        return sql.toString();
    }

}
DynamicSQLUtils

 

实体类中使用注解:

 

 运行 DynamicSQLUtils 中的 main 方法,将控制台的打印语句放到数据库工具中执行

 

 个人认为可以改进的点:

1、拼接建表语句的时候把列的注释也拼进去(列注解最少要传2个参数)

2、写个JDBC执行SQL(个人还是喜欢用数据库工具)

3、获取指定包下面的所有实体的全类名,批量建表(目前表不是很多,没必要)

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
  TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back

标签:lang,反射,java,String,sql,动态创建,import,注解,annotation
From: https://www.cnblogs.com/xiaomaju/p/16875285.html

相关文章

  • @excel 注解_Java读写Excel原来这么简单
    前言相信现在很多搞后端的同学大部分做的都是后台管理系统,那么管理系统就肯定免不了Excel的导出导入功能,今天我们就来介绍一下Java如何实现Excel的导入导出功能。Jav......
  • @Component注解的用法
    注解注解本质上就是一个类,开发中我们可以使用注解取代xml配置文件。@component是spring中的一个注解,它的作用就是实现bean的注入。在Java的web开发中,提供3个@Component注......
  • 注解
    注解1.什么是注解Annotation是从JDK1.5开始引入的新技术Annotation的作用​ 不是程序本身,可以对程序做出一些解释(这一点和注释(comment)没什么区别)​ 可以被其......
  • 反射理解
    https://www.cnblogs.com/rsapaper/p/16634894.htmlhttps://blog.csdn.net/qq_43747991/article/details/124157357......
  • K8s系列---【安装nfs文件系统(为k8s提供动态创建pv的能力)】
    安装nfs文件系统(为k8s提供动态创建pv的能力)1.1安装nfs-server#在每个机器执行下面这条命令(包含master)。yuminstall-ynfs-utils下面的/nfs/data目录可以自定义,......
  • JvmMultifile 注解在 Kotlin 中的应用
    接触过Kotlin之后,我们会利用其扩展方法特性创建很多便捷的方法来实现更好更快的编码。比如我们对于RxJava进行一些简单的扩展方法实现。下面的这段代码实现一个将任意的对象......
  • JvmName 注解在 Kotlin 中的应用
    JvmName注解是Kotlin提供的一个可以变更编译器输出的注解,这里简单的介绍一下其使用规则。应用在文件上未应用@JvmNamepackagecom.example.jvmannotationsampleimportand......
  • 01-SpringBoot注解
    SpringBoot注解Spring常用注解配置注解含义@Configuration定义一个类是Spring配置类@Bean配置自定义的Bean,如DruidDataSource@Componen......
  • java的反射
    packagecom.tedu.day16;importcom.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;importjava.lang.reflect.Constructor;importjava.lang.reflect.Field......
  • SpringCloud(八) - 自定义token令牌,鉴权(注解+拦截器),参数解析(注解+解析器)
    1、项目结构介绍项目有使用到,redis和swagger,不在具体介绍;2、手动鉴权和用户信息参数获取(繁杂,冗余)2.1用户实体类/***CreatedOn:4/11/2022.*<p>*Author......