根据java实体类生成创建表sql步骤

根据java实体类生成创建表sql语句时,方法是利用java反射+AOP注解,主要步骤如下:

1.注解类

一般在生成表的时候,需要表名主键名字段名,对应到注解上至少要体现出这三部分。

1.1表名+主键名注解

至少体现到表名和主键名。

import java.lang.annotation.*;
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD})//次注解作用于类和字段上
public @interface Table {String tableName() default ""; //默认表名为空String keyFields() default "id"; //默认主键为id
}
1.2字段名注解

至少能够设置对应生成的字段名。

import java.lang.annotation.*;
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD})
public @interface Column {String name() default ""; //表示字段名
}

2.注解使用

以下边的类为例,添加上边的注解。

@Table(tableName = "TEST_CLASS" , keyFields = "id")
public class TestClass {@Column(name="id")private Integer id;@Column(name="user_name")private String userName;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}
}

3.工具类

生成方法的工具类如下,只是生成简单的语句,可以自行扩展,具体执行main方法看效果。

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;/*** Created by lingsf on 2019/11/5.*/
public class CreateTable {public static Map<String, String> javaProperty2SqlColumnMap = new HashMap<>();//下边是对应的oracle的生成语句,类型都是oracle,如果是mysql还需要改。static {javaProperty2SqlColumnMap.put("Integer", "NUMBER(9)");javaProperty2SqlColumnMap.put("Short", "NUMBER(4)");javaProperty2SqlColumnMap.put("Long", "NUMBER(18)");javaProperty2SqlColumnMap.put("BigDecimal", "NUMBER(22,2)");javaProperty2SqlColumnMap.put("Double", "NUMBER(22,2)");javaProperty2SqlColumnMap.put("Float", "NUMBER(22,2)");javaProperty2SqlColumnMap.put("Boolean", "NUMBER(1)");javaProperty2SqlColumnMap.put("Timestamp", "date");javaProperty2SqlColumnMap.put("String", "VARCHAR(255)");}public static void main(String[] args) throws IOException {createTable(TestClass.class, null);}public static String createTable(Class<?> clz, String tableName) throws IOException {// 判断类上是否有次注解boolean clzHasAnno = clz.isAnnotationPresent(Table.class);String prikey = null;if (clzHasAnno) {// 获取类上的注解Table annotation = (Table)clz.getAnnotation(Table.class);// 输出注解上的类名String tableNameAnno = annotation.tableName();if(tableNameAnno != null && !"".equals(tableNameAnno)){tableName = tableNameAnno;}else{throw new RuntimeException("没有类名");}String keyIdAnno = annotation.keyFields();if(keyIdAnno != null && !"".equals(keyIdAnno)){prikey = keyIdAnno;}else{throw new RuntimeException("没有设置主键");}}Field[] fields = null;fields = clz.getDeclaredFields();String param = null;String column = null;StringBuilder sb = null;sb = new StringBuilder(50);sb.append("create table ").append(tableName).append(" ( \r\n");boolean firstId = true;File file = null;for (Field f : fields) {column = f.getName();if (column.equals("serialVersionUID")) {continue;}boolean fieldHasAnno = f.isAnnotationPresent(Column.class);if(fieldHasAnno){Column fieldAnno = f.getAnnotation(Column.class);//输出注解属性String  name = fieldAnno.name();if(name != null && !"".equals(name)){column = name;}}else{continue; //没有column注解的过滤掉}param = f.getType().getSimpleName();sb.append(column);//一般第一个是主键sb.append(" ").append(javaProperty2SqlColumnMap.get(param)).append(" ");if(prikey == null || "".equals(prikey)){if (firstId) {//类型转换sb.append(" PRIMARY KEY ");firstId = false;}}else{if(prikey.equals(column.toLowerCase())){sb.append(" PRIMARY KEY ");}}sb.append(",\n ");}String sql = null;sql = sb.toString();//去掉最后一个逗号int lastIndex = sql.lastIndexOf(",");sql = sql.substring(0, lastIndex) + sql.substring(lastIndex + 1);sql = sql.substring(0, sql.length() - 1) + " );\r\n";System.out.println("sql :");System.out.println(sql);return sql;}
}

4.生成效果

