前言,本次记录重点在读取数据库表结构,及解析转换成java实体类需要字段。

主要包含,表 列名、类型、注释的读取解析

至于代码生成,可以基于已有的代码生成模板 整合进去即可

pom:

<!-- Mysql Connector --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.48</version></dependency><!--//驼峰转换--><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>21.0</version></dependency>
<!-- Beetl代码生成使用 --><dependency><groupId>com.ibeetl</groupId><artifactId>beetl</artifactId><version>2.9.10</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.10</version></dependency>

一、从mysql读取实体类相关信息实现

1、数据库-java数据结构对应map

/*** @Author: WXM* @Description: mysql数据结构对应* @Date: create in 2020/11/4 19:03*/public class DataTypeUtil {public static Map<String ,String> map = new HashMap<>();static {map.put("smallint","java.lang.Integer");map.put("mediumint","java.lang.Integer");map.put("integer","java.lang.Integer");map.put("tinyint","java.lang.Short");map.put("int","java.lang.Integer");map.put("bigint","java.lang.Long");map.put("float","java.lang.Float");map.put("double","java.lang.Double");map.put("decimal","java.math.BigDecimal");map.put("date","java.util.Date");map.put("datetime","java.util.Date");map.put("timestamp","java.util.Date");map.put("time","java.util.Date");map.put("year","java.util.Date");map.put("char","java.lang.String");map.put("varchar","java.lang.String");map.put("binary","byte[]");map.put("varbinary","byte[]");map.put("tinyblob","byte[]");map.put("tinytext","java.lang.String");map.put("blob","byte[]");map.put("text","java.lang.String");map.put("mediumblob","byte[]");map.put("mediumtext","java.lang.String");map.put("longblob","byte[]");map.put("longtext","java.lang.String");map.put("enum","java.lang.String");map.put("set","java.lang.String");map.put("bit","java.lang.Boolean");}
}

2、表结构存储实体类

/*** @Author: WXM* @Description: 表结构信息* @Date: create in 2020/11/4 17:03*/public class TableRowInfo {private String columnName;private String columnType;private String columnComment;public String getColumnName() {return columnName;}public void setColumnName(String columnName) {this.columnName = columnName;}public String getColumnType() {return columnType;}public void setColumnType(String columnType) {this.columnType = columnType;}public String getColumnComment() {return columnComment;}public void setColumnComment(String columnComment) {this.columnComment = columnComment;}
}

3、数据库连接配置及获取表结构

/*** @Author: WXM* @Description: mysql获取表结构* @Date: create in 2020/11/4 16:27*/public class MysqlConnectUtil {private String driverClass;private String url;private String userName;private String passWord;private String tableName;public List<TableRowInfo> creat(){List<TableRowInfo> tableRowInfos = new ArrayList<>();if(StringUtils.isNotBlank(driverClass) && StringUtils.isNotBlank(url) && StringUtils.isNotBlank(userName) && StringUtils.isNotBlank(passWord)&& StringUtils.isNotBlank(tableName)){try {Class.forName(driverClass);Connection con = DriverManager.getConnection(url, userName, passWord);String sql = "show full columns from  "+tableName;Statement st = con.createStatement();ResultSet res = st.executeQuery(sql);while (res.next()){TableRowInfo tri = new TableRowInfo();tri.setColumnName(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, res.getString("Field")));tri.setColumnType(DataTypeUtil.map.get(res.getString("Type").split("\\(")[0]));tri.setColumnComment(res.getString("Comment"));tableRowInfos.add(tri);}} catch (Exception e) {e.printStackTrace();}}else {throw new RuntimeException("请填写完整mysql连接所需参数");}return tableRowInfos;}public MysqlConnectUtil setDriverClass(String driverClass) {this.driverClass = driverClass;return this;}public MysqlConnectUtil setUrl(String url) {this.url = url;return this;}public MysqlConnectUtil setUserName(String userName) {this.userName = userName;return this;}public MysqlConnectUtil setPassWord(String passWord) {this.passWord = passWord;return this;}public MysqlConnectUtil setTableName(String tableName) {this.tableName = tableName;return this;}
}

4、实际测试

    /*** 根据数据库表生成实体类*/private static String driverClass = "com.mysql.jdbc.Driver";private static String url = "jdbc:mysql://127.0.0.1:3306/zhzf_xingzhengfuyi?useUnicode=true&characterEncoding=utf-8";private static String userName = "root";private static String passWord = "123456";private static String tableName = "b_anjianxinxi";private static List<TableRowInfo> tableRowInfos = new ArrayList<>();public void getTableRowInfo(){tableRowInfos = new MysqlConnectUtil().setDriverClass(driverClass).setUrl(url).setUserName(userName).setPassWord(passWord).setTableName(tableName).creat();}

