【实例简介】读取数据库表结构 自动生成增删改查代码

【实例截图】

【核心代码】

package com.isoftstone.autocoding;

import com.isoftstone.autocoding.common.Column;

import com.isoftstone.autocoding.common.Table;

import com.isoftstone.autocoding.utils.CamelCaseUtils;

import com.isoftstone.autocoding.utils.FileHelper;

import com.mysql.jdbc.StringUtils;

import freemarker.template.Configuration;

import freemarker.template.Template;

import org.apache.log4j.Logger;

import javax.swing.filechooser.FileSystemView;

import java.io.*;

import java.sql.Connection;

import java.sql.DatabaseMetaData;

import java.sql.ResultSet;

import java.text.SimpleDateFormat;

import java.util.*;

public class EasyCodeApplication {

private Logger logger = Logger.getLogger(this.getClass());

private Properties properties;

/**

* 读取配置文件

*

* @throws Exception

*/

public EasyCodeApplication() throws Exception {

properties = new Properties();

String fileDir = this.getClass().getClassLoader().getResource("generator.xml").getFile();

properties.loadFromXML(new FileInputStream(fileDir));

}

/**

* 解析数据表

*

* @param tableName

* @return

* @throws Exception

*/

public Table parseTable(String tableName) throws Exception {

String driverName = properties.getProperty("jdbc.driver");

String userName = properties.getProperty("jdbc.username");

String userPwd = properties.getProperty("jdbc.password");

String dbURL = properties.getProperty("jdbc.url");

String catalog = properties.getProperty("jdbc.catalog");

String schema = properties.getProperty("jdbc.schema");

schema = schema == null ? "%" : schema;

String column = "%";

logger.debug("driver>>" driverName);

logger.debug("url>>" dbURL);

logger.debug("name>>" userName);

logger.debug("password>>" userPwd);

logger.debug("catalog>>" catalog);

logger.debug("schema>>" schema);

Class.forName(driverName);

Connection conn = java.sql.DriverManager.getConnection(dbURL, userName, userPwd);

DatabaseMetaData dmd = conn.getMetaData();

ResultSet rs = dmd.getColumns(catalog, schema, tableName, column);

List columns = new ArrayList();

while (rs.next()) {

Column c = new Column();

c.setLabel(rs.getString("REMARKS"));

String name = rs.getString("COLUMN_NAME");

c.setName(CamelCaseUtils.toCamelCase(name));

c.setDbName(name);

String dbType = rs.getString("TYPE_NAME");

int columnSize = rs.getInt("COLUMN_SIZE");

if (dbType.equals("TINYINT") && columnSize > 1) {

c.setType("Integer");

} else if (dbType.equals("TINYINT") && columnSize == 1) {

c.setType("Boolean");

} else {

String type = properties.getProperty(dbType);

c.setType(type == null ? "String" : type);

}

c.setDbType(dbType);

c.setLength(rs.getInt("COLUMN_SIZE"));

c.setDecimalDigits(rs.getInt("DECIMAL_DIGITS"));

c.setNullable(rs.getBoolean("NULLABLE"));

columns.add(c);

}

List pkColumns = new ArrayList();

ResultSet pkrs = dmd.getPrimaryKeys(catalog, schema, tableName);

while (pkrs.next()) {

Column c = new Column();

String name = pkrs.getString("COLUMN_NAME");

c.setName(CamelCaseUtils.toCamelCase(name));

c.setDbName(name);

pkColumns.add(c);

}

conn.close();

Table t = new Table();

String prefiex = properties.getProperty("tableRemovePrefixes");

String name = tableName;

if (prefiex != null && !"".equals(prefiex)) {

name = tableName.split(prefiex)[0];

}

t.setName(CamelCaseUtils.toCamelCase(name));

t.setDbName(tableName);

t.setColumns(columns);

t.setPkColumns(pkColumns);

return t;

}

/**

*

Discription:[生成映射文件和实体类]

* Created on 2019年4月4日

*

* @param tableName 要声称映射文件和实体类的表名称

* @param tableDescAndCat 表描述

* @throws Exception

*/

public void gen(String tableName, String tableDescAndCat, String id, String modelId) throws Exception {

Configuration cfg = new Configuration(Configuration.VERSION_2_3_21);

String outRoot = properties.getProperty("outRoot");

//当输出地址为null时,文件放到桌面

if (StringUtils.isNullOrEmpty(outRoot)) {

File desktopDir = FileSystemView.getFileSystemView() .getHomeDirectory();

outRoot = desktopDir.getAbsolutePath() "/Desktop/EasyCodeDemo";

}

String basePackage = properties.getProperty("basePackage");

//获取当前日期

SimpleDateFormat sm_date = new SimpleDateFormat("yyyy年MM月dd日");

SimpleDateFormat sm_year = new SimpleDateFormat("yyyy年");

//将首字母转为大写

StringBuffer buffer = new StringBuffer();

String namePart1 = modelId.substring(0, 1).toUpperCase();

String namePart2 = modelId.substring(1);

buffer.append(namePart1 namePart2);

System.out.println(buffer);

Map root = new HashMap();

Table t = this.parseTable(tableName);

t.setTableDesc(tableDescAndCat.split("_")[0]);

root.put("table", t);

root.put("className", t.getNameUpper());

root.put("classNameLower", t.getName());

root.put("primaryKey", id);

root.put("modelId", modelId);

root.put("modelIdFirstUpper", buffer);

root.put("package", basePackage);

root.put("date", sm_date.format(new Date()));

root.put("year", sm_year.format(new Date()));

root.put("author", "wangchun");

root.put("email", "chunwangi@isoftstone.com");

String templateDir = this.getClass().getClassLoader().getResource("templates").getPath();

File tdf = new File(templateDir);

List files = FileHelper.findAllFile(tdf);

for (File f : files) {

String parentDir = "";

if (f.getParentFile().compareTo(tdf) != 0) {

parentDir = f.getParent().split("templates")[1];

}

cfg.setClassForTemplateLoading(this.getClass(), "/templates" parentDir);

Template template = cfg.getTemplate(f.getName());

template.setEncoding("UTF-8");

String parentFileDir = FileHelper.genFileDir(parentDir, root);

parentFileDir = parentFileDir.replace(".", "/");

String file = FileHelper.genFileDir(f.getName(), root).replace(".ftl", ".java");

System.out.println(file);

File newFile = FileHelper.makeFile(outRoot parentFileDir "/" file);

Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(newFile), "UTF-8"));

template.process(root, out);

logger.debug("已生成文件:" outRoot parentFileDir "/" file);

}

}

