前言

接上篇,这一篇主要的工具类和工厂类,包括数据库方法、通用方法,三个工厂。

常量

/**
*author vvxtoys
*默认xml开头
*文档分隔
*默认方法名
*/
package cc.vvxtoys.utils; public class Vconst { public static final String DEFAULT_XML_ROOT = "mapper";
public static final String DEFAULT_XML_PUBLICID = "-//mybatis.org//DTD Mapper 3.0//EN";
public static final String DEFAULT_XML_SYSTEMID = "http://mybatis.org/dtd/mybatis-3-mapper.dtd"; public static final String [] ROOTELEMENT = new String[1];//根标签 public static final String SPACE = " ";
public static final String LINE = "\n";
public static final String TAB = "\t";
public static final String TTAB = "\t\t";
public static final String END = ";";
public static final String SPLIT = "\n\n"; public static final String insert = "insert";
public static final String insert1 = "insertSelective";
public static final String select = "selectByPrimaryKey";
public static final String delete = "deleteByPrimaryKey";
public static final String update = "updateByPrimaryKey";
public static final String update1 = "updateByPrimaryKeySelective"; }

公用

package cc.vvxtoys.utils;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map; import cc.vvxtoys.factory.XMLFactory; public class Common {
//查找文件
public static String searchAbsolutePath(String filename) {
String absolutePath = "";
LinkedList<File> list = new LinkedList<File>();
try{
File src = new File(".\\src");
File file = new File(src.getCanonicalPath());
File [] files = file.listFiles();
for(int i=0;i<files.length;i++){
list.add(files[i]);
if(files[i].getAbsolutePath().endsWith(filename)){
absolutePath = files[i].getAbsolutePath();
return absolutePath;
}
}
while(!list.isEmpty()){
File tmp = list.removeFirst(); if(tmp.isDirectory()){
File [] fs = tmp.listFiles();
for(int j=0;j<fs.length;j++){
File f = fs[j];
if(f==null){
continue;
}
list.add(fs[j]);
}
}
if(tmp.getAbsolutePath().endsWith(filename)){
absolutePath = tmp.getAbsolutePath();
return absolutePath;
}
}
}catch(Exception e){
e.printStackTrace();
}
return absolutePath;
}
//首字母大写
public static String upInitials(String str){
return str.substring(0,1).toUpperCase()+str.substring(1);
} public static void writeFile(String filePath, String str) {
try {
FileWriter fw = new FileWriter(new File(filePath), true);
PrintWriter pw = new PrintWriter(fw);
pw.println(str);
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//xml拼接属性
public static String ConcatAttr(String name,String value){
String template = " "+name+"="+"\""+value+"\"";
return template;
}
}

数据库操作

/**
*author vvxtoys
*mysql数据库连接
*获取所有表
*获取所有列
*获取主键
*/
package cc.vvxtoys.config; import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import cc.vvxtoys.factory.XMLFactory; public class DB { private String url;
private String name;
private String user;
private String pass; public Connection conn = null;
public PreparedStatement pst = null; private static final String DEFAULT_URL = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8";
private static final String DEFAULT_NAME = "com.mysql.jdbc.Driver";
private static final String DEFAULT_USER = "root";
private static final String DEFAULT_PASS = "root"; private DB() { } public static DB getInstance() {
DB db = new DB();
db.setName(Engine.name);
db.setPass(Engine.pass);
db.setUrl(Engine.url);
db.setUser(Engine.user);
db.Connection(); return db;
} private void Connection(){
try{
Class.forName(name);
conn=DriverManager.getConnection(url,user,pass);
}catch(Exception e){
e.printStackTrace();
}
} public List<String> getTables(){
List<String> tables = new ArrayList<String>();
try{
if(conn!=null){
DatabaseMetaData dbmd = conn.getMetaData();
ResultSet res = dbmd.getTables(null, null, null, new String[]{"TABLE"});
while (res.next()) {
tables.add(res.getString(3));
}
}
}catch(Exception e){ }
return tables;
} public Map<String,String> getColumns(String tablename){
Map<String,String> result = new HashMap<String, String>();
String sql = "desc "+tablename;
try{
pst = conn.prepareStatement(sql);
PreparedStatement pst = this.pst;
ResultSet res = pst.executeQuery();
while(res.next()){
String name = res.getString(1);
String type = res.getString(2);
result.put(name, type);
}
}catch(Exception e){
e.printStackTrace();
}
return result;
}
public List<String> getPrimaryKey(String tableName){
List<String> list = new ArrayList<String>();
try{
DatabaseMetaData dmd = conn.getMetaData();
ResultSet result = dmd.getPrimaryKeys("", "", tableName);
while(result.next()){
list.add(result.getString(4));
}
}catch(Exception e){
e.printStackTrace();
}
return list;
}
public void close(){
try {
this.conn.close();
this.pst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void setUrl(String url) {
this.url = url==null||"".equals(url)?DEFAULT_URL:url;
} public void setName(String name) {
this.name = name==null||"".equals(name)?DEFAULT_NAME:name;
} public void setUser(String user) {
this.user = user==null||"".equals(user)?DEFAULT_USER:user;
} public void setPass(String pass) {
this.pass = pass==null||"".equals(pass)?DEFAULT_PASS:pass;
} }

配置文件 vgenerator.properties

targetPackage=cc.vvxtoys.pojo
targetProject=src/main/java
objectName=Record
tableName=record
targetMapper=cc.vvxtoys.mapper
targetXML=cc.vvxtoys.mapper user=root
url=jdbc\:mysql\://127.0.0.1\:3306/test?useUnicode\=true&characterEncoding\=utf8
name=com.mysql.jdbc.Driver
pass=root

基本的流程

  • 初始化配置
  • 初始化db
  • 读取对应表的列
  • 把列单位转换为java单位
  • 开始构建

转换单位

/**
*author vvxtoys
*这个类是我用一个笨方法得到的,创建了一个所有类型的表,然后用mybatis-generator构建出来
*/
package cc.vvxtoys.bean; public enum DBtype { Date(",date,datetime,timestamp,year,time,"),
String(",longtext,text,varchar,enum,char,mediumtext,tinytext,set,"),
Double(",double,"),
Integer(",int,mediumint,"),
Short(",smallint,"),
Byte(",tinyint,"),
ByteArray(",tinyblob,mediumblob,binary,blob,longblob,varbinary,geometry,"),
Object(",point,multipoint,multilinestring,multipolygon,polygon,geometrycollection,linestring,"),
Long(",bigint,decimal,"),
Boolean(",bit,"),
Float(",float,"); private final String type; private DBtype(String type) {
this.type = type;
} public String getType() {
return type;
} public static String getModelType(String dbtype){
if(dbtype.indexOf("(")!=-1){
dbtype = dbtype.substring(0,dbtype.indexOf("("));
}
dbtype = ","+dbtype+",";
for(DBtype db:DBtype.values()){
if(db.getType().indexOf(dbtype)!=-1){
String model = db.name();
if(model.equals("ByteArray")){
model = "byte[]";
}
return model;
}
}
return "String";
}
}

创建classFactory

/**
*@author vvxtoys
*该类实现拼接java
*生成属性、方法、构造,放进context
*/
package cc.vvxtoys.factory; import java.util.ArrayList;
import java.util.List; import cc.vvxtoys.bean.ClassBean;
import cc.vvxtoys.utils.Common;
import cc.vvxtoys.utils.Vconst;
import cc.vvxtoys.vgenerator.VgeneratorWrite; public class ClassFactory { private ClassBean bean; public List<String> attrs;
public List<String> types; public ClassFactory(ClassBean bean) {
this.bean = bean;
attrs = new ArrayList<String>();
types = new ArrayList<String>();
} public void addAttribute(String declare,String type,String name){
StringBuffer buff = new StringBuffer();
buff.append(Vconst.TAB);
buff.append(declare);
buff.append(Vconst.SPACE);
buff.append(type);
buff.append(Vconst.SPACE);
buff.append(name);
buff.append(Vconst.END);
buff.append(Vconst.LINE); bean.setAttributes(bean.getAttributes()+buff.toString()); attrs.add(name);
types.add(type);
} public void addAttribute(String type,String name){
addAttribute("private", type, name);
} public void addAttributes(String declare,String [] type,String [] name){
if(type.length!=name.length){
throw new IllegalArgumentException("Attribute not available");
}
for(int i=0;i<type.length;i++){
addAttribute(declare, type[i], name[i]);
}
} public void addAttributes(String [] type,String [] name){
if(type.length!=name.length){
throw new IllegalArgumentException("Attribute not available");
}
for(int i=0;i<type.length;i++){
addAttribute(type[i], name[i]);
}
} public void addGetMethod(String type,String name){
StringBuffer buffer = new StringBuffer();
buffer.append(Vconst.TAB);
buffer.append("public").append(Vconst.SPACE);
buffer.append(type).append(Vconst.SPACE);
buffer.append("get");
buffer.append(Common.upInitials(name)).append(Vconst.SPACE);
buffer.append("(");
buffer.append(")").append(Vconst.SPACE);
buffer.append("{").append(Vconst.LINE).append(Vconst.TTAB);
buffer.append("return").append(Vconst.SPACE);
buffer.append(name);
buffer.append(Vconst.END);
buffer.append(Vconst.LINE).append(Vconst.TAB);
buffer.append("}").append(Vconst.LINE); bean.setMethods(bean.getMethods()+buffer.toString());
} public void addSetMethod(String type,String name){
StringBuffer buffer = new StringBuffer();
buffer.append(Vconst.TAB);
buffer.append("public").append(Vconst.SPACE);
buffer.append("void").append(Vconst.SPACE);
buffer.append("set");
buffer.append(Common.upInitials(name)).append(Vconst.SPACE);
buffer.append("(");
buffer.append(type).append(Vconst.SPACE);
buffer.append(name);
buffer.append(")").append(Vconst.SPACE);
buffer.append("{").append(Vconst.LINE).append(Vconst.TTAB);
buffer.append("this.").append(name).append(Vconst.SPACE);
buffer.append("=").append(Vconst.SPACE).append(name);
buffer.append(Vconst.END);
buffer.append(Vconst.LINE).append(Vconst.TAB);
buffer.append("}").append(Vconst.LINE); bean.setMethods(bean.getMethods()+buffer.toString());
} public void addMethod(String type,String name){
addGetMethod(type, name);
addSetMethod(type, name);
}
public void autoAddMethod(){
for(int i=0;i<attrs.size();i++){
addMethod(types.get(i),attrs.get(i));
}
}
public void addConstructor(){
StringBuffer buffer = new StringBuffer();
buffer.append(Vconst.TAB);
buffer.append("public").append(Vconst.SPACE);
buffer.append(bean.getClazz()).append(Vconst.SPACE);
buffer.append("()").append(Vconst.SPACE);
buffer.append("{").append(Vconst.LINE).append(Vconst.TTAB);
buffer.append("super();").append(Vconst.LINE).append(Vconst.TAB);
buffer.append("}").append(Vconst.LINE); buffer.append(Vconst.TAB);
buffer.append("public").append(Vconst.SPACE);
buffer.append(bean.getClazz()).append(Vconst.SPACE);
buffer.append("(");
for(int i=0;i<attrs.size();i++){
if(i>0){
buffer.append(",");
}
buffer.append(types.get(i)).append(Vconst.SPACE).append(attrs.get(i));
}
buffer.append(")").append(Vconst.SPACE);
buffer.append("{").append(Vconst.LINE).append(Vconst.TTAB);
buffer.append("super();").append(Vconst.LINE);
for(int j=0;j<attrs.size();j++){
buffer.append(Vconst.TTAB);
buffer.append("this.").append(attrs.get(j));
buffer.append(Vconst.SPACE).append("=").append(Vconst.SPACE);
buffer.append(attrs.get(j)).append(Vconst.END).append(Vconst.LINE);
}
buffer.append(Vconst.TAB);
buffer.append("}").append(Vconst.LINE); bean.setConstructors(bean.getConstructors()+buffer.toString());
} public void loadClass(String declare){
StringBuffer buff = new StringBuffer();
buff.append("package").append(Vconst.SPACE);
buff.append(bean.getPackages()).append(Vconst.END);
buff.append(Vconst.LINE).append(Vconst.LINE);
if(bean.isDependency()){
buff.append("import").append(Vconst.SPACE);
buff.append("java.util.Date").append(Vconst.END);
buff.append(Vconst.LINE).append(Vconst.LINE);
}
buff.append(declare).append(Vconst.SPACE);
buff.append("class").append(Vconst.SPACE);
buff.append(bean.getClazz()).append(Vconst.SPACE);
buff.append("{").append(Vconst.LINE).append(Vconst.LINE);
buff.append(bean.getAttributes());
buff.append(Vconst.LINE).append(Vconst.LINE);
buff.append(bean.getConstructors());
buff.append(Vconst.LINE).append(Vconst.LINE);
buff.append(bean.getMethods());
buff.append(Vconst.LINE).append(Vconst.LINE);
buff.append("}"); bean.setContext(buff.toString()); VgeneratorWrite.clazzs.add(bean);
}
public void loadClass(){
loadClass("public");
}
}

生成Mapper

/**
*@author vvxtoys
*根据主键来生成相对的方法
*没有主键只会生成insert方法
*/
package cc.vvxtoys.factory; import java.util.ArrayList;
import java.util.List; import cc.vvxtoys.bean.MapperBean;
import cc.vvxtoys.utils.Vconst;
import cc.vvxtoys.vgenerator.VgeneratorWrite; public class MapperFactory { private MapperBean bean; public static List<String> knames;//主键
public static List<String> ktypes;//主键类型 public MapperFactory(MapperBean bean) {
this.bean = bean;
knames = new ArrayList<String>();
ktypes = new ArrayList<String>();
} private String addKeyMethod(String method,String type) {
StringBuffer buffer = new StringBuffer();
buffer.append(Vconst.TAB);
buffer.append(type).append(Vconst.SPACE);
buffer.append(method).append("(");
for (int i = 0; i < knames.size(); i++) {
if (i > 0) {
buffer.append(",");
}
buffer.append(ktypes.get(i)).append(Vconst.SPACE).append(knames.get(i));
}
buffer.append(")").append(Vconst.END).append(Vconst.SPLIT);
return buffer.toString();
} private String addMethod(String method) {
StringBuffer buffer = new StringBuffer();
buffer.append(Vconst.TAB);
buffer.append("int").append(Vconst.SPACE);
buffer.append(method).append("(");
buffer.append(bean.getClazz()).append(Vconst.SPACE).append("record");
buffer.append(")").append(Vconst.END).append(Vconst.SPLIT); return buffer.toString();
} private String addInsertMethod() {
return addMethod("insert");
} private String addInsertSelectiveMethod() {
return addMethod("insertSelective");
} private String addUpdateMethod() {
return addMethod("updateByPrimaryKeySelective");
} private String addUpdateSelectiveMethod() {
return addMethod("updateByPrimaryKey");
} public String addSelectMethod() {
return addKeyMethod("selectByPrimaryKey",bean.getClazz());
} private String addDeleteMethod() {
return addKeyMethod("deleteByPrimaryKey","int");
} public void loadMapper() {
StringBuffer buff = new StringBuffer();
buff.append("package").append(Vconst.SPACE);
buff.append(bean.getPackages()).append(Vconst.END);
buff.append(Vconst.SPLIT);
buff.append("import").append(Vconst.SPACE);
buff.append(bean.getPojo()).append(Vconst.END);
buff.append(Vconst.SPLIT);
buff.append("public").append(Vconst.SPACE);
buff.append("interface").append(Vconst.SPACE);
buff.append(bean.getClazz()).append("Mapper").append(Vconst.SPACE);
buff.append("{").append(Vconst.LINE);
if (bean.isPrimary()) {
buff.append(addDeleteMethod());
buff.append(addUpdateMethod());
buff.append(addUpdateSelectiveMethod());
buff.append(addSelectMethod());
}
buff.append(addInsertMethod());
buff.append(addInsertSelectiveMethod());
buff.append("}"); bean.setContext(buff.toString());
VgeneratorWrite.mappers.add(bean);//保存到写入类
}
}

xml工厂类

/**
*@author vvxtoys
*
*/
package cc.vvxtoys.factory; import cc.vvxtoys.bean.XMLBean;
import cc.vvxtoys.utils.Vconst;
import cc.vvxtoys.vgenerator.SqlGenerator;
import cc.vvxtoys.vgenerator.VgeneratorWrite; public class XMLFactory { private double version = 1.0;
private String encoding = "UTF-8";
private boolean headDeclare = true; //xml声明
private String docStart(){
StringBuffer buff = new StringBuffer();
buff.append("<?xml version=\"");
buff.append(version);
buff.append("\" encoding=\""+encoding+"\"");
buff.append(" ?>").append(Vconst.LINE);
return buff.toString();
}
public String addDoctype(String name, String publicId, String systemId){
Vconst.ROOTELEMENT[0] = name;//设置根节点
publicId = "\""+publicId+"\"";
systemId = "\""+systemId+"\"";
StringBuffer buffer = new StringBuffer(headDeclare?docStart():"");
buffer.append("<!DOCTYPE").append(Vconst.SPACE);
buffer.append(name).append(Vconst.SPACE);
buffer.append("PUBLIC ").append(publicId).append(Vconst.SPACE);
buffer.append(systemId).append(" >");
buffer.append(Vconst.LINE);
return buffer.toString();
} public void createDoc(XMLBean bean,int k_size,int c_size){
bean.init();
String doctype = addDoctype(Vconst.DEFAULT_XML_ROOT, Vconst.DEFAULT_XML_PUBLICID, Vconst.DEFAULT_XML_SYSTEMID);
bean.addAttribute("namespace", bean.getMapper());
bean.setContext(doctype+bean.getContext());
SqlGenerator sql = new SqlGenerator(bean);//生成sql
sql.setK_size(k_size);
sql.setC_size(c_size);
sql.generatorSql();
VgeneratorWrite.xmls.add(bean);//保存xml文本
}
public void setVersion(Double version) {
this.version = version;
}
public void setEncoding(String encoding) {
this.encoding = encoding;
} public void setHeadDeclare(boolean headDeclare) {
this.headDeclare = headDeclare;
}
}

逆向工程vgenerator(二)的更多相关文章

  1. 逆向工程vgenerator(三)

    前言 该项目的最后一篇博文,最终构建,写入文件,整体项目流程将在本片文章中写出. jdbcType /** *@author vvxtoys *mysql单位 -> jdbcType */ pa ...

  2. 逆向工程vgenerator(一)

    前言 想要自己实现一个mybatis-generator类似的轮子,目前只实现MySQL部分的方法.利用下班时间,写了一个小项目,实现了这个功能.我准备分成三篇博客来写这个东西. 基类 /** *基类 ...

  3. 小程序开发之后台mybatis逆向工程(二)

    上一节搭建好了SSM后台框架,这一节将根据表结构创建实体及映射文件以及mapper接口.如果表过多,会很麻烦,所以mybatis提供了逆向工程来解决这个问题. 上一节 SSM搭建后台管理系统 逆向工程 ...

  4. MyBatis逆向工程的使用(非插件方式)

    一.概述 MyBatis是目前流行的优秀持久层框架,其逆向工程更是大大缩减了开发时间.所谓逆向工程,指的是mybatis根据数据库设计好的表,自动生成对应model.mapper及mapper.xml ...

  5. Android混淆打包

    一.理论知识   ProGuard是一款免费的Java类文件压缩器.优化器和混淆器.它能发现并删除无用类.字段(field).方法和属性值(attribute).它也能优化字节码并删除无用的指令.最后 ...

  6. ssm之mapper异常 Result Maps collection already contains value for com.ssj.mapper.UserMapper 和 Type interface com.ssj.mapper.UserMapper is already known to the MapperRegistry.

    异常一:Result Maps collection already contains value for com.ssj.mapper.XXXMapper 原因分析:XXXmapper.xml文件中 ...

  7. PowerDesigner建模应用(二)逆向工程,导出PDM文件前过滤元数据(表、视图、存储过程等)

    在上一篇文章<PowerDesigner建模应用(一)逆向工程,配置数据源并导出PDM文件>步骤二中导出了目标数据库对应的PDM文件, 该文件中展示出了所有表的信息与关系. 某些业务场景下 ...

  8. SpringBoot+Mybatis+Generator 逆向工程使用(二)

    Mybatis-Genarator 逆向工程使用 个人开发环境 java环境:Jdk1.8.0_60 编译器:IntelliJ IDEA 2017.1.4 mysql驱动:mysql-connecto ...

  9. mybatis学习(十二)——mybatis逆向工程

    MyBatis Generator (MBG)是一个mabatis的代码生成器,能够根据表自动生成mapper接口,mapper.xml文件,javaBean文件. 1.MBG的下载 打开https: ...

随机推荐

  1. 关于layui中tablle 渲染数据后 sort排序问题

    最近在使用easyweb框架做后台管理,案例可见https://gitee.com/whvse/EasyWeb. 其中遇到了 sort排序问题, html代码:<table class=&quo ...

  2. Python入门 (二)

    本文是个人python学习笔记,学习资料为廖雪峰python教程,如需更多内容,请移步廖老师官方网站. 一 函数式编程Functional Programming 函数式编程允许把函数本身作为参数传入 ...

  3. 爬虫基础之urllib库

    urllib库的基本使用 urlopen() # 导入urllib库 import urllib # 往指定url发送请求,返回一个响应对象 response = urllib.request.url ...

  4. linux 下 mysql 常用命令

    linux 下 mysql 常用命令   阅读目录 ====================== 1.开启和关闭 1.1.开启 1.2.关闭 1.3.重启 2.登录 2.1.密码明文 2.2.密码密文 ...

  5. 【开发】iOS入门 - Touch事件处理学习笔记

    网上介绍iOS事件机制的文章,有不少都讲得很好,搬运一次意义不大,这里我就列一些要点吧. 跟Android一样,iOS的Touch事件也是从外到内传递,然后从内到外响应,可以看成一个U型结构.然而,个 ...

  6. mac下 部分服务启动,结束, 查看状态的命令

    以sshd服务为例 启动sshd服务:sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist 停止sshd服务:sudo laun ...

  7. Kali安装zmap简单介绍

    zmap是一个非常方便的扫描器,跟nmap和masscan一样,不过区别在于zmap他快,号称是一小时扫遍整个互联网.主要使用方式是TCP SYN scan.TCP connectscan.UDP s ...

  8. python2.7安装django1.8后提示django-admin.py命令不存在

    ln -s /usr/local/Python2.7/bin/django-admin.py /usr/local/bin/django-admin.py 将python命令目录下的django-ad ...

  9. Comedi的安装

    1.comedi的安装:(需要注意的是comedi和comedilib安装顺序随意)    1.comedi与大多数2.2,2.4和2.6Linux内核配合使用,不支持2.6-2.6.6的内核,对2. ...

  10. 《python for data analysis》第九章,数据聚合与分组运算

    # -*- coding:utf-8 -*-# <python for data analysis>第九章# 数据聚合与分组运算import pandas as pdimport nump ...