根据数据库表动态生成java实体类
前言,本次记录重点在读取数据库表结构,及解析转换成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实体类相关推荐
- mysql语句生成在线_在线数据库表(sql语句)生成java实体类工具
相信每个做java开发的读者,都接触过SQL建表语句,尤其是在项目开发初期,因为数据库是项目的基石. 在现代项目开发中,出现了许多ORM框架,通过简单的实体映射,即可实现与数据库的交互,然而我们最初设 ...
- 小d课堂mysql_小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-6.Mysql逆向工程效率神器之使用IDE自动生成Java实体类...
笔记 6.Mysql逆向工程效率神器之使用IDE自动生成Java实体类 简介:实战使用IDE根据Mysql自动生成java pojo实体类 1.IDEA连接数据库 菜单View→Tool Window ...
- 【从0到1打造代码生成器】生成Java实体类
代码生成器是指通过机器来生成各种类型的代码,其应用十分广泛,并且能够极大的提高开发效率.本文将介绍如何利用Velocity模板技术生成一个Java实体类. 问题 Velocity是 JavaEE企业级 ...
- 超详细 图解 : IntelliJ IDEA 逆向生成 JAVA 实体类
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1.配置数据库,,这里连接的是mysql. 2.填写 连接数据库的信息,填写完成后可以点击Test ...
- internship:数据库表和建立的实体类及对应的枚举类之间的联系示例
数据库表: 发现tunnel_id和duan字段存在相同的情况,这是为了处理一种情况 同一类有多个分类 且分类又有分支.比如隧道是一类别事物 那么隧道有多个有命名存在的实体 每个实体又有各自的属性类别 ...
- 数据库表之间关系与实体类的对应
如何在实体类中体现一对多,多对多的关系 一对多: 在从表中添加主表的实体类属性 在主表中添加从表的实体类的集合属性 多对多: 在两个表中可添加另一个表的实体类的集合属性
- JAVA读取Excel表格,建数据库建表,并生成java实体实例
转自:https://blog.csdn.net/wuyongde_0922/article/details/43233413 JAVA读取Excel表格,建数据库建表,并生成java实体实例,这一篇 ...
- MyBatis由浅入深学习总结之二:MyBatis解决Java实体类和数据库表字段不一致方法总结
在此,首先说明一点任何持久性框架都需要解决一个问题,那就是Java实体类的字段一般来说基本上会与数据库表中字段不一致,那么它们是如何解决的呢?咱们以Hibernate和SpringJDBC为例说明一下 ...
- MybatisPlus忽略实体类中的非数据库字段、JPA忽略实体类中的非数据库字段、HeHibernate忽略实体类中的非数据库字段
mybatis plus忽略映射字段时可以在实体类属性上使用以下注解: @TableField(exist = false):表示该属性不为数据库表字段,但又是必须使用的. @TableField(e ...
最新文章
- 自动驾驶新突破,国内有了第一款AI标注软件
- 这个AI“大师级”简笔画水平,惊艳到了网友:竟然不用GAN
- ans_rproxy 说明
- Linux Daemon Writing HOWTO
- php程序包括什么,php程序是什么
- nginx配置php 9000,Nginx支持php配置
- MATLAB1阶零模型,MATLAB 空间计量模型的实现
- pcb文件转成原理图_电子设计基础教学-PCB板制作之 AD(Altium Designer)的工程建立过程...
- 使用MATLAB工具箱TOOLBOX_calib标定摄像头过程(双目标定)
- 【PM杂谈】我理解的项目管理
- 2017初秋最时髦服装搭配,裙子+短靴搭配
- mysql数据库常见的错误_MySQL数据库常见错误及解决方案
- 【python+requests】爬取“国家级非物质文化遗产代表性项目名录”
- 2021-05-21--0515周考
- zw版_Halcon图像库delphi接口文件
- foxmail邮件只能显示邮件头,不能显示内容
- in-line(内联)概念
- Idea 使用技巧(MAC)
- web端使用腾讯地图
- 跨平台|融云 React Native IM SDK 全新改版上线
热门文章
- 2021高考文化课成绩查询,2021艺考成绩和文化课成绩怎么算 艺考成绩计算方法
- centos7 samba 离线安装_Centos 7 上安装Samba的详细步骤
- linux脚本隐藏托盘,Shell_NotifyIcon实现任意托盘图标的隐藏与再现
- 计算机网络学习-006
- 当学习《创新创业执行力》课程遇到困难,我们该……
- Linux之大数据技术(三):SecureCRT中文乱码解决方法
- 备考2020年消防工程师,如何调整状态?
- li_wen01嵌入式开发相关博客更新目录及资料下载说明
- 绘制带有误差线的柱状图
- [实训笔记] 01 软件架构模式