dmo Java_java DMO及增删改查代码的自动生成

在web开发过程中,尤其是后台管理系统的开发中,少不了增删改成的基础操作,原来我自己的做法是一份一份的拷贝粘贴,然后修改其中的不同,然而这样既枯燥无味又浪费了大量的时间,所以根据自己项目结构的特点写了一个自动生成结构代码的工具jar包,可以根据数据库表直接生成相应数据库模型对象(DMO)以及对表的增删改查代码。

之前我考虑过多种自动生成代码的提供方式,比如web的方式,通过在页面文本框里面输入各种参数,比如模板文件地址,生成文件地址,数据库名,数据库用户名和密码等,点击生成按钮就可以生成源代码文件。但这样需要部署启动这个web程序。使用java的图形用户界面,但我对java图形的相关API并不了解,最后决定使用一个jar包的方式,方便简洁。

由于模板文件使用的是freemarker,数据库使用的是mysql,所以引入其他的两个jar文件。

c2e28f08bd7c492c001057f5e55a2bb4.png

如上图,AutoGenerationJavaCode.jar 是将原本工程里的 AutoGenerationJavaCode.java文件打包生成的,也是最终的形式。通过在AutoGenerationDemo类main函数中设置参数,直接调用即可自动生成代码。

配置好参数后在左图右键运行java程序即可生成右图代码文件:

450d68b0a1bf1f4c135fcd025efd30bc.png     

4005a2eb62175625e9110a1f5a515519.png

调用如下:

1 public classAutoGenerationDemo {2

3 public static void main(String[] args) throwsClassNotFoundException, SQLException, IOException, TemplateException {4 //数据库地址

5 String url = "jdbc:mysql://10.27.209.137:3306/sample";6 //用户名

7 String name = "root";8 //密码

9 String passWord = "root";10 //驱动

11 String driver = "com.mysql.jdbc.Driver";12 //表名

13 String tableName = "t_operate_log";14 //模板路径

15 String templateDir = "F:\\template";16 //生成文件路径

17 String autoGeneratedFile = "F:\\autoGenerated";18 //实例化

19 AutoGenerationJavaCode autoGenerationJavaCode = newAutoGenerationJavaCode(url, name, passWord, driver,20 tableName,autoGeneratedFile,templateDir);21

22 //调用生成java代码方法

23 autoGenerationJavaCode.autoGenerationJavaCode();24 }25

26 }

在main方法中配置好所需参数,由于代码包含注释,不在赘述,调用jar包中 AutoGenerationJavaCode的autoGenerationJavaCode方法即可生成,控制台会打印文件生产完成

我的Web项目的结构采用的是三层结构,Controller层调用service层,从service层调用dao层(数据操作层),所以决定自己生成service层,dao层代码。其实质就是将模板文件中的变量进行替换。模板文件及对应生成的java代码如下:

f61bb7c7dda7bb5530e56f95b660630a.png                                    

bf242dd26a717401ef5032270c3ca11f.png

610d69c0ccdf6d73af724eb6e2a74d07.png          

082293284ceb40e7adc11cf0e127f0f9.png

5e49496477ea2fc2b976f5980e7e18aa.png    

37c93a4668b3853ae4b80d330487e18a.png

jar包的源代码如下:

