我觉得造轮子这件事情,是谁都可以做的。只不过做得好或者不好而已,用心了做得就要优雅一点。
之前用过java的代码生成器,什么pojodobodbo都能生成,于是我也来自己造一个轮子。
造轮子的事情是没必要做得,费神费心,还没人家做得好,那么我还是要做,就当是体验一把了,看看细节是怎么实现的。
前期准备:
- 一台装有python、mysql的机器和若干待生成的表。
- python版本:3.6.4
- python安装mysql模块:pip install pymysql。(python2安装:pip install mysql-python
- 目标语言:java
待生成表格:为了实现各种数据类型,我们定义一个包含多种数据类型的实体表t_model,数据结构如下。
drop table if exists t_model; create table t_model( f_id varchar(64) primary key not null, --varchar 主键 f_number int null, f_datetime datetime, f_double double )
目标格式:
package com.dyi.po; import java.util.Date; /** * 表t_model模型 * @author WYB * */ public class Model { private String id; private int number; private Date date; private double dble; public Model() { super(); } public Model(String id, int number, Date date, double dble) { super(); this.id = id; this.number = number; this.date = date; this.dble = dble; } /** * * @return */ public String getId() { return id; } public void setId(String id) { this.id = id; } /** * * @return */ public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } /** * * @return */ public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } /** * * @return */ public double getDble() { return dble; } public void setDble(double dble) { this.dble = dble; } }
开始编写脚本
第一步:查询表结构
sql = """ select column_name,data_type,character_maximum_length,column_key,column_comment from information_schema.`COLUMNS` where TABLE_NAME = "%s" """%tableName cursor.execute(sql) tableColumnList = cursor.fetchall()
第二步:分析列的类型
cursor.execute(sql) tableColumnList = cursor.fetchall() modelName = tableName modelName = modelName[modelName.find("_") + 1:] modelName = modelName[0].upper()+modelName[1:] fieldInfoList = [] for col in tableColumnList: colName = col[0] colType = col[1].lower() colLen = col[2] priKey = col[3] comment = col[4]
第三步:拆分字段名,处理细节,生成代码
import pymysql ##连接数据库 db = pymysql.connect("localhost","root","root","stagebo") cursor = db.cursor() def log(str): print(str) def getTableList(): log("开始查询所有数据表...") cursor.execute("show tables") tableList = cursor.fetchall() tList = [] for t in tableList: tList.append(t[0]) return tList def getTableInfo(tableName): log("开始获取表结构") sql = """ select column_name,data_type,character_maximum_length,column_key,column_comment from information_schema.`COLUMNS` where TABLE_NAME = "%s" """%tableName cursor.execute(sql) tableColumnList = cursor.fetchall() modelName = tableName modelName = modelName[modelName.find("_") + 1:] modelName = modelName[0].upper()+modelName[1:] fieldInfoList = [] for col in tableColumnList: colName = col[0] colType = col[1].lower() colLen = col[2] priKey = col[3] comment = col[4] #字段去掉“f_” colName = colName[colName.find("_")+1:] #colName = colName[0].upper()+colName[1:] #判断类型 type = "" if colType in ["varchar","nvarchar"]: type = "String" elif colType == "int": type = "int" elif colType in ["double","float"]: type = "double" pk = False if priKey == "PRI": pk = True fieldInfoList.append([colName,type,pk]) file = open("%s.java"%modelName, "w") code = """ package com.dyi.po; import java.util.*; /** * 表%s模型 * */ """ %tableName code += "public class %s {"%modelName for item in fieldInfoList: code += """ private %s %s; """%(item[1],item[0]) code +=""" /* * 空构造函数 */ public %s(){ super(); } """%modelName code += """ /** *全参数构造函数 */ public %s("""%modelName for item in fieldInfoList: code += "%s %s, "%(item[1],item[0]) code = code[:-1] code += """) { super();""" for item in fieldInfoList: code += """ this.%s = %s;"""%(item[0],item[0]) code += """ }""" for item in fieldInfoList: t = item[1] n = item[0] nu = n[0].upper()+n[1:] code += """ /** * * @return */ public %s get%s(){ return this.%s; } public void set%s(%s %s){ this.%s = %s; } """%(t,nu,n,nu,t,n,n,n) code += "}" file.write(code) file.flush() file.close() if __name__ == "__main__": #查询表 tableList = getTableList() #定义要导出的表 tableToScript = ["t_model"] #开始遍历 for tableName in tableToScript: if tableName not in tableList: continue print(tableName) getTableInfo(tableName)
结果展示
package com.dyi.po; import java.util.*; /** * 表t_model模型 * */ public class Model { private String id; private int number; private date; private double dble; /* * 空构造函数 */ public Model(){ super(); } /** *全参数构造函数 */ public Model(String id, int number, date, double dble,) { super(); this.id = id; this.number = number; this.date = date; this.dble = dble; } /** * * @return */ public String getId(){ return this.id; } public void setId(String id){ this.id = id; } /** * * @return */ public int getNumber(){ return this.number; } public void setNumber(int number){ this.number = number; } /** * * @return */ public getDate(){ return this.date; } public void setDate( date){ this.date = date; } /** * * @return */ public double getDble(){ return this.dble; } public void setDble(double dble){ this.dble = dble; } }
然后流程就通了,一通百通,别的就可以照旧了~~~
黑夜给了我黑色的眼睛,我却用它寻找光明