逆向工程vgenerator(一)
前言
想要自己实现一个mybatis-generator类似的轮子,目前只实现MySQL部分的方法。利用下班时间,写了一个小项目,实现了这个功能。我准备分成三篇博客来写这个东西。
基类
/**
*基类
*通用方法和属性
*getMapper 获取mapper 例如:cc.vvxtoys.mapper.StudentMapper
*getPojo 获取实体 例如:cc.vvxtoys.pojo.Student
*getFileName 生成地址
*@author vvxtoys
*/
package cc.vvxtoys.bean;
import cc.vvxtoys.config.Engine;
public class BaseBean {
protected String clazz = "";//实体类名
protected String context = "";//bean内容
public String getClazz() {
return clazz==null?"":clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
public String getContext() {
return context==null?"":context;
}
public void setContext(String context) {
this.context = context;
}
public String getMapper(){
return Engine.targetMapper+"."+clazz+"Mapper";
}
public String getPojo(){
return Engine.targetPackage+"."+clazz;
}
public String getFileName() {
return null;
}
}
Bean
/**
*ClassBean
*dependency 生成实体是否存在Date类型 存在的话导入java.util.Date
*@author vvxtoys
*/
package cc.vvxtoys.bean;
import java.io.File;
import cc.vvxtoys.config.Engine;
public class ClassBean extends BaseBean{
private String attributes = "";//属性
private String methods = "";//方法
private String constructors = "";//构造
private String packages = Engine.targetPackage;
private boolean dependency = false;//依赖
public ClassBean(String clazz) {
this.clazz = clazz;
}
public String getAttributes() {
return attributes;
}
public void setAttributes(String attributes) {
this.attributes = attributes;
}
public String getMethods() {
return methods;
}
public void setMethods(String methods) {
this.methods = methods;
}
public String getConstructors() {
return constructors;
}
public void setConstructors(String constructors) {
this.constructors = constructors;
}
public String getPackages() {
return packages;
}
public boolean isDependency() {
return dependency;
}
public void setDependency(boolean dependency) {
this.dependency = dependency;
}
public String getFileName(){
return Engine.targetProject+File.separator+Engine.targetPackage.replace(".", File.separator)+File.separator+clazz+".java";
}
}
Mapper
/**
*MapperBean
*primary 主键 一般来说建表是有的,默认为true
*@author vvxtoys
*/
package cc.vvxtoys.bean;
import java.io.File;
import cc.vvxtoys.config.Engine;
public class MapperBean extends BaseBean{
private String packages = Engine.targetMapper;
private boolean primary = true;
public MapperBean(String clazz) {
this.clazz = clazz;
}
public boolean isPrimary() {
return primary;
}
public String getPackages() {
return packages;
}
public void setPrimary(boolean primary) {
this.primary = primary;
}
public String getFileName() {
return Engine.targetProject + File.separator + Engine.targetMapper.replace(".", File.separator)
+ File.separator + clazz + "Mapper.java";
}
}
XML
/**
*XmlBean
*这个类其实我是不想写的,原定计划使用dom4j来实现,但是最终使用dom4j换行没有达到我想要的
*效果,所以我就自己写了一个简单的xml方法,可以满足我现在的需求了。
*方法就不写注释了,感觉应该能看懂
*@author vvxtoys
*/
package cc.vvxtoys.bean;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import cc.vvxtoys.utils.Vconst;
import cc.vvxtoys.config.Engine;
import cc.vvxtoys.utils.Common;
public class XMLBean extends BaseBean {
private String name;//节点名
private List<XMLBean> childrens = new ArrayList<XMLBean>();//子节点
private int cnt;//用来判断空格
private boolean isEnd = true;//是否关闭节点
private String tname;//表名
public XMLBean(String name, String tname, String clazz) {
this.name = name;
this.tname = tname;
this.clazz = clazz;
if (name.equals(Vconst.ROOTELEMENT[0])) {
cnt = 0;
}
}
public XMLBean(String name) {
this(name, null, null);
}
public void init() {
for (int i = 0; i < cnt; i++) {
this.context += Vconst.SPACE;
}
context += "<" + name + ">";
}
public void addElement(XMLBean item) {
item.setCnt(this.cnt + 2);
childrens.add(item);
isEnd = false;
}
public void addText(String text) {
StringBuffer buff = new StringBuffer(context);
buff.append(Vconst.LINE);
for (int i = 0; i < cnt + 1; i++) {
buff.append(Vconst.SPACE);
}
buff.append(text);
context = buff.toString();
isEnd = false;
}
public void addEndText(String text) {
if (childrens != null && childrens.size() > 0) {
context += Vconst.LINE;
for (XMLBean i : childrens) {
context += i.toString();
}
}
childrens.clear();
StringBuffer buff = new StringBuffer(context);
for (int i = 0; i < cnt + 1; i++) {
buff.append(Vconst.SPACE);
}
buff.append(text);
context = buff.toString();
isEnd = false;
}
public void addAttribute(String Qname, String value) {
context = context.substring(0, getSize() - 1);
StringBuffer buff = new StringBuffer(context);
buff.append(Common.ConcatAttr(Qname, value));
buff.append(" >");
context = buff.toString();
}
public int getSize() {
return context.length();
}
public void setCnt(int cnt) {
this.cnt = cnt;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
public String getFileName() {
return Engine.targetProject + File.separator + Engine.targetXML.replace(".", File.separator) + File.separator
+ clazz + "Mapper.xml";
}
public String toString() {
StringBuffer buffer = new StringBuffer(context);
if (isEnd) {
return context.substring(0, getSize() - 1) + "/>\n";
}
buffer.append(Vconst.LINE);
if (childrens != null && childrens.size() > 0) {
for (XMLBean i : childrens) {
buffer.append(i.toString());
}
}
for (int i = 0; i < cnt; i++) {
buffer.append(Vconst.SPACE);
}
buffer.append("</").append(name).append(">");
buffer.append(Vconst.LINE);
return buffer.toString();
}
}
配置工具类
/**
*读取配置文件
*初始化,如果没有自定义配置文件,默认全文检索默认配置文件
*author vvxtoys
*/
package cc.vvxtoys.config;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
import cc.vvxtoys.utils.Common;
public class Engine extends Properties{
/**
*
*/
private static final long serialVersionUID = 1L;
private static boolean isDefault = true;
private static String DEFAULT_CONFIG = "vgenerator.properties";
public static String targetPackage;//实体类包
public static String targetProject;//项目路径
public static String targetMapper;//mapper包
public static String targetXML;//xml包
public static String [] objectName;//实体名
public static String [] tableName;//表名
public static String user;
public static String pass;
public static String name;
public static String url;
public static void setConfigFile(String path){
DEFAULT_CONFIG = path;
isDefault = false;
}
private Engine() {
// TODO Auto-generated constructor stub
}
public static Engine getInstance(){
Engine engine = null;
String path = isDefault?Common.searchAbsolutePath(DEFAULT_CONFIG):DEFAULT_CONFIG;
try {
engine = new Engine();
InputStreamReader is = new InputStreamReader(new FileInputStream(path), "UTF-8");
engine.load(is);
targetPackage = (String)engine.getProperty("targetPackage");
targetProject = (String)engine.getProperty("targetProject");
targetMapper = (String)engine.getProperty("targetMapper");
targetXML = (String)engine.getProperty("targetXML");
tableName = ((String)engine.getProperty("tableName")).split(",");
objectName = ((String)engine.getProperty("objectName")).split(",");
user = (String)engine.getProperty("user");
pass = (String)engine.getProperty("pass");
name = (String)engine.getProperty("name");
url = (String)engine.getProperty("url");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
return engine;
}
}
逆向工程vgenerator(一)的更多相关文章
- 逆向工程vgenerator(三)
前言 该项目的最后一篇博文,最终构建,写入文件,整体项目流程将在本片文章中写出. jdbcType /** *@author vvxtoys *mysql单位 -> jdbcType */ pa ...
- 逆向工程vgenerator(二)
前言 接上篇,这一篇主要的工具类和工厂类,包括数据库方法.通用方法,三个工厂. 常量 /** *author vvxtoys *默认xml开头 *文档分隔 *默认方法名 */ package cc.v ...
- IDEA 中生成 MyBatis 逆向工程实践
IDEA 逆向 MyBatis 工程时,不像支持 Hibernate 那样有自带插件,需要集成第三方的 MyBatis Generator. MyBatis Generator的详细介绍 http:/ ...
- mybatis逆向工程生成JavaBean、dao、mapper generatorSqlmapCustom
import java.io.File; import java.util.ArrayList; import java.util.List; import org.mybatis.generator ...
- mybatis入门基础(九)----逆向工程
一.什么是逆向工程 mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的代码(mapper.java,mapper.xml.po. ...
- iOS逆向工程资料
链接: 基于iOS逆向工程的微信机器人 - 猫友会大讲坛第1期 我的失败与伟大 —— 创业必备的素质(狗神经验谈)
- PowerDesigner逆向工程导入MYSQL数据库总结
由于日常数据建模经常使用PowerDesigner,使用逆向工程能更加快速的生成模型提高效率,所以总结使用如下: 首先现在PowerDesigner,这里提供PD16.5版本链接: http://pa ...
- IOS_ios逆向工程-静态分析
返回博客列表 原 ios逆向工程-静态分析 余成海 发布时间: 2014/11/03 19:17 阅读: 11201 收藏: 17 点赞: 5 评论: 6 最近在学习IOS逆向工程,查看网络上的资料也 ...
- (转) PowerDesigner逆向工程导入MYSQL数据库总结
PowerDesigner逆向工程导入MySQL数据库总结 由于日常数据建模经常使用PowerDesigner,使用逆向工程能更加快速的生成模型提高效率,所以总结使用如下: 1. 安装MYS ...
随机推荐
- Composer的入门与使用
一 什么是composer composer是一种php的包管理工具, 类似于Java的maven, Ubuntu的apt等, 可以方便的解决php的包管理, 管理依赖关系等问题. 二 使用compo ...
- 20155219 付颖卓《基于ARM试验箱的接口应用于测试》课程设计个人报告
一.个人贡献 参与课设题目讨论及完成全过程: 资料收集: 负责代码调试: 修改小组结题报告: 负责试验箱的管理: 二.设计中遇到的问题及解决方法 1.makefile无法完成编译.如下图: 答:重新下 ...
- 关于java中为什么尽量把受检异常转化为非受检异常
首先理解一下受检异常与非受检异常: 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机操作中可能遇到的异常,是一种常见的运行错误,只要程序设计的没有问题通常就不会发生.受检异常与程序的上 ...
- SqlSugar ORM 的学习
http://www.codeisbug.com/Doc/8/1163 https://www.cnblogs.com/sunkaixuan/p/6082664.html
- PXE高效能批量网络装机
PXE简绍 PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器 ...
- 在kerberos认证过程中Active Directory的作用
LDAP介绍 1),ladp(Lightweight Directory Access Protocol),轻量级目录访问协议,提供被称为目录服务的信息服务,特别是基于X.500(构成全球分布式的目录 ...
- 使用korofileheader插件vs code添加文件头注释和函数注释
korofileheadervs code添加文件头注释和函数注释1.extensions搜索fileheader,安装koroFileHeader2.设置:edit=>perference=& ...
- 手写SpringMVC实现
设计自己的MVC架构 1.读取配置通过web.xml中加载我们自己写的MyDispatcherServlet和读取配置文件. 2.初始化九大组件只需实现基本的:1).加载配置文件:2).扫描用户配置包 ...
- linux后台执行命令:&与nohup的用法
& 这种方法很简单,就是在命令之后加个“&”符号就可以了,如下: ./test & 这样一来,test程序就在后台运行了.但是,这样处理还不够,因为这样做虽然程序是在后台运行了 ...
- 18.24 Ubuntu修改静态IP
1.查询系统当前的ip地址配置信息,输入ifconfig命令进行查看 2.打开文件设置静态IP sudo vi /etc/network/interfaces 3.设置address ip.gatew ...