packagecom.sun.autoGenerated;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.OutputStreamWriter;importjava.io.Writer;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSetMetaData;importjava.sql.SQLException;importjava.util.HashMap;importjava.util.Map;importfreemarker.template.Configuration;importfreemarker.template.Template;importfreemarker.template.TemplateException;public classAutoGenerationJavaCode {privateString url;privateString name;privateString passWord;privateString driver;privateString sql;privateString tableName;privateString templateDir;privateString autoGeneratedFile;private static String[][] fileNameArray = new String[5][2];static{

fileNameArray[0][0] = "dmoTemplate.ftl";

fileNameArray[0][1] = "DMO.java";

fileNameArray[1][0] = "serviceTemplate.ftl";

fileNameArray[1][1] = "Service.java";

fileNameArray[2][0] = "serviceImplTemplate.ftl";

fileNameArray[2][1] = "ServiceImpl.java";

fileNameArray[3][0] = "daoTemplate.ftl";

fileNameArray[3][1] = "Dao.java";

fileNameArray[4][0] = "daoImplTemplate.ftl";

fileNameArray[4][1] = "DaoImpl.java";

}publicAutoGenerationJavaCode(String url, String name, String passWord, String driver, String tableName,

String autoGeneratedFile,String templateDir) {this.url =url;this.name =name;this.passWord =passWord;this.driver =driver;this.sql = "select * from " +tableName;this.tableName =tableName;this.templateDir =templateDir;this.autoGeneratedFile =autoGeneratedFile;

}public void autoGenerationJavaCode() throwsIOException, TemplateException, ClassNotFoundException,

SQLException {

Configuration cfg= newConfiguration();

cfg.setDefaultEncoding("utf-8");

String className=dealTableName();

String fileName=dealClassName(className);

Map columnMap =getColumn();//设置模板文件路径

cfg.setDirectoryForTemplateLoading(newFile(templateDir));

Map rootMap = new HashMap();

rootMap.put("className", className);

rootMap.put("columnMap", columnMap);

File dir= new File(autoGeneratedFile + "\\");//检查目录是否存在,不存在则创建

if (!dir.exists()) {

dir.mkdir();

}for (int i = 0; i < fileNameArray.length; i++) {

Template temp= cfg.getTemplate(fileNameArray[i][0]);

File docFile= new File(autoGeneratedFile + "\\" + fileName + fileNameArray[i][1]);

Writer docout= new BufferedWriter(new OutputStreamWriter(newFileOutputStream(docFile)));//输出文件

temp.process(rootMap, docout);

}

System.out.println("==============文件生产成功===============");

}//获取数据库表字段名放入map中

public Map getColumn() throwsClassNotFoundException, SQLException {

Connection conn;

PreparedStatement pStemt= null;

Class.forName(driver);

conn=DriverManager.getConnection(url, name, passWord);

pStemt=conn.prepareStatement(sql);

ResultSetMetaData rsmd=pStemt.getMetaData();

Map columnMap = new HashMap();int size =rsmd.getColumnCount();for (int i = 0; i < size; i++) {

String columnName=dealColumnName(rsmd, i);

columnMap.put(columnName, columnName);

}

conn.close();returncolumnMap;

}//将表名转换为DMO的字段名,比如 operate_type 转换后为 operateType

private String dealColumnName(ResultSetMetaData rsmd, int i) throwsSQLException {

String columnName= rsmd.getColumnName(i + 1).toLowerCase();

String charAfterLine= String.valueOf(columnName.charAt((columnName.indexOf("_") + 1)));

String convertedChar=charAfterLine.toUpperCase();

columnName= columnName.replace("_" +charAfterLine, convertedChar);returncolumnName;

}//将表名转换为类型类名 比如 t_operate_log 转换后为 operateLog ,类名首字母应为大写,这里在freemarker的模板里直接转换

privateString dealTableName() {

String className= tableName.toLowerCase().substring(tableName.indexOf("_") + 1);

String charAfterLine= String.valueOf(className.charAt((className.indexOf("_") + 1)));

String convertedChar=charAfterLine.toUpperCase();

className= className.replace("_" +charAfterLine, convertedChar);returnclassName;

}//将类名转换为文件名,java公共类名与其文件名应该相同,这里将首字母转换为大写 如operateLog 转换后为 OperateLog

privateString dealClassName(String className) {

String first= className.substring(0, 1).toUpperCase();

String rest= className.substring(1, className.length());

String fileName= newStringBuffer(first).append(rest).toString();returnfileName;

}

}

原文:http://www.cnblogs.com/jarman/p/5180270.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

if __name__ == __main___一文带你弄懂python中if __name__ == #39;__main__#39;