create table TEST_CLASS (
id NUMBER(9)  PRIMARY KEY ,user_name VARCHAR(255) );

根据java实体类生成创建表sql步骤相关推荐

  1. java实体类生成mysql表_springboot+mybatis通过实体类自动生成数据库表的方法

    前言 本章介绍使用mybatis结合mysql数据库自动根据实体类生成相关的数据库表. 首先引入相关的pom包我这里使用的是springboot2.1.8.RELEASE的版本 org.mybatis ...

  2. 根据实体类生成数据库表

    参考文档地址:通过实体类生成数据库表_weixin_44571808的博客-CSDN博客_java实体类生成数据库表 注意springboot版本号需要比较低(没有详细测试2.6不行,2.1.11可以 ...

  3. Springboot根据实体类生成数据库表

    springboot数据库(一)-springboot-JPA JPA:springboot -jpa:数据库的一系列的定义数据持久化的标准的体系 学习的目的是: 利用springboot实现对数据库 ...

  4. Hibrenate实现根据实体类自动创建表或添加字段

    Hibernate支持自动建表,在开发阶段很方便,可以保证hbm与数据库表结构的自动同步. 实现: 在配置hibernate的配置文件中将hbm2ddl.auto设置为update,如:Xml代码&l ...

  5. excel自动生成创建表sql语句

    Sub 选项按钮4_Click()Dim sqlStr, sqlTemp, pkStr, columnName, columnType, columnLength, isPk, notExistTab ...

  6. Spring Boot配置Mysql后无法根据java实体类生成table

    https://www.imooc.com/qadetail/193270?t=292816 检查了两天,没找到问题.原因为实体类必须在主程序application的同名包或者子包下面,启动时才会扫描 ...

  7. python制作表格的语句_python根据Excel自动生成创建表sql语句

    1.Excel格式截图 2.配置文件脚本 # coding:utf-8 # 表英文名 table_name = '表英文名' # 表中文名 table_comments = '表中文名' # Exce ...

  8. mysql注解实体类_jpa实体类生成mysql表及字段注解

    代码:其中有表有:名称.索引,字段有:名称.类型(int,varchar, text),唯一, 长度,是否为空,注释,默认值 索引说明:如果字段有别名也就是有name属性,则columnList 中填 ...

  9. c 自动生成mysql表结构_EntityFrameworkCore 根据实体类自动创建数据库

    1.首先新建 Asp.Net Core WebApi 项目 2.添加一下引用 : 2.1   Pomelo.EntityFrameworkCore.MySql(我用的Mysql 根据自己情况引用就行) ...

最新文章

  1. 处理大并发之一 对异步非阻塞的理解
  2. Spark on K8S 的最佳实践和需要注意的坑
  3. java向注册表单传递数据php_PHP提交from表单的方法
  4. Android事件总线
  5. 使用Jenkins搭建自动化测试环境_环境准备_入门试炼01
  6. 下一步linux命令bzip,linux基础命令---bzip2
  7. 图像处理1 高斯模糊
  8. 在手机上实现实时的单眼3D重建
  9. Kd-tree的学习
  10. 银行金融管理系统java实现
  11. 如何从零开始学习Java语言
  12. 如何解决搜狗浏览器自动填充
  13. EMV log 解析
  14. 央行数字货币技术架构---HashGraph共识算法1
  15. 如何应对CPU帧率瓶颈和卡顿?腾讯游戏学院专家带你剖析
  16. 在互联网时代一切归零
  17. python3数据可视化软件_Python数据可视化工具Plotly
  18. 如何安装和搭建wordpress个人网站(超详细+零基础)
  19. 使用easypoi将数据导入excel中
  20. c++实现PCA(BIL, BSQ, BIP三种格式数据)

热门文章

  1. kill -9杀不掉进程的时候解决方法
  2. 有关R6034错误的思考
  3. linux防火墙拒绝访问,过滤nginx日志并添加防火墙拒绝访问 centos7
  4. 模拟电子技术-功率放大电路
  5. Linux中jprofiler安装使用教程
  6. 华为与H3C交换机打开或关闭告警信息
  7. Html文件怎么设置背景墙图片,岩板做背景墙怎么固定
  8. Upload-Labs-Pass-07
  9. HandlerThread源码分析
  10. 什么是正向设计和逆向设计?