public static void main(String[] args) throws Exception {

long time = System.currentTimeMillis();

EasyCodeApplication g = new EasyCodeApplication();

Map map = new HashMap();

map.put("tr_usergroup_menu", "用户组菜单表");

Iterator> it = map.entrySet().iterator();

while (it.hasNext()) {

Map.Entry e = it.next();

//设置数据库主键字段

g.gen(e.getKey(), e.getValue(), "id", "id");

}

System.out.println("-------------------模版文件生成完毕,时间:" (System.currentTimeMillis() - time) "毫秒 ----------------!!!");

}

}

java增删改一键生成_easyCode(java自动生成增删改查代码)相关推荐

  1. 基于.Net Core Web MVC的图书查询系统——第四章,添加模型并使用EF Core生成基架自动生成控制器和视图

    基于.Net Core Web MVC的图书查询系统 第一章,.Net Core Web MVC配置身份验证和注册登录功能并修改默认页面 第二章,.Net Core Web MVC配置邮件发送服务 第 ...

  2. java自动生成类_自动生成优化的Java类专业知识

    java自动生成类 如果您今年访问过JavaOne,您可能已经参加了我的演讲"如何从数据库生成定制的Java 8代码". 在那次演讲中,我展示了如何使用Speedment Open ...

  3. java怎么生成字母_java自动生成字母

    新建一个类SpringContextUtil.java: import org.springframework.beans.BeansException; import org.springframe ...

  4. java自定义表单_JSP实现用于自动生成表单标签html代码的自定义表单标签

    本文实例讲述了JSP实现用于自动生成表单标签HTML代码的自定义表单标签.分享给大家供大家参考.具体如下: 这个是自己写的一个简单的JSP表单标签,用于自动生成checkBox,select,radi ...

  5. java实体类没有映射文件_MyBatis自动生成实体类、DAO和XML映射文件,并去掉实体类中的getter和setter方法...

    今天花了3个多小时搞定了这个事情,写个Blog记录一下,先看一下最终生成的实体类吧. packagecom.mybatis.pojo;importlombok.AllArgsConstructor;i ...

  6. java中appletviewer是什么意思_自动生成供AppletViewer运行Java Applet的HTML文件

    这几天开始自学Java,搭建Eclipse作为开发环境,发现实在太智能了,貌似对学习无益.于是搜了下,另外搭建了EditPlus上的简易Java开发环境,确实比较适合学习,不足之处是没法配置比较方便的 ...

  7. JAVA课程设计 小学生数学练习题目自动生成系统

    课程设计的任务和目标 目标: 编写一个能够自动生成小学生数学练习题目的程序.设计一个程序,能够根据用户的选择生成"10以内加法"."10以内减法"." ...

  8. mysql xml生成工具_自动生成po、dao、xml 工具:mybatis-generator

    需要注意:文件路径关系,xml路径,jar包路径,以及xml中生成文件的路径等. 由于MyBatis属于一种半自动的ORM框架,所以主要的工作将是书写Mapping映射文件,但是由于手写映射文件很容易 ...

  9. vue可视化拖拽生成工具_GitHub - 1260215278/dragUI: 基于vuedraggable.js + uni 的可视化拖拽编程,自动生成项目,自动生成代码,自行导入第三方组件...

    dragUI 用于UNI可拖拽可视化编程 在线演示 效果图 基于 快速开始 参考uni官网安装普通uni项目(运行uni-app)运行到浏览器 另需要手动下载包npm install 项目目录 col ...

  10. 【记录4】【密码生成】前端自动生成8位由字母和数字组成的密码

    最近做项目,需要管理员在登记新用户时可以点击按钮自动生成密码功能. 要求1:数字+大写字母+小写字母8位 长度为8 必须包含字母和数字(注意:这里没有说字母区分大小写) 效果图: 代码: automa ...

