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

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

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

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

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

     

调用如下:

 public class AutoGenerationDemo {

     public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException, TemplateException {
//数据库地址
String url = "jdbc:mysql://10.27.209.137:3306/sample";
//用户名
String name = "root";
//密码
String passWord = "root";
//驱动
String driver = "com.mysql.jdbc.Driver";
//表名
String tableName = "t_operate_log";
//模板路径
String templateDir = "F:\\template";
//生成文件路径
String autoGeneratedFile = "F:\\autoGenerated";
//实例化
AutoGenerationJavaCode autoGenerationJavaCode = new AutoGenerationJavaCode(url, name, passWord, driver,
tableName,autoGeneratedFile,templateDir); //调用生成java代码方法
autoGenerationJavaCode.autoGenerationJavaCode();
} }

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

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

                                    

          

    

jar包的源代码如下:

package com.sun.autoGenerated;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map; import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException; public class AutoGenerationJavaCode { private String url;
private String name;
private String passWord;
private String driver;
private String sql;
private String tableName;
private String templateDir;
private String 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";
} public AutoGenerationJavaCode(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() throws IOException, TemplateException, ClassNotFoundException,
SQLException {
Configuration cfg = new Configuration();
cfg.setDefaultEncoding("utf-8"); String className = dealTableName(); String fileName = dealClassName(className);
Map<String, Object> columnMap = getColumn();
//设置模板文件路径
cfg.setDirectoryForTemplateLoading(new File(templateDir)); Map<String, Object> rootMap = new HashMap<String, Object>();
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(new FileOutputStream(docFile)));
//输出文件
temp.process(rootMap, docout);
}
System.out.println("==============文件生产成功==============="); } //获取数据库表字段名放入map中
public Map<String, Object> getColumn() throws ClassNotFoundException, SQLException {
Connection conn;
PreparedStatement pStemt = null;
Class.forName(driver);
conn = DriverManager.getConnection(url, name, passWord);
pStemt = conn.prepareStatement(sql);
ResultSetMetaData rsmd = pStemt.getMetaData(); Map<String, Object> columnMap = new HashMap<String, Object>();
int size = rsmd.getColumnCount();
for (int i = 0; i < size; i++) {
String columnName = dealColumnName(rsmd, i);
columnMap.put(columnName, columnName);
}
conn.close();
return columnMap;
} //将表名转换为DMO的字段名,比如 operate_type 转换后为 operateType
private String dealColumnName(ResultSetMetaData rsmd, int i) throws SQLException {
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);
return columnName;
} //将表名转换为类型类名 比如 t_operate_log 转换后为 operateLog ,类名首字母应为大写,这里在freemarker的模板里直接转换
private String 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);
return className;
} //将类名转换为文件名,java公共类名与其文件名应该相同,这里将首字母转换为大写 如operateLog 转换后为 OperateLog
private String dealClassName(String className) {
String first = className.substring(0, 1).toUpperCase();
String rest = className.substring(1, className.length());
String fileName = new StringBuffer(first).append(rest).toString();
return fileName;
} }

源码下载:http://files.cnblogs.com/files/jarman/sourceCode.zip

java DMO及增删改查代码的自动生成的更多相关文章

  1. Java针对数据库增删改查代码

    package com.bank.abc; import java.beans.PropertyVetoException; import java.sql.Connection; import ja ...

  2. 最简单的jsp+servlet的增删改查代码

    package ceet.ac.cn.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.s ...

  3. 【简易版】Java ArrayList(增删改查)

    1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: (1)动态的增加和减少元素 (2)实现了ICollectio ...

  4. MongoDB(二)-- Java API 实现增删改查

    一.下载jar包 http://central.maven.org/maven2/org/mongodb/mongo-java-driver/ 二.代码实现 package com.xbq.mongo ...

  5. LR接口测试---Java Vuser之增删改查

    import lrapi.lr; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared ...

  6. MongoDB(六)java操作mongodb增删改查

    java操作mysql数据库的代码我们已经了如指掌了.增删改查,java对mongodb数据库也是类似的操作,先是数据库连接.再是进行操作. 首先我们进入进入admin数据库.然后建立自己的数据库te ...

  7. 百度鹰眼Java接口调用增删改查实例

    因感觉百度鹰眼的使用场景比较符合实际业务,于是对百度鹰眼做了简单功能调试.刚开始使用springframework封装的RestTemplate,但是测试提示ak参数不存在.后又试了几种方法,均提示a ...

  8. Java学生信息增删改查(并没用数据库)

    一个泛型的应用,Java版本增删改查,写的简陋,望批评指正 2016-07-02 很久前写的一个程序了.拿出来存一下,不是为了展示啥,自己用的时候还可以看看.写的很粗糙. import java.io ...

  9. golang学习之beego增删改查代码实现

    记录下使用beego的增删改查实现,数据库使用mysql,完整代码如下: package main import ( _ "crud_beego/routers" //自动注册路由 ...

随机推荐

  1. excel出现错误1327 无效的驱动器

    错误描述:错误1327 无效的驱动器 错误程序:excel 2003   这是office安装源的位置被移动造 成的的,大部分时候安装时可能使用了移动硬盘或者在安装后调整了盘符就会造成这个问题.官方的 ...

  2. cookie 和session 的区别详解

    这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪 ...

  3. apache2.4 绿色版环境配置。

    http://jingyan.baidu.com/article/9faa723152c5d6473d28cb47.html http://jingyan.baidu.com/article/9faa ...

  4. [创业中, 寻求合作] 业务方向:车联网智能终端;APP蓝牙控制汽车;APP网络远程控制汽车 (联系电话:18503086002)

    擅长领域 手机APP蓝牙控制汽车方案 手机APP网络远程控制汽车方案 手机APP与汽车车机的文件极速传输技术 车载OBD终端 (后装) 智能TBOX终端,Base on Linux,使用车规级硬件加密 ...

  5. java.lang.NoClassDefFoundError:org/apache/commons/lang/exception/NestableRuntimeException错误的解决

    java.lang.NoClassDefFoundError 是运行时jvm找不到对应类.这种情况是少包的导致的.根据提示语添加对应的jar包就可以. 感叹一下:maven真是一个伟大的东西,在包的依 ...

  6. PHP WAMP 文件上传 及 简单的上传预览

    ...... 使用特殊的表单类型file, 主(上传)页面: <form action="chuli.php" method="post" enctype ...

  7. 轻松理解spring IOC

    spring IOC(Inversion of control)即控制反转 概念:一,spring框架的核心之一 二,控制权由对象本身转向容器:由容器根据配置文件去创建实例并创建各个实例之间的依赖关系 ...

  8. php常用字符串函数小结

    php内置了98个字符串函数(除了基于正则表达式的函数,正则表达式在此不在讨论范围),能够处理字符串中能遇到的每一个方面内容,本文对常用字符串函数进行简单的小结,主要包含以下8部分:1.确定字符串长度 ...

  9. Transmission : 如何在Fedora下使用BT下载

    先讲讲BT协议的名词: Glossary of BitTorrent terms Transmission 介绍 BT下载客户端 特点: 支持BT下载(.torrent 种子) 或者 磁链( magn ...

  10. 一次完整的HTTP请求所经历的7个步骤

    HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: 1. 建立TCP连接在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连 ...