Sqlite数据库实体代码自动生成

本文介绍了一种使用SQLite数据库结合Java JPA框架的方法,通过一个简单的代码生成器实现从SQLite表结构到Java实体类的自动转换。适用于小型项目和服务端数据库需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于嵌入式数据库,微型系统我们可以选择使用sqlite来存储数据,sqlite是一款轻量级关系型数据库。在移动开发当中,常用来存储应用的本地数据。如果用户规模不大,我认为完全可以用来作为服务端数据库。熟悉wordpress的朋友都知道,wp的博客都是存储在mysql当中的,一般针对个人博客这个场景,完全没有必要使用mysql,sqlite完成可以应对,并且数据文件迁移简单,备份容易。 既然选择用来作为服务端存储,考虑到自己比较偏好使用java的jpa来作为后端的持久层框架,所以就的面对如何将sqlite的表结构转化为实体类的问题。用手来写,感觉就是在做重复劳动,俗话说磨刀不误砍柴工,于是临时写了一个sqlite的实体代码生成器。

  1. 通过路径名查找sqlite数据库
  2. 根据参数添加生成代码的作者和日期
  3. 完成基本数据类型,日期类型的转换

在使用时,写一个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();
	}
}
复制代码

转载于:https://juejin.im/post/5afa9a8d6fb9a07ac4802ca5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值