对于嵌入式数据库,微型系统我们可以选择使用sqlite来存储数据,sqlite是一款轻量级关系型数据库。在移动开发当中,常用来存储应用的本地数据。如果用户规模不大,我认为完全可以用来作为服务端数据库。熟悉wordpress的朋友都知道,wp的博客都是存储在mysql当中的,一般针对个人博客这个场景,完全没有必要使用mysql,sqlite完成可以应对,并且数据文件迁移简单,备份容易。 既然选择用来作为服务端存储,考虑到自己比较偏好使用java的jpa来作为后端的持久层框架,所以就的面对如何将sqlite的表结构转化为实体类的问题。用手来写,感觉就是在做重复劳动,俗话说磨刀不误砍柴工,于是临时写了一个sqlite的实体代码生成器。
- 通过路径名查找sqlite数据库
- 根据参数添加生成代码的作者和日期
- 完成基本数据类型,日期类型的转换
在使用时,写一个java的main函数,传递响应的参数即可,实体代码生成器的全部代码如下:
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author liyc
* @date 2018年1月25日 下午4:26:22
* @description 实体代码生成
*/
public class CodeGenerator {
public static void generateSQLiteDomainCode(String codePath,String packageName,String user,String dbPath) throws ClassNotFoundException, SQLException, FileNotFoundException {
// 实体类生产的路径
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:" + dbPath);
DatabaseMetaData dbmd = conn.getMetaData();
String[] types = { "TABLE" };
ResultSet tabs = dbmd.getTables(null, null, null, types);
List<String> tableNameList = new ArrayList<String>();
while (tabs.next()) {
tableNameList.add(tabs.getObject("TABLE_NAME").toString());
}
tabs.close();
for (String tableName : tableNameList) {
// 查找主键列名
ResultSet pkRSet = dbmd.getPrimaryKeys(null, null, tableName);
String pkColumnName = "";
while (pkRSet.next()) {
pkColumnName = pkRSet.getString("COLUMN_NAME");
}
pkRSet.close();
String[] sp = tableName.split("_");
String className = "";
for (String s : sp) {
className += s.substring(0, 1).toUpperCase() + s.substring(1);
}
ResultSet colrs = dbmd.getColumns(null, "%", tableName, "%");
PrintWriter pw = new PrintWriter(codePath + "/" + className + ".java");
pw.write("package " + packageName + ";\n\n");
pw.write("import java.util.Date;\n");
pw.write("import javax.persistence.*;\n\n");
pw.write("/**\n");
pw.write(" * @author " + user + "\n");
pw.write(" * @date " + new Date().toString() + "\n");
pw.write(" * @description \n");
pw.write(" */\n");
pw.write("@Entity\n");
pw.write("@Table(name = \"" + tableName + "\", schema = \"main\", catalog = \"\")\n");
pw.write("public class " + className + " {");
while (colrs.next()) {
String columnName = colrs.getString("COLUMN_NAME");
String codeName = columnName.substring(0, 1).toUpperCase() + columnName.substring(1);
String codeNameVar = columnName.substring(0, 1).toLowerCase() + columnName.substring(1);
System.out.println(codeNameVar);
String codeType = "null";
String typeName = colrs.getString("TYPE_NAME");
if ("text".equals(typeName.toLowerCase())) {
codeType = "String";
} else if ("integer".equals(typeName.toLowerCase())) {
codeType = "Integer";
}
pw.write("\n");
pw.write("\t");
pw.write("private " + codeType + " " + codeNameVar + ";\n\n");
pw.write("\t");
if(columnName.toLowerCase().equals(pkColumnName.toLowerCase())) {
pw.write("@Id");
}
else {
pw.write("@Basic");
}
pw.write("\n");
pw.write("\t");
pw.write("@Column(name = \"" + columnName + "\")");
if("yes".equals(colrs.getString("IS_AUTOINCREMENT").toLowerCase())){
pw.write("\n\t@GeneratedValue(strategy = GenerationType.AUTO)");
}
pw.write("\n");
pw.write("\t");
pw.write("public " + codeType + " get" + codeName + "() {");
pw.write("\n");
pw.write("\t");
pw.write("\t");
pw.write("return " + codeNameVar + ";");
pw.write("\n");
pw.write("\t");
pw.write("}");
pw.write("\n\n");
pw.write("\t");
pw.write("public void set" + codeName + "(" + codeType + " " + codeNameVar + ") {");
pw.write("\n");
pw.write("\t");
pw.write("\t");
pw.write("this." + codeNameVar + " = " + codeNameVar + ";");
pw.write("\n");
pw.write("\t");
pw.write("}");
pw.write("\n");
}
pw.write("\n");
pw.write("}");
pw.flush();
pw.close();
colrs.close();
}
conn.close();
}
}
复制代码