mysql自动生成实体类_Panda ORM源码-数据库表自动生成Java实体类

2023-11-01 06:50

本文主要是介绍mysql自动生成实体类_Panda ORM源码-数据库表自动生成Java实体类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一,整体思路

1,首先明确目标,需要通过指定数据库名,自动生成该数据库中所有表对应的Java实体类。

2,数据库名及其他一些参数(跟数据库url、用户、密码、实体类保存路径)通过配置文件设定。

3,连接数据库后,通过数据库名获取该数据库中所有的表。对于MySQL来说,可以通过select table_name from information_schema.tables where table_schema='XXX',来获取XXX数据库中所有的表名。PS:对于information_schema数据库不了解的可以打开看下,information_schema.tables保存了运行在MySQL上表的信息。

4,通过Java代码读取表结构信息,生成对应的Java类字符串,将字符串写入文件。

二,参数设置

参数保存在src目录下config.properties文件下,通过Constants的static方法获取配置文件信息,具体代码如下:

config.properties代码如下,注意前五个参数为数据库连接需要的参数,table_schema表示数据库名,entity_package_name表示生成实体类的包名,两个path分别表示实体类文件及日志保存路径。

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://127.0.0.1:3306/bank_performance?useUnicode=true&characterEncoding=utf-8

user=root

password=Pass1234

table_schema=bank_performance

entity_package_name=panda.bank.entity

file_save_path=D\:\\Java\\AutoEntity\\

file_log_path=D\:\\Java\\AutoEntity\\

读取配置文件是通过Constants 中的static方法实现:

package panda.orm.util;

public class Constants {

//Property类代码在下面

public static Property CONFIG_PROPERTY;

public static String getFormatDateTime(){

SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

return formater.format(new Date());

}

public static String getLogFormatDateTime(){

SimpleDateFormat formater = new SimpleDateFormat("yyyyMMddhhmmss");

return formater.format(new Date());

}

static{

Properties fileProperties = new Properties();

InputStream inputStream = fileProperties.getClass().getResourceAsStream("/config.properties");

CONFIG_PROPERTY=new Property();

try{

fileProperties.load(inputStream);

CONFIG_PROPERTY.setDriver(fileProperties.getProperty("driver"));

CONFIG_PROPERTY.setUrl(fileProperties.getProperty("url"));

CONFIG_PROPERTY.setUser(fileProperties.getProperty("user"));

CONFIG_PROPERTY.setPassword(fileProperties.getProperty("password"));

CONFIG_PROPERTY.setTable_schema(fileProperties.getProperty("table_schema"));

CONFIG_PROPERTY.setFile_save_path(fileProperties.getProperty("file_save_path"));

CONFIG_PROPERTY.setFile_log_path(fileProperties.getProperty("file_log_path"));

CONFIG_PROPERTY.setEntity_package_name(fileProperties.getProperty("entity_package_name"));

}catch (IOException ex){

ex.printStackTrace();

}finally{

try {

inputStream.close();

} catch (IOException ex) {

ex.printStackTrace();

}

}

}

}

package panda.orm.util;

