逆向工程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 ...
随机推荐
- 返回上一页面带数据 getCurrentPages 使用
https://blog.csdn.net/She_lock/article/details/81099449
- 三大前端框架(react、vue、angular2+)父子组件通信总结
公司业务需要,react.vue.angular都有接触[\无奈脸].虽然说可以拓展知识广度,但是在深度上很让人头疼.最近没事的时候回忆各框架父子组件通信,发现很模糊,于是乎稍微做了一下功课,记录于此 ...
- angularjs - 自定义指令(directive)
自定义指令(directive) 使用 .directive 函数来添加自定义的指令. 要调用自定义指令,HTML 元素上需要添加自定义指令名. 例子:使用驼峰法来命名一个指令, demoDirect ...
- 并发、并行与多线程——C++
C++11标准在标准库中为多线程提供了组件. 并发: 并发指的是两个或多个独立的活动在同一时段内发生.同一时间段内可以交替处理多个操作.一个CPU交替处理多个任务,存在竞争关系,在逻辑上表现为一个时段 ...
- 《Java核心技术(卷一)》读书笔记——第六章:内部类
1. 内部类的概念? 类中类 2. 为什么要用内部类? 内部类的方法可以访问外部类的实例域 内部类对外部类的同一个包中的类实现了隐藏 匿名内部类在“想要定义一个回调函数却又不想编写 ...
- PHP数据库连接mysql与mysqli的区别与用法
一.mysql与mysqli的概念相关: 1.mysql与mysqli都是php方面的函数集,与mysql数据库关联不大. 2.在php5版本之前,一般是用php的mysql函数去驱动mysql数据库 ...
- JDK安装与环境配置——学习JAVA的准备工作
1.安装JDK 官网,版本看了也不明白区别,我下载的第一个 JAVA SE 12 https://www.oracle.com/technetwork/java/javase/downloads/in ...
- django之Form组件补充
自定义验证规则 方法一: from django.forms import Form from django.forms import widgets from django.forms import ...
- 【软件构造】-<笔记>-浅谈java中类的初始化过程
编写java程序时,每创建一个新的对象,都会对对象的内容进行初始化. 每一个类的方法中的局部变量都有严格的初始化要求,因此假如写出下面的程序: void f(){ int i; i++; } 编译时就 ...
- 2019年4月zstu月赛A: 我不会做
问题 A: 我不会做 时间限制: 1 Sec 内存限制: 128 MB 题目描述 众所周知,duxing201606就是plw. 然而已经9102年了,plw仍旧没有npy.plw非常难过,于是他打 ...