我们在python模块那章节的学习&#xff0c;有所接触到if __name__ __main__这个概念。当时我们只是大概描述了一番&#xff0c;不少伙伴还是有所困惑&#xff0c;今天就让我们通过实际例子去讲解这条语句到底有何含义。一个python文件有两种用途&#xff0c;一种被当主程序、脚…

java 生成apk包_Eclipse导出安卓apk文件的图文教程

安装到Android手机上的apk需要签名&#xff0c;本文描述了如何创建自己的签名及从Eclipse中导出apk。方法/步骤1、在Eclipse中选择一个Android工程&#xff0c;然后点击鼠标右键菜单中的“Export”&#xff1a;2、选择“Android”->;“Export Android Application”&#xf…

营业执照在线生成_平罗县实现个体户营业执照“秒批”

近日平罗县市场监管局注册登记窗口推出个体工商户“秒批”系统。今后&#xff0c;75%个体户常见经营项目可实现5分钟内乃至数秒无人工干预智能审批。01 一是实现智能化审批。平罗县市场监管局登记注册窗口依托自治区系统升级改造&#xff0c;推行企业设立登记标准化和智能化。…

wireshark-win64-3.4.0安装_轴承安装规范

Sulli小苏&#xff1a;今天详细介绍下如何正确的安装轴承&#xff0c;正确的安装操作是轴承长寿命的关键&#xff0c;轮毂轴承的主要作用是承重和为轮毂的转动提供精确引导&#xff0c;它既承受轴向载荷又承受径向载荷&#xff0c;是一个非常重要的零部件。轴承的安装正确方式滚…

代码实现tan graph model for classification_几行代码搞定ML模型,低代码机器学习Python库正式开源...

PyCaret 库支持在「低代码」环境中训练和部署有监督以及无监督的机器学习模型&#xff0c;提升机器学习实验的效率。想提高机器学习实验的效率&#xff0c;把更多精力放在解决业务问题而不是写代码上&#xff1f;低代码平台或许是个不错的选择。最近&#xff0c;机器之心发现了…

dataframe 如何选中某列的一行_带你领略pandas中多表之间如何处理

但我们在处理Pandas多表数据时,我们需要将多个表之间进行表格的连接与合并,当连接完多表之后我们可能还需要对数据进行多重的索引,方便我们更快的找到数据,以及对数据进行做透视表,更加直观的去观察我们的数据,今天我们就围绕着数据合并以及数据重塑及透视表进行展开讲解,让我们…

python计算定积分_python编程通过蒙特卡洛法计算定积分详解

这篇文章主要介绍了python编程通过蒙特卡洛法计算定积分详解&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。 想当初&#xff0c;考研的时候要是知道有这么个好东西&#xff0c;计算定积分。。。开玩笑&#xff0c;那时候计算定积分根本没有这么简单的。但这确…

java spring mvc api_SpringMVC实现REST API

JSON使用Jackson jar包、RequestBody、ResponseBody注解&#xff0c;达到&#xff1a;1. 请求JSON消息体映射为JAVA对象2. 返回JAVA对象映射为JSON消息体Step 1. 导入Jackson jar包&#xff1a;Step 2. 在Spring MVC配置中加入annotation-driven&#xff0c;该配置可以确保Requ…

gateway动态路由_无语!SpringCloud Gateway动态路由之Nacos,我已经讲得很清楚了

前言当我们的网关Gateway程序开发完成之后&#xff0c;需要部署到生产环境&#xff0c;这个时候你的程序不能是单点运行的&#xff0c;肯定是多节点启动(独立部署或者docker等容器部署)&#xff0c;防止单节点故障导致整个服务不能访问&#xff0c;网关是对客户端的入口与出口&…

json里面的list数据取不出来_sql盲注的困局:利用DNSlog快速导出数据

对于一个sql注入点来说最幸运的就是支持堆叠注入&#xff0c;最蛋疼的就是盲注&#xff0c;盲注里面难搞的就是基于时间的盲注。我们在本地利用这段代码进行演示<?php error_reporting(0); $link mysqli_connect(localhost,root,root); mysqli_set_charset($link,utf8); m…

