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

这篇博客介绍了一种自动生成Java代码的工具,用于创建DMO(数据库模型对象)和处理增删改查操作。该工具基于Freemarker模板和MySQL数据库,通过配置数据库连接信息和模板路径,可以快速生成Service、ServiceImpl、Dao和DaoImpl层的代码,简化了后台管理系统开发中的重复工作。
摘要由CSDN通过智能技术生成

标签:

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

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

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

20180110183714535721.png

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

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

20180110183714537674.png     

20180110183714539627.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代码如下:

20180110183714541580.png                                    

20180110183714543533.png

20180110183714545486.png          

20180110183714546462.png

20180110183714548415.png    

20180110183714549392.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;

}

}

标签:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值