public class Property{

private String driver;

private String url;

private String user;

private String password;

private String table_schema;

private String file_save_path;

private String file_log_path;

private String entity_package_name;

//省略get set

三,EntityGenerater.generateClasses()方法直接生成数据库中所有表对应实体类,直接上代码看注释部分即可:

package panda.orm.util;

import java.io.File;

import java.io.FileOutputStream;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.util.Date;

import java.util.HashMap;

import java.util.HashSet;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

import panda.orm.database.MySQLHandler;

import panda.orm.exception.SqlExcuteException;

/**

* 由MySQL数据库自动生成Java实体类

* @author 猫哥

* @date 2017.3.23

*/

public class EntityGenerater {

//在配置完config.properties之后,直接调用EntityGenerater类的静态方法generateClasses即可生成对应Java实体类

public static void main(String[] args) {

EntityGenerater.generateClasses();

}

//generateClasses方法做了三件事

//1,构造方法获取需要的参数

//2,init方法生成数据库对应的表-类结构

//3,write方法负责将类结构转换为实体类代码字符串并写入文件

public static void generateClasses(){

EntityGenerater eg=new EntityGenerater(Constants.CONFIG_PROPERTY.getTable_schema(),

Constants.CONFIG_PROPERTY.getEntity_package_name(),Constants.CONFIG_PROPERTY.getFile_save_path());

eg.init();

eg.write();

System.out.println("Panda ORM generate success!");

}

//tables保存了数据库的结构,tables的key表示表名,key对应的结合表示该表的所有列名集合

private Map> tables=new HashMap>();

private String table_schema;

private String entity_package_name;

private String entity_save_path;

public EntityGenerater(String table_schema,String entity_package_name,String entity_save_path){

this.table_schema=table_schema;

this.entity_package_name=entity_package_name;

this.entity_save_path=entity_save_path;

}

public void init(){

MySQLHandler hand=new MySQLHandler();

ResultSet rs=null;

//数据库名

String table_schema =Constants.CONFIG_PROPERTY.getTable_schema();

//获取数据库下所有表的sql语句

String sql="select table_name from information_schema.tables where table_schema='"+table_schema+"'";

tables.clear();

try {

rs=hand.query(sql);

while(rs.next()){

String tableName=rs.getString("table_name");

//getColumns方法获取表对应的列

Set columns=getColumns(tableName);

//将表和对应列结合放入tables

tables.put(tableName, columns);

}

} catch (Exception ex) {

new SqlExcuteException(ex.getMessage(),this.getClass().getName(),"sql执行异常",sql);

}finally{

hand.sayGoodbye();

}

}

//获取表对应的列名集合

private Set getColumns(String tableName){

MySQLHandler hand=new MySQLHandler();

ResultSet rs=null;

String sql="select * from "+tableName;

Set columns=new HashSet();

try {

rs=hand.query(sql);

ResultSetMetaData meta=rs.getMetaData();

int count=meta.getColumnCount();

for(int i=0;i

columns.add(meta.getColumnName(i+1));

}

}catch (Exception ex) {

new SqlExcuteException(ex.getMessage(),this.getClass().getName(),"sql执行异常",sql);

}finally{

hand.sayGoodbye();

}

return columns;

}

//转换tables信息为实体类代码对应的字符串,并写入文件

public void write(){

Iterator iter = tables.entrySet().iterator();

while (iter.hasNext()) {

Map.Entry entry = (Map.Entry) iter.next();

String tableName = (String)entry.getKey();

Set columns = (Set)entry.getValue();

//核心方法,将表明和对应列信息转换为实体类代码

String entityString=getEntityString(tableName,columns);

//写文件

try{

String path=entity_save_path+turnFirstUp(tableName)+".java";

File file=new File(path);

if(!file.exists())

file.createNewFile();

FileOutputStream out=new FileOutputStream(file,true);

out.write(entityString.getBytes("utf-8"));

out.close();

}

catch(Exception ex){

ex.printStackTrace();

}

}

}

//核心方法,将表明和对应列信息转换为实体类代码

private String getEntityString(String tableName,Set columns){

StringBuilder sb=new StringBuilder();

//包名及类注释

sb.append("package "+entity_package_name+";\r\n");

sb.append("/**\r\n");

sb.append("* " + new Date() + "\r\n");

sb.append("* Panda ORM atuo generate: " + tableName + " \r\n");

sb.append("*/ \r\n");

//类定义

sb.append("public class " + turnFirstUp(tableName) + "{\r\n");

//属性

for(String colName:columns){

sb.append("\tprivate String "+colName+";\r\n");

}

//方法

for(String colName:columns){

sb.append("\tpublic String get"+turnFirstUp(colName)

+"(){\r\n");

sb.append("\t\treturn "+colName+";\r\n");

sb.append("\t}\r\n");

sb.append("\tpublic void set"+turnFirstUp(colName)

+ "(String "+colName+"){\r\n");

sb.append("\t\tthis."+colName+"="+colName+";\r\n");

sb.append("\t}\r\n");

}

sb.append("}");

return sb.toString();

}

//首字母大写

private String turnFirstUp(String str) {

char[] ch = str.toCharArray();

if(ch[0]>='a'&&ch[0]<='z'){

ch[0]=(char)(ch[0]-32);

}

return new String(ch);

}

}

四,测试,以马上要开始讲解的银行业绩系统数据库为例,表结构如下图(具体含义先不解释,只是演示由数据库生成实体代码):

AAffA0nNPuCLAAAAAElFTkSuQmCC

然后运行,注意配置文件就按开头说的配置的。

public static void main(String[] args) {

EntityGenerater.generateClasses();

}

运行后,控制台提示:Panda ORM generate success!,表示成功,根据配置文件在目录下发现:

AAffA0nNPuCLAAAAAElFTkSuQmCC

打开User.java,成功。

package panda.bank.entity;

/**

* Thu Mar 23 11:30:12 CST 2017

* Panda ORM atuo generate: user

*/

public class User{

private String user_name;

private String user_role;

private String user_job;

private String user_password;

private String user_id;

private String user_department;

public String getUser_name(){

return user_name;

}

public void setUser_name(String user_name){

this.user_name=user_name;

}

public String getUser_role(){

return user_role;

}

public void setUser_role(String user_role){

this.user_role=user_role;

}

public String getUser_job(){

return user_job;

}

public void setUser_job(String user_job){

this.user_job=user_job;

}

public String getUser_password(){

return user_password;

}

public void setUser_password(String user_password){

this.user_password=user_password;

}

public String getUser_id(){

return user_id;

}

public void setUser_id(String user_id){

this.user_id=user_id;

}

public String getUser_department(){

return user_department;

}

public void setUser_department(String user_department){

this.user_department=user_department;

}

}

五,补充说明

根据Panda ORM整体的设计,所有类属性都是String类型,其实可以根据表中的数据类型转换属性类型,此处不再加以演示。

有了实体类代码后,需要添加主键、外键注释,并需要将外键对应属性类型改为外键指向表实体类型,然后就可以直接利用Panda ORM生成常用的增、删、改、查方法。

增、删、改没有问题,查的话只提供了最基本的查数量、分页查、查全部、按主键查的功能。更加复杂的查询还是要写原生的sql代码,有点遗憾。但是想想MyBatis每个都要单独写sql和Hibernate复杂的配置,心里又好受了很多,哈哈。下篇演示通过注解实现ORM的思路和源码。

这篇关于mysql自动生成实体类_Panda ORM源码-数据库表自动生成Java实体类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/321236

相关文章

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

java如何解压zip压缩包

《java如何解压zip压缩包》:本文主要介绍java如何解压zip压缩包问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解压zip压缩包实例代码结果如下总结java解压zip压缩包坐在旁边的小伙伴问我怎么用 java 将服务器上的压缩文件解压出来,

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分