python怎么测试程序_python如何测试程序

测试函数是用于自动化测试&#xff0c;使用python模块中的unittest中的工具来测试 附上书中摘抄来的代码&#xff1a;#codingutf-8 import unittest from name_function import get_formatted_name class NamesTestCase(unittest.TestCase): def test_first_last_name(self): f…

判定覆盖白盒测试java_白盒测试系列(四)条件判定覆盖

条件判定覆盖一、定义&#xff1a;程序中每个判定至少有一次为真值&#xff0c;有一次为假值,使得程序中每个分支至少执行一次&#xff0c;且使得各判定中的每个条件获得各种可能的取值至少满足一次。二、特点&#xff1a;1、综合了条件覆盖和判定覆盖的特点2、满足条件判定覆盖…

discard python_Netty入门教程(一) 实现DISCARD服务

官方那个给出的介绍是&#xff1a;Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具&#xff0c;用以快速开发高性能、高可靠性的网络服务器和客户端程序。然后我们简单理解一下&#xff0c;这玩意就是个程序&#xff0c;干什么的&am…

python向量化编程技巧_神经网络基础之Python与向量化

Vectorization 深度学习算法中&#xff0c;数据量很大&#xff0c;在程序中尽量减少使用loop循环语句&#xff0c;而可以使用向量运算来提高程序运行速度。 向量化(Vectorization)就是利用矩阵运算的思想&#xff0c;大大提高运算速度。例如下面所示在Python中使用向量化要比使…

SQL server 数据库面试题及答案(实操2)

使用你的名字创建一个数据库 创建表&#xff1a; 数据库中有三张表&#xff0c;分别为student,course,SC&#xff08;即学生表&#xff0c;课程表&#xff0c;选课表&#xff09; 问题&#xff1a; --1.分别查询学生表和学生修课表中的全部数据。--2.查询成绩在70到80分之间…

python电子相册制作软件_电子相册怎么做

电子相册制作 本文来自#千兆网络有什么用#征稿活动&#xff0c;不断提速的网络给你的生活带来了什么变化&#xff1f;快来参与活动&#xff0c;聊聊你玩转互联网&#xff0c;高速网上冲浪的经历&#xff01;>点击这里查看活动详情< 现在手机的拍照功能日趋强大&#xff0…

java list 范围删除_JAVA中循环删除list中元素(移除list两时间范围外的元素)

印象中循环删除list中的元素使用for循环的方式是有问题的&#xff0c;但是可以使用增强的for循环&#xff0c;然后今天在使用时发现报错了&#xff0c;然后去科普了一下&#xff0c;再然后发现这是一个误区。下面就来讲一讲。。伸手党可直接跳至文末。看总结。。JAVA中循环遍历…

python reduce函数_Python reduce()函数的用法小结

reduce()函数也是Python内置的一个高阶函数。 reduce() 格式&#xff1a; reduce (func, seq[, init()]) reduce()函数即为化简函数&#xff0c;它的执行过程为&#xff1a;每一次迭代&#xff0c;都将上一次的迭代结果&#xff08;注&#xff1a;第一次为init元素&#xff0c;…

Php获取id并提交表单,提交表单后 PHP获取提交内容的实现方法

提交表单后 PHP获取提交内容的实现方法2020-06-14 15:35:24问题&#xff1a;网页上提交表单之后&#xff0c;PHP为什么不能获取提交的内容&#xff1f;然而在老版本的PHP上运行却正常。新版的PHP已经废弃了原来的表单内容处理方式&#xff0c;即不再把提交的表单的内容直接复制…

idea查看一个类的所有子类_java new一个对象的过程中发生了什么

java在new一个对象的时候&#xff0c;会先查看对象所属的类有没有被加载到内存&#xff0c;如果没有的话&#xff0c;就会先通过类的全限定名来加载。加载并初始化类完成后&#xff0c;再进行对象的创建工作。我们先假设是第一次使用该类&#xff0c;这样的话new一个对象就可以…