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

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同