最新文章

  1. .NET 2.0 泛型在实际开发中的一次小应用
  2. 搭建Git服务器环境----Git hooks代码自动部署
  3. linux安装mysql5.7.18_Linux 安装MySQL5.7.18
  4. c语言cnn实现ocr字符,端到端的OCR:基于CNN的实现
  5. 批处理文件将多台连接的手机安装同一个APP
  6. 【解题报告】Leecode 384. 打乱数组——Leecode每日一题系列
  7. c语言判断x的个位数是否为5,用C语言编程从键盘输入一个正整数,判断其个位数是否为5,若是5则输出“yes”,否则输出“no”...
  8. 《互联网理财一册通》一一第1章 做好互联网理财前的准备工作
  9. ASA防火墙SSL ×××配置
  10. fme坐标转换器_利用FME做坐标转换
  11. Solidworks教程:利用Simulation模拟热传导
  12. js逆向-1 模拟登陆微信公众号平台
  13. 自己组装nas服务器万兆,我用最便宜的方法,配了一套万兆 NAS
  14. uni-app 无网络图标不显示问题解决
  15. 今日头条,即将崛起为中国互联网第三极
  16. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java社团管理系统0gl2e
  17. 我的前端成长之路-写给在迷茫路上的人
  18. Java毕设项目大学生校园兼职系统计算机(附源码+系统+数据库+LW)
  19. 五个喜欢点赞图标动画特效(附源码,效果图)
  20. 对交换机与路由器的认知

热门文章

  1. 冬奥网络安全卫士被表彰突出贡献,探寻冬奥背后的安全竞技
  2. 少拿游戏来骗我,虚幻引擎5上的《黑客帝国》全新体验,画面帅到爆
  3. 哈哈!TCP泄露了操作系统信息···
  4. 如何让 Mac在运行 Windows时享受极致体验?Parallels Desktop 16给你答案!
  5. 看完这篇操作系统,和面试官扯皮就没问题了!
  6. 看完就入门系列!吞吐量、消息持久化、负载均衡和持久化、伸缩性…… 你真的了解 Kafka 了吗?...
  7. 华为正准备发布属于自己的手机操作系统;腾讯已经交出了首张产业互联网成绩单……...
  8. 云有约 | 精华汇总
  9. java 数组数据类型_java基本数据类型和数组
  10. flink sql设置并行度_Flink集成Hivestream模式用例