二、生成代码实现

1、新建blt后缀的文件,到资源文件夹下,把整合好的 tableRowInfos 写入模板生成文件中即可,类似下面

package ${entity.entityPackage};import java.util.Date;
import lombok.Data;@Data
public class ${entity.className} {private static final long serialVersionUID = 1L;<%for(var tableRowInfo in entity.tableRowInfos){%>// ${tableRowInfo.columnComment}private ${tableRowInfo.columnType} ${tableRowInfo.columnName};<%}%>}

2、编写生成代码

import org.beetl.core.Configuration;
import org.beetl.core.GroupTemplate;
import org.beetl.core.Template;
import org.beetl.core.resource.ClasspathResourceLoader;/*** 主键类型*/private static final String primaryKeyType = "String";/*** 实体类对应包* (文件自动生成至该包下)*/private static final String entityPackage = "com.budongfeng.tboot.modules.your.entity";/*** 实体类名* 建议仅需修改*/private static final String className = "JuedingshuTemp";/*** 根据数据库表生成实体类*/private static String driverClass = "com.mysql.jdbc.Driver";private static String url = "jdbc:mysql://127.0.0.1:3306/zhzf_xingzhengfuyi?useUnicode=true&characterEncoding=utf-8";private static String userName = "root";private static String passWord = "123456";private static String tableName = "juedingshu_temp";private static List<TableRowInfo> tableRowInfos = new ArrayList<>();public static void main(String[] args) throws Exception {//读取表格信息TbootMPGenerator tb = new TbootMPGenerator();tb.getTableRowInfo();// 模板路径ClasspathResourceLoader resourceLoader = new ClasspathResourceLoader("/btl/");Configuration cfg = Configuration.defaultConfiguration();GroupTemplate gt = new GroupTemplate(resourceLoader, cfg);// 生成代码generateCode(gt);// 读取你的实体类中的字段,补充生成条件构造分页查询代码【需自行复制控制台打印输出的代码自行覆盖】
//        generatePlus(gt);// 根据类名删除生成的代码
//         deleteCode(className);}private static void generateCode(GroupTemplate gt) throws IOException {//读取资源文件夹下刚创建的blt文件Template entityTemplate = gt.getTemplate("entity.btl");OutputStream out = null;//生成实体类代码,将上面生成的table信息赋值到下面创建的类中Entity entity = new Entity();entity.setTableRowInfos(tableRowInfos);entity.setClassName(className);entity.setTableName(tableName);entity.setEntityPackage(entityPackage);String entityResult = entityTemplate.render();System.out.println(entityResult);entityTemplate.binding("entity", entity);//创建输出文件String entityFileUrl = System.getProperty("user.dir") + "/src/main/java/" + dotToLine(entityPackage) + "/" + className + ".java";File entityFile = new File(entityFileUrl);File entityDir = entityFile.getParentFile();if (!entityDir.exists()) {entityDir.mkdirs();}if (!entityFile.exists()) {// 若文件存在则不重新生成entityFile.createNewFile();out = new FileOutputStream(entityFile);entityTemplate.renderTo(out);}}/*** 点转斜线* @param str* @return*/public static String dotToLine(String str){return str.replace(".", "/");}public void getTableRowInfo(){tableRowInfos = new MysqlConnectUtil().setDriverClass(driverClass).setUrl(url).setUserName(userName).setPassWord(passWord).setTableName(tableName).creat();}
@Data
public class Entity {private String entityPackage;private String daoPackage;private String servicePackage;private String serviceImplPackage;private String controllerPackage;private String author;private String className;private String classNameLowerCase;private String tableName;private String description;private String primaryKeyType;private Boolean activiti;private Boolean isTree;private List<TableRowInfo> tableRowInfos;
}

根据数据库表动态生成java实体类相关推荐

  1. mysql语句生成在线_在线数据库表(sql语句)生成java实体类工具

    相信每个做java开发的读者,都接触过SQL建表语句,尤其是在项目开发初期,因为数据库是项目的基石. 在现代项目开发中,出现了许多ORM框架,通过简单的实体映射,即可实现与数据库的交互,然而我们最初设 ...

  2. 小d课堂mysql_小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-6.Mysql逆向工程效率神器之使用IDE自动生成Java实体类...

    笔记 6.Mysql逆向工程效率神器之使用IDE自动生成Java实体类 简介:实战使用IDE根据Mysql自动生成java pojo实体类 1.IDEA连接数据库 菜单View→Tool Window ...

  3. 【从0到1打造代码生成器】生成Java实体类

    代码生成器是指通过机器来生成各种类型的代码,其应用十分广泛,并且能够极大的提高开发效率.本文将介绍如何利用Velocity模板技术生成一个Java实体类. 问题 Velocity是 JavaEE企业级 ...

  4. 超详细 图解 : IntelliJ IDEA 逆向生成 JAVA 实体类

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1.配置数据库,,这里连接的是mysql. 2.填写 连接数据库的信息,填写完成后可以点击Test ...

  5. internship:数据库表和建立的实体类及对应的枚举类之间的联系示例

    数据库表: 发现tunnel_id和duan字段存在相同的情况,这是为了处理一种情况 同一类有多个分类 且分类又有分支.比如隧道是一类别事物 那么隧道有多个有命名存在的实体 每个实体又有各自的属性类别 ...

  6. 数据库表之间关系与实体类的对应

    如何在实体类中体现一对多,多对多的关系 一对多: 在从表中添加主表的实体类属性 在主表中添加从表的实体类的集合属性 多对多: 在两个表中可添加另一个表的实体类的集合属性

  7. JAVA读取Excel表格,建数据库建表,并生成java实体实例

    转自:https://blog.csdn.net/wuyongde_0922/article/details/43233413 JAVA读取Excel表格,建数据库建表,并生成java实体实例,这一篇 ...

  8. MyBatis由浅入深学习总结之二:MyBatis解决Java实体类和数据库表字段不一致方法总结

    在此,首先说明一点任何持久性框架都需要解决一个问题,那就是Java实体类的字段一般来说基本上会与数据库表中字段不一致,那么它们是如何解决的呢?咱们以Hibernate和SpringJDBC为例说明一下 ...

  9. MybatisPlus忽略实体类中的非数据库字段、JPA忽略实体类中的非数据库字段、HeHibernate忽略实体类中的非数据库字段

    mybatis plus忽略映射字段时可以在实体类属性上使用以下注解: @TableField(exist = false):表示该属性不为数据库表字段,但又是必须使用的. @TableField(e ...

最新文章

  1. 自动驾驶新突破,国内有了第一款AI标注软件
  2. 这个AI“大师级”简笔画水平,惊艳到了网友:竟然不用GAN
  3. ans_rproxy 说明
  4. Linux Daemon Writing HOWTO
  5. php程序包括什么,php程序是什么
  6. nginx配置php 9000,Nginx支持php配置
  7. MATLAB1阶零模型,MATLAB 空间计量模型的实现
  8. pcb文件转成原理图_电子设计基础教学-PCB板制作之 AD(Altium Designer)的工程建立过程...
  9. 使用MATLAB工具箱TOOLBOX_calib标定摄像头过程(双目标定)
  10. 【PM杂谈】我理解的项目管理
  11. 2017初秋最时髦服装搭配,裙子+短靴搭配
  12. mysql数据库常见的错误_MySQL数据库常见错误及解决方案
  13. 【python+requests】爬取“国家级非物质文化遗产代表性项目名录”
  14. 2021-05-21--0515周考
  15. zw版_Halcon图像库delphi接口文件
  16. foxmail邮件只能显示邮件头,不能显示内容
  17. in-line(内联)概念
  18. Idea 使用技巧(MAC)
  19. web端使用腾讯地图
  20. 跨平台|融云 React Native IM SDK 全新改版上线

热门文章

  1. 2021高考文化课成绩查询,2021艺考成绩和文化课成绩怎么算 艺考成绩计算方法
  2. centos7 samba 离线安装_Centos 7 上安装Samba的详细步骤
  3. linux脚本隐藏托盘,Shell_NotifyIcon实现任意托盘图标的隐藏与再现
  4. 计算机网络学习-006
  5. 当学习《创新创业执行力》课程遇到困难,我们该……
  6. Linux之大数据技术(三):SecureCRT中文乱码解决方法
  7. 备考2020年消防工程师,如何调整状态?
  8. li_wen01嵌入式开发相关博客更新目录及资料下载说明
  9. 绘制带有误差线的柱状图
  10. [实训笔记] 01 软件架构模式