热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

利用JAVA反射,读取数据库表名,自动生成对应实体类的操作

这篇文章主要介绍了利用JAVA反射,读取数据库表名,自动生成对应实体类的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

本代码是利用java反射,读取数据库表自动根据表名生成实体类,数据库采用老牌SQLSERVER 2000,驱动为JTDS,其他数据库可根据情况自定修改。

代码中包含了大部分数据库类型与JAVA类型的转换,少数未包含进去的会在生成代码时打印出来,方面后期查找修改。

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
/**
 * 从数据库表反射出实体类,自动生成实体类
 * 
 * @author Zero
 *
 */
public class SqlHelper {
	//基本数据配置
	private String packageOutPath = "com.xxx.entity.system";// 指定实体生成所在包的路径
	private String authorName = "Zero";// 作者名字
	private String tablename = "xxx";// 表名
	private String[] colnames; // 列名数组
	private String[] colTypes; // 列名类型数组
	private String version = "V0.01"; // 版本
	private int[] colSizes; // 列名大小数组
	private boolean f_util = false; // 是否需要导入包java.util.*
	private boolean f_sql = false; // 是否需要导入包java.sql.*
	private boolean f_lang = false; // 是否需要导入包java.sql.*
	private String defaultPath = "/src/main/java/";
	// 数据库连接
	private static final String URL = "jdbc:jtds:sqlserver://192.168.29.128:1433/xxx";
	private static final String NAME = "sa";
	private static final String PASS = "xxx";
	private static final String DRIVER = "net.sourceforge.jtds.jdbc.Driver";
 
