逆向工程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 ...
随机推荐
- mysql数据库查询和聚合函数
1.模糊查询 like % 表示多个任意字符 _ 表示任意一个字符 例如:查询黄姓同学 select * from student where name '黄%' select * from stud ...
- python中shelve模块的使用
import shelve # 将序列化文件操作dump与load进行封装,写入文件的内容就是个大的字符串字典 s_dic = shelve.open("text/b.txt",w ...
- 最详细的 linux grep命令教程
简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它 ...
- 2018-2019-2 20165313 《网络对抗技术》 Exp5:MSF基础应用
实践使用漏洞和辅助模块 任务一:MS17-010安全漏洞 任务二:(1)MS11-050(失败)(2)MS14-064(唯一) 任务三:abode_flash_avm2 辅助模块:(1)ARP扫描模块 ...
- [Ynoi2019模拟赛]Yuno loves sqrt technology III
题目大意: 给你一个长为n的序列a,m次询问,每次查询一个区间的众数的出现次数,强制在线. 解题思路: 出题人题解 众所周知lxl是个毒瘤,Ynoi道道都是神仙题 首先得离散化. 分块后,预处理Fi, ...
- 10. Firewalls (防火墙 2个)
Netfilter是在标准Linux内核中实现的强大的包过滤器. 用户空间iptables工具用于配置. 它现在支持数据包过滤(无状态或有状态),各种网络地址和端口转换(NAT / NAPT),以及用 ...
- 7. Vulnerability exploitation tools (漏洞利用工具 11个)
Metasploit于2004年发布时,将风暴带入了安全世界.它是开发,测试和使用漏洞利用代码的高级开源平台. 可以将有效载荷,编码器,无操作生成器和漏洞利用的可扩展模型集成在一起,使得Metaspl ...
- python函数之可迭代对象、迭代器的判断
怎么判断一个对象是可迭代对象还是迭代器 例子 from collections import Iterable, Iterator lst = ['Today is Wednesday', 'Tomo ...
- [工作积累] D3D10+ 中 Pixel Shader 的input semantic和参数顺序
由于semantic的使用,我们有理由相信 vertex shader的output 和 pixel shader的input是按照semantic来匹配的,而跟传入顺序无关.印象dx9时代是这样. ...
- car的旅行路线
https://www.luogu.org/problemnew/show/P1027 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形 ...