Java数据库表自动转化为PO对象
本程序简单实现了数据库内省,生成PO对象。
数据库内省有如下两种实现方式:
- 通过mysql元表
- 通过desc table,show tables等命令
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class Generator {
class Table {
String name;
List<String> fieldList = new ArrayList<>();
List<String> typeList = new ArrayList<>();
}
final static String database = "valley";
final static String url = "jdbc:mysql://localhost:3306/" + database + "?serverTimezone=Asia/Shanghai";
final static String user = "root", password = "123";
final static String targetFolder = "src/main/java/valley/po";
final static String packageName="valley.po";
final static String tab = " ";
final static List<Table> tables = new ArrayList<>();
String convertType(String sqlType) {
if (sqlType.startsWith("varchar")) return "String";
if (sqlType.startsWith("bigint")) return "Long";
if (sqlType.startsWith("int")) return "Integer";
if (sqlType.startsWith("smallint")) return "Short";
if (sqlType.startsWith("tinyint")) return "Byte";
if(sqlType.startsWith("double"))return "Double";
return null;
}
String convertField(String field) {
return field;
}
//表名中只允许字母和下划线,并且下划线不能连续两道
String convertTableName(String name) {
StringBuilder builder = new StringBuilder();
if (name.charAt(0) != '_') builder.append(Character.toUpperCase(name.charAt(0)));
for (int i = 1; i < name.length(); i++) {
if (name.charAt(i) == '_') continue;
if (name.charAt(i - 1) == '_') {
builder.append(Character.toUpperCase(name.charAt(i)));
} else {
builder.append(name.charAt(i));
}
}
builder.append("Po");
return builder.toString();
}
String uppercaseFirstLetter(String s) {
return Character.toUpperCase(s.charAt(0)) + s.substring(1);
}
void writeTableToFile(Table table, PrintWriter writer) {
StringBuilder fields = new StringBuilder();
StringBuilder gettersAndSetters = new StringBuilder();
for (int i = 0; i < table.fieldList.size(); i++) {
String field = table.fieldList.get(i), type = table.typeList.get(i);
fields.append(String.format("\t%s %s;\n", type, field));
String uppercase = uppercaseFirstLetter(field);
gettersAndSetters.append(String.format("\t%s get%s(){\n\t\treturn %s;\n\t}\n", type, uppercase, field));
gettersAndSetters.append(String.format("\tvoid set%s(%s a%s){\n\t\t%s=a%s;\n\t}\n", uppercase, type, uppercase, field, uppercase));
}
String ans = String.format("package %s;\n\nclass %s{\n%s\n%s\n}",packageName, table.name, fields, gettersAndSetters);
ans = ans.replace("\t", tab);
writer.printf(ans);
writer.close();
}
void output() throws IOException {
Path folder = Paths.get(targetFolder);
if (Files.exists(folder) == false) {
Files.createDirectory(folder);
}
for (Table i : tables) {
Path file = folder.resolve(i.name + ".java");
writeTableToFile(i, new PrintWriter(Files.newBufferedWriter(file)));
}
}
void init() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(url, user, password);
Statement showTablesStatement = connection.createStatement();
ResultSet showTablesResultSet = showTablesStatement.executeQuery("show tables");
while (showTablesResultSet.next()) {
Table t = new Table();
t.name = convertTableName(showTablesResultSet.getString(1));
Statement descTableStatement = connection.createStatement();
ResultSet descTableResult = descTableStatement.executeQuery("desc " + showTablesResultSet.getString(1));
while (descTableResult.next()) {
t.fieldList.add(convertField(descTableResult.getString(1)));
t.typeList.add(convertType(descTableResult.getString(2)));
}
tables.add(t);
descTableResult.close();
descTableStatement.close();
}
showTablesResultSet.close();
showTablesStatement.close();
connection.close();
}
Generator() throws Exception {
init();
output();
}
public static void main(String[] args) throws Exception {
new Generator();
}
}
Java数据库表自动转化为PO对象的更多相关文章
- 通过数据库表自动生成POJO(JavaBean)对象
主类: package bqw.tool; import java.util.ResourceBundle;import java.sql.DriverManager;import java.sql. ...
- java中将jsonObject字符串转化为Map对象
java中将jsonObject字符串转化为Map对象 1.我们这里使用json-lib包进行转换,可在http://json-lib.sourceforge.net/下载依赖于下面的jar包: ja ...
- 吴裕雄--天生自然JAVA数据库编程:处理大数据对象
import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ; import j ...
- 第二篇 Springboot mybatis generate根据数据库表自动生成实体类、Mapper和Mapper.xml
源码链接:https://pan.baidu.com/s/1iP4UguBufHbcIEv4Ux4wDw 提取码:j6z9 目录结构如下:只需增加一个generatorConfig.xml文件和在po ...
- idea 根据数据库表自动创建持久化类
一.点击最右边的Database: 二.点击,再点DataSource选择数据库类型,配置数据库信息: 三.打开项目结构,选择,找到你的项目,点击,添加hibernate: 四.如果有现成的cfg.x ...
- 使用Myeclipse10.0自动生成搭建SSH框架(数据库表自动反向转换成Hibernate实体)实现用户登陆
我这里使用的数据库是mysql5.0 数据是上课用的.这些都不是重点,重要的是学会这个方法: 创建好数据库: create database jboadefault character set utf ...
- Activiti 数据库表自动生成策略
Activiti 引擎启动时默认会检测数据库版本与程序版本是否相符,不相符就会抛出异常停止引擎的初始化. 这一策略可以通过引擎的初始化配置参数databaseSchemaUpdate来控制, 如下图的 ...
- 根据数据库表自动生成实体类、xml和dao---mybatis
网盘链接: https://pan.baidu.com/s/1AVGz0bDa_Y5zjk7vXa2eHw 提取码: 2gr6 1.记事本打开generatorConfig.xml文件 2(1,2,3 ...
- 使用mybatis-generator-core-1.3.2.jar根据数据库表自动生成实体
1 导入mybatis-generator-core-1.3.2.jar 2配置mbg.xml <?xml version="1.0" encoding="UTF- ...
随机推荐
- Excel 批量快速合并相同的单元格:数据透视表、宏代码、分类汇总
Excel 批量快速合并相同的单元格 在制作Excel表格的时候,为了使得自己制作的报表更加简洁明了,方便查阅,经常需要合并很多相同的单元格,如果有几千几万条记录需要合并的话,真的会让人发疯.怎样 ...
- C语言变量的类型和存储位置
. C语言变量主要分为全局变量.静态全局变量.局部变量.静态局部变量和寄存器变量.其中静态变量用static关键字进行修饰.程序所占用的内存可以分为以下几个部分: ()代码段-存放程序代码,只读的,不 ...
- 高效的数据压缩编码方式 Protobuf
一. protocol buffers 是什么? Protocol buffers 是一种语言中立,平台无关,可扩展的序列化数据的格式,可用于通信协议,数据存储等. Protocol buffers ...
- 深度学习阅读列表 Deep Learning Reading List
Reading List List of reading lists and survey papers: Books Deep Learning, Yoshua Bengio, Ian Goodfe ...
- Ubuntu双系统安装
原文链接: http://www.jianshu.com/p/2eebd6ad284d 作者 Volcanoo 2016.01.31 00:07 字数 1737 阅读 141859评论 161喜欢 ...
- HorizontalScrollView的使用演示样例
MainActivity例如以下: package cc.cv; import android.os.Bundle; import android.view.LayoutInflater; impor ...
- CREATE DATABASE failed
由于环境需要, 故修改SQL Server 2012的默认的数据库的数据文件和日志文件的位置. 如下: 创建数据库, 遭遇报错. 错误信息: A file activation error occur ...
- Longest Common Prefix leetcode java
题目: Write a function to find the longest common prefix string amongst an array of strings. 题解: 解题思路是 ...
- Python 批量修改图片格式和尺寸
公司的一个项目要求把所有4096x4096的图片全部转化成2048x2048的图片,这种批量转换图片大小的软件网上很多,我的同事原来使用的美图看看的批量转换,但是稍微有点麻烦,每次还需要指定要转换的图 ...
- H面试(23):求子数组最大和
题目描述: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 例如输入的数组为1, -2 ...