前言

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

常量

/**
*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. 三大前端框架(react、vue、angular2+)父子组件通信总结

    公司业务需要,react.vue.angular都有接触[\无奈脸].虽然说可以拓展知识广度,但是在深度上很让人头疼.最近没事的时候回忆各框架父子组件通信,发现很模糊,于是乎稍微做了一下功课,记录于此 ...

  2. 慢慢啃css

    上个礼拜清明放假了,所有忘记更新了,但是每天的学习没有落下,嘿嘿嘿~ 可是这两天就很头疼了,因为发烧了,呜呜呜~昨天在床上睡了一天,四肢无力,头晕眼花,严重的发烧,想靠自己的免疫力扛过去,缺没有. 今 ...

  3. 第五章Bookstrap

    响应式原理: @media screen and (min-width:300px) and (max-width:500px) { /* CSS 代码 */ } #代表页面宽度大于300px和小雨5 ...

  4. py2x与py3x区别

    https://blog.csdn.net/samxx8/article/details/21535901

  5. 多个字符串有相同的hashcode(没见到大于8的时候转成红黑树)

    public static void main(String[] a){ byte[] b1 = {33 , 123 ,124}; byte[] b2 = {33 , 124 , 93}; byte[ ...

  6. MySQL Transaction--查看未提交事务执行的SQL

    未提交事务 长期未提交事务,指开启事务后,长时间未向MySQL发出SQL执行请求或事务处理(COMMIT/ROLLBACK)请求,在系统表`information_schema`.`INNODB_TR ...

  7. Hot Chocolate 一个.net 平台的graphql 框架

    在看昨天发布的新版技术雷达中,看到了一个.net 的graphql 框架Hot Chocolate 还是比较激动,尽管好久不搞 .net 了,但是这个框架还是值得看看的,后边学习下 参考资料 http ...

  8. 使用User Primary Email作为GUID的问题

    最近发现有人使用CRM的user primary email作为GUID, 并且做了plugin来控制user primary email. 这样做法是非常有问题而且会影响同名的再次注册的用户. 假如 ...

  9. Java泛型相关总结(下)

    约束与局限性 不能用基本类型实例化类型参数 不能像Pair<double>这样调用,只能Pair<Double>,原因是类型擦除 运行时类型查询只使用于原始类型 虚拟机中的对象 ...

  10. flutter Row 垂直或水平放置多个widget

    使用行(Row)水平排列widget,使用列(Column)垂直排列widget.在行或列中嵌套行或列实现复杂的布局.如下图所示: 此布局按行排列.该行包含两个子布局,左侧一列和右侧的图片 对于行(R ...