	/*
	 * 构造函数
	 */
	public SqlHelper() {
		// 创建连接
		Connection con;
		// 查要生成实体类的表
		String sql = "select * from " + tablename;
		PreparedStatement pStemt = null;
		try {
			try {
				Class.forName(DRIVER);
			} catch (ClassNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			con = DriverManager.getConnection(URL, NAME, PASS);
			pStemt = con.prepareStatement(sql);
			ResultSetMetaData rsmd = pStemt.getMetaData();
			int size = rsmd.getColumnCount(); // 统计列
			colnames = new String[size];
			colTypes = new String[size];
			colSizes = new int[size];
			for (int i = 0; i = 'a' && ch[0] <= 'z') {
			ch[0] = (char) (ch[0] - 32);
		}
 
		return new String(ch);
	}
 
	/**
	 * 功能:获得列的数据类型
	 * 
	 * @param sqlType
	 * @return
	 */
	private String sqlType2JavaType(String sqlType) {
 
		if (sqlType.equalsIgnoreCase("bit")) {
			return "Boolean";
		} else if (sqlType.equalsIgnoreCase("decimal") || sqlType.equalsIgnoreCase("money")
				|| sqlType.equalsIgnoreCase("smallmoney") || sqlType.equalsIgnoreCase("numeric")
				|| sqlType.equalsIgnoreCase("bigint")) {
			return "Long";
		} else if (sqlType.equalsIgnoreCase("float")) {
			return "Double";
		} else if (sqlType.equalsIgnoreCase("int") || sqlType.equalsIgnoreCase("int identity")) {
			return "Integer";
		} else if (sqlType.equalsIgnoreCase("image") || sqlType.equalsIgnoreCase("varbinary(max)")
				|| sqlType.equalsIgnoreCase("varbinary") || sqlType.equalsIgnoreCase("udt")
				|| sqlType.equalsIgnoreCase("timestamp") || sqlType.equalsIgnoreCase("binary")) {
			return "Byte[]";
		} else if (sqlType.equalsIgnoreCase("nchar") || sqlType.equalsIgnoreCase("nvarchar(max)")
				|| sqlType.equalsIgnoreCase("nvarchar") || sqlType.equalsIgnoreCase("nvarchar(ntext)")
				|| sqlType.equalsIgnoreCase("uniqueidentifier") || sqlType.equalsIgnoreCase("xml")
				|| sqlType.equalsIgnoreCase("char") || sqlType.equalsIgnoreCase("varchar(max)")
				|| sqlType.equalsIgnoreCase("text") || sqlType.equalsIgnoreCase("varchar")) {
			return "String";
		} else if (sqlType.equalsIgnoreCase("real")) {
			return "Float";
		} else if (sqlType.equalsIgnoreCase("smallint") || sqlType.equalsIgnoreCase("tinyint")) {
			return "Short";
		} else if (sqlType.equalsIgnoreCase("date") || sqlType.equalsIgnoreCase("datetime")
				|| sqlType.equalsIgnoreCase("time") || sqlType.equalsIgnoreCase("datetime2")) {
			return "Date";
		} else {
			System.out.println("数据类型异常,类型为:" + sqlType);
		}
 
		return null;
	}
 
	/**
	 * 出口 TODO
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
 
		new SqlHelper();
 
	}
}

补充知识:java通过反射获取类名、属性名称以及@Table注解上的表名称

我就废话不多说了,大家还是直接看代码吧~

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
 
/**
 * @author caizw
 * @createDate 2018/2/8
 * @description 反射工具类
 */
public class ReflectUtils {
 
  /**
   * 获取实体类主键
   *
   * @param clazz
   * @return
   */
  public static Field getIdField(Class<&#63;> clazz) {
    Field[] fields = clazz.getDeclaredFields();
    Field item = null;
    for (Field field : fields) {
      Id id = field.getAnnotation(Id.class);
      if (id != null) {
        field.setAccessible(true);
        item = field;
        break;
      }
    }
    if (item == null) {
      Class<&#63;> superclass = clazz.getSuperclass();
      if (superclass != null) {
        item = getIdField(superclass);
      }
    }
    return item;
  }
 
  /**
   * 根据主键名称获取实体类主键属性值
   *
   * @param clazz
   * @param pkName
   * @return
   */
  public static Object getPkValueByName(Object clazz, String pkName) {
    try {
      String firstLetter = pkName.substring(0, 1).toUpperCase();
      String getter = "get" + firstLetter + pkName.substring(1);
      Method method = clazz.getClass().getMethod(getter, new Class[]{});
      Object value = method.invoke(clazz, new Object[]{});
      return value;
    } catch (Exception e) {
      return null;
    }
  }
 
  /**
   * 通过反射将 class1不为空的值赋值给class2
   *
   * @param class1
   * @param class2
   * @throws Exception
   */
  public static void reflectClass1ToClass2(Object class1, Object class2) throws Exception {
    Field[] field = class1.getClass().getDeclaredFields();
    for (int i = 0; i  getColumnName(Class<&#63;> clazz) {
    Map map = new ConcurrentHashMap<>();
    Field[] fields = clazz.getDeclaredFields();
    for (Field field : fields) {
      if (field.isAnnotationPresent(Column.class)) {
        /**
         * 获取字段名
         */
        Column declaredAnnotation = field.getDeclaredAnnotation(Column.class);
        String column = declaredAnnotation.name();
        map.put("fieldNames", field.getName());
        map.put("column", column);
        break;
      }
    }
    return map;
  }
 
  /**
   * 通过获取类上的@Table注解获取表名称
   *
   * @param clazz
   * @return
   */
  public static Map getTableName(Class<&#63;> clazz) {
    Map map = new ConcurrentHashMap<>();
    Table annotation = clazz.getAnnotation(Table.class);
    String name = annotation.name();
    String className = clazz.getSimpleName();
    map.put("tableName", name);
    map.put("className", className);
    return map;
  }
}

以上这篇利用JAVA反射,读取数据库表名,自动生成对应实体类的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • 在编写 PHP 类时,经常会遇到因类未正确实例化而导致的 'function non-object' 错误。本文将详细探讨 PHP 构造函数中的双下划线使用方法及其常见问题。 ... [详细]
  • Microsoft即将发布WPF/E的CTP(Community Technology Preview)和SDK,标志着RIA(Rich Internet Application)技术的新里程碑。更多详情及下载链接请参见MSDN官方页面。 ... [详细]
  • 本文详细介绍了如何使用 PHP 编程语言输出 99 乘法表,包括使用不同的循环结构如 do-while、for 循环等方法,并提供了具体的代码示例。 ... [详细]
  • 详解 | 日志系统ViseLog的基本使用与功能
    本文详细介绍了日志系统ViseLog的使用方法及其核心功能,旨在帮助开发者更好地理解和利用这一工具,提高开发效率。 ... [详细]
  • 本文探讨了使用Filter作为控制器的优势,以及Servlet与Filter之间的主要差异。同时,详细解析了Servlet的工作流程及其生命周期,以及ServletConfig与ServletContext的区别与应用场景。 ... [详细]
  • Java EE CDI:解决依赖关系冲突的实例
    在本教程中,我们将探讨如何在Java EE的CDI(上下文和依赖注入)框架中有效解决依赖关系的冲突问题。通过学习如何使用限定符,您将能够为应用程序的不同客户端提供多种接口实现,并确保每个客户端都能正确调用其所需的实现。 ... [详细]
  • Android中解析XML文件的实践指南
    本文详细介绍了在Android应用开发中解析XML文件的方法,包括从本地文件和网络资源获取XML文件的不同途径,以及使用DOM、SAX和PULL三种解析方式的具体实现。 ... [详细]
  • 深入理解Java MySQL数据库连接池实现
    尽管利用Apache Commons DBCP等工具可以轻松构建数据库连接池,但本文详细解析了数据库连接池的工作机制,提供了详尽的注释,帮助开发者深入理解其内部运作。这不仅有助于提高数据库操作的效率,还能增强应用程序的稳定性和性能。 ... [详细]
  • ServletContext接口在Java Web开发中扮演着重要角色,它提供了一种方式来获取关于整个Web应用程序的信息。通过ServletContext,开发者可以访问初始化参数、共享数据以及应用资源。 ... [详细]
  • Flowable 6.6.0 表单引擎在Web应用中的集成与使用
    本文档提供了Flowable 6.6.0版本中表单引擎在Web应用程序中的配置和使用指南,包括表单引擎的初始化、配置以及在Web环境下的具体实现方法。 ... [详细]
  • 本文提供了详细的步骤,指导如何在Ubuntu系统中配置ASOP源码的编译环境,特别强调了使用国内镜像加速下载过程的方法。若遇到文章加载问题或图片失效,建议访问原文链接获取最新信息。 ... [详细]
  • 本文探讨了在渗透测试中信息收集阶段使用的几种端口扫描技术,包括nmap、masscan、socket、telnet及nc等工具的应用与比较。 ... [详细]
  • 本文提供了详细的步骤,介绍如何将基于Maven的Java EE项目从Eclipse IDE部署到JBoss应用服务器上。适合初学者和中级开发者参考。 ... [详细]
  • 近期,谷歌公司的一名安全工程师Eduardo Vela在jQuery Mobile框架中发现了一项可能引发跨站脚本攻击(XSS)的安全漏洞。此漏洞使得使用jQuery Mobile的所有网站面临潜在的安全威胁。 ... [详细]
  • 本文详细介绍了 Java 中 freemarker.ext.dom.NodeModel 类的 removeComments 方法,并提供了多个实际使用的代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
author-avatar
shaonan
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有