和真正mybatis generator的基于xml不同,笔者是建立在数据库已建好的基础上,分别进行Entity与Mapper的自动生成。
Entity包含所有的字段声明(private String username
等)以及所有的get
,set
方法。
Mapper仅包含@Mapper
下的接口的声明,以及一个insert
方法。其他select
以及update
可以根据业务需要自行修改少部分代码进行生成,有任何疑问可以楼下评论,笔者会尽快回复。
1. Entity
代码分为三个部分:
- 主功能类EntityGenerator
- 入口Generate
- 工具类SqlHelper
注释已经写的很清楚了,这里直接上代码:
1. EntityGenerator
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class EntityGenerator {
// 数据库连接
private String URL;
private String DBName;
private String NAME;
private String PASS;
private String authorName = "undestiny";// 作者名字
private String[] colnames; // 列名数组
private String[] colTypes; // 列名类型数组
private int[] colSizes; // 列名大小数组
private boolean f_util = false; // 是否需要导入包java.util.*
private boolean f_sql = false; // 是否需要导入包java.sql.*
private SqlHelper sqlHelper = null;
/*
* 构造函数
*/
public EntityGenerator(String url, String dbname, String username, String password) {
this.URL = url + "/" + dbname;
this.DBName = dbname;
this.NAME = username;
this.PASS = password;
sqlHelper = new SqlHelper(this.URL, this.NAME, this.PASS);
}
public void Generate() {
List<String> tableNames = sqlHelper.Get(
"SELECT * FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='" + DBName + "';", "TABLE_NAME");
Connection con = null;
try {
con = sqlHelper.getConnection();
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (String table : tableNames) {
Generate(table, con);
System.out.println("generated: "+table );
resetTableInfo();
}
try {
sqlHelper.closeConnection(con);
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void resetTableInfo(){
colnames = null;
colTypes=null;
colSizes=null;
f_util=false;
f_sql=false;
}
private String getPackageOutPath() {
return "com.entity." + DBName;
}
private void Generate(String tablename, Connection con) {
if (con == null) {
System.out.println("------------------Connection to database was not set up------------------");
return;
}
// 查要生成实体类的表
String sql = "SELECT * FROM " + tablename + " limit 0, 1;";
PreparedStatement pStemt = null;
try {
pStemt = con.prepareStatement(sql);
ResultSetMetaData rsmd = pStemt.getMetaData();
int size = rsmd.getColumnCount(); // 统计列
colnames = new String[size];
colTypes = new String[size];
colSizes = new int[size];
for (int i = 0; i < size; i++) {
colnames[i] = rsmd.getColumnName(i + 1).replace(" ", "");
colTypes[i] = rsmd.getColumnTypeName(i + 1);
if (colTypes[i].equalsIgnoreCase("datetime") || colTypes[i].equalsIgnoreCase("date")) {
f_util = true;
}
if (colTypes[i].equalsIgnoreCase("image") || colTypes[i].equalsIgnoreCase("text")
|| colTypes[i].equalsIgnoreCase("TIMESTAMP")) {
f_sql = true;
}
colSizes[i] = rsmd.getColumnDisplaySize(i + 1);
}
String content = parse(colnames, colTypes, colSizes, tablename);
try {
File directory = new File("");
File dir = new File(directory.getAbsolutePath() + "/src/" + this.getPackageOutPath().replace(".", "/"