`

JAVA Mysql 获取表字段信息

 
阅读更多

 利用java反射技术完成数据库表和实体类的映射关系,会遇到一些很常见的问题,实体类中有的字段数据库没有,或者数据库有的字段,实体类没有等到...该如何解决呢?

大概思路如下:

建立表与对应实体类的一个缓存集合,缓存实体类中跟表有映射关系的字段,用到时直接查询即可,下面给出部分代码:

 

        //实体类中能与数据库对应起来的字段集合
	private static Map<String, Map<String, Field>> databaseFieldsMap = new ConcurrentHashMap<String, Map<String, Field>>();
	
	/***
	 * 缓存中的 数据库和实体类具有映射关系的field   用于反射查询 和实体对象的插入
	 * @param database 数据库名称
	 * @param cls 实体类class
	 * @return
	 */
	public static Map<String, Field> getTableFields(String database, Class<?> cls){
		String key = database + "_" + cls.getSimpleName();
		//当前类的对应字段信息
		Map<String, Field> tableFields = databaseFieldsMap.get(key);
		
		if(tableFields == null){
			synchronized (SQLParamHelper.class) {
				tableFields = databaseFieldsMap.get(key);
				if(tableFields != null){
					return tableFields;
				}
				
				Field[] fields = cls.getDeclaredFields();
				
				Map<String, String> columnMap = getColumnMap(database, cls);
				
				if(columnMap != null){
					List<Field> lists = new ArrayList<Field>();
					tableFields = new LinkedHashMap<String, Field>();
					for(Field f : fields){
						BeanField bf = f.getAnnotation(BeanField.class);
						if(bf != null && !bf.persistence()){
							continue;
						}
						if(Modifier.isStatic(f.getModifiers())){
							continue;
						}
						//数据库中是否有当前字段 不区分大小写
						if(columnMap.containsKey(f.getName().toLowerCase())){
							lists.add(f);
							tableFields.put(f.getName(), f);
						}
					}
					databaseFieldsMap.put(key, tableFields);
				}
			}
			
		}
		
		return tableFields;
	}

        /***
	 * 获取表中的列 转换为 hashMap保存
	 * @param database
	 * @param cls
	 * @return
	 */
        private static Map<String, String> getColumnMap(String database, Class<?> cls){
		//获取数据库连接
                Connection conn = Data.getConnection(database);
		
		Map<String, String> columnMap = new HashMap<String, String>();
		
		ResultSet colRet = null;
		try {
			String tableName = getTableName(cls);
			DatabaseMetaData metaData = conn.getMetaData();
			ResultSet rsResult = metaData.getTables(null, "%", tableName, new String[]{"TABLE"});
			if(rsResult!=null){
	 			if(metaData != null){
	 				colRet = metaData.getColumns(null,"%", tableName,"%"); 
		 			while(colRet.next()) { 
		 				String columnName = colRet.getString("COLUMN_NAME"); 
		 				String columnType = colRet.getString("TYPE_NAME"); 
//		 				int datasize = colRet.getInt("COLUMN_SIZE"); 
//		 				int digits = colRet.getInt("DECIMAL_DIGITS"); 
//		 				int nullable = colRet.getInt("NULLABLE"); 
//		 				System.out.println(columnName+" "+columnType+" "+datasize+" "+digits+" "+ nullable); 
		 				columnMap.put(columnName.toLowerCase(), columnType);
		 			}
	 			}
	 		}
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		} finally {
			if(colRet != null){
				try {
					colRet.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if(conn != null){
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		
		return columnMap;
	}


        public static String getTableName(Class<?> cls){
		String tableName = cls.getSimpleName();
		AnnoBean annoBean = cls.getDeclaredAnnotation(AnnoBean.class);
		if(annoBean != null && annoBean.tableName() != null){
			tableName = annoBean.tableName();
		}
		return tableName;
	}

 

分享到:
评论

相关推荐

    Java源码获取数据库中表的字段信息

    以下是一个简单的示例代码,演示如何使用Java和JDBC获取MySQL数据库中表的字段信息: ```java import java.sql.*; public class FieldInfoExtractor { public static void main(String[] args) { String url = ...

    java如何获得数据库表中各字段的字段名

    要实现这一功能,主要依靠`java.sql.ResultSetMetaData`类来获取元数据信息。通过执行SQL查询语句(如`SELECT * FROM table_name`),可以获取到结果集(`ResultSet`)。然后利用该结果集的`getMetaData()`方法得到...

    自定义生产数据表字段说明文档

    综上所述,"自定义生产数据表字段说明文档"涉及到的知识点包括用户认证、数据库连接、数据库操作、元数据获取、文件生成、扩展性设计以及权限管理等多个方面。这些技术的掌握和应用,对于构建高效、安全的数据库管理...

    java读取excl文件内容进行mysql自动创建表

    本篇将深入探讨如何利用Java读取Excel文件内容,并自动根据这些内容在MySQL数据库中创建相应的表。 首先,我们需要了解Java中用于读取Excel文件的库。Apache POI是一个流行的选择,它提供了对Microsoft Office格式...

    java mysql student

    Java MySQL 学生信息管理系统是一种基于Java编程语言和MySQL数据库技术构建的应用,用于高效地管理和操作学生数据。在这个系统中,开发者使用Java的 JDBC(Java Database Connectivity)接口来与MySQL数据库建立连接...

    java通过Mysql实现类似oracle序列功能序列.rar

    - 在MySQL中,你可以创建一个带有`AUTO_INCREMENT`属性的表字段,这个字段会在每次插入新记录时自动增加。这可以作为序列的替代方案。例如,创建一个名为`sequence`的表,包含一个名为`id`的自增字段。 4. **存储...

    Java+RestltData获取数据库、数据库表、表字段、执行sql等数据源操作源码

    本篇将围绕Java结合`RestltData`获取数据库、数据库表、表字段以及执行SQL等数据源操作的相关知识点进行深入探讨。 首先,`RestltData`这个名字可能是"Result Data"的缩写,它可能是一个用来封装查询结果的对象,...

    java连接Mysql驱动包

    例如,如果你有一个名为`users`的表,可能会生成一个`User`类,包含与表字段相对应的属性。 “自动生相应的实体类格式的表结构”可能是指反向工程(Reverse Engineering)的过程,通过工具分析数据库表结构,自动...

    MySQL表自动生成Java实体类

    实体类通常包含对应于数据库表字段的属性,并且具有getter和setter方法,以及可能的构造函数和注解,如`@Entity`、`@Table`、`@Id`等,以定义表名和主键。 接下来,我们讨论如何自动生成这些实体类。这里提到的工具...

    atm_java_mysql.rar_atm_java_mysql_java ATM 模拟_java mysql ATM_j

    6. **“数据库说明.xls”**:这个文件可能是关于数据库结构和表字段的详细指南,包含列名、数据类型以及可能的约束和索引。这对于理解和维护数据库结构至关重要。 7. **“atm_java”**:这个文件可能是ATM模拟器的...

    JAVA连接数据库封装(mysql)

    例如,假设有一个`User`表,我们可以创建一个`User`类,包含与表字段相对应的属性和getter/setter方法。这样,我们可以通过JDBC的`PreparedStatement`和`ResultSet`来实现对象与记录之间的转换。 ```java public ...

    Java+MyEclipse+Tomcat (三)配置MySQL及查询数据显示在JSP网页中_数据库_杨秀璋的专栏-CSDN博客

    【Java+MyEclipse+Tomcat 配置MySQL及查询数据显示在JSP网页中】 本文将详细介绍如何在Java开发环境中,结合MyEclipse IDE和Tomcat服务器,配置MySQL数据库并实现查询结果显示在JSP网页中。这个过程对于任何Java ...

    java,Blob字段操作,将图片或者文件保存到数据库中.zip

    在Java编程中,Blob(Binary Large Object)是用于存储大量二进制数据的数据类型,常被用在数据库中保存图片、文件等非文本信息。本教程将深入探讨如何使用Java进行Blob字段的操作,以实现将图片或文件保存到数据库...

    全国行政区域省市区代码 MySQL多表设计+数据

    在实际应用中,你可以通过JOIN操作连接这些表,以获取完整的地址信息,例如查询某个城市的所有区县,或者根据行政区划代码查找对应的地区。此外,这种设计也方便扩展,如果需要添加更详细的行政级别,如街道、社区,...

    java把excel表的数据导入到mysql数据库

    用java把excel表的数据导入到数据库(可能有些类型还没考虑完全,抽空写的) 简单的思路 ... 二、读取excel文件的数据(注意:excel文件的数据表字段的顺序与该表的顺序一致,有空再做导出) 三、拼接sql

    java 查询oracle数据库所有表DatabaseMetaData的用法(详解)

    在Java编程中,当我们需要与Oracle数据库交互时,`java.sql.DatabaseMetaData`接口提供了一种方式来获取关于数据库的各种元数据信息。这篇文章将详细介绍如何利用`DatabaseMetaData`查询Oracle数据库的所有表。 ...

    java与前端交互--实现excel上传添加mysql表数据Ssm

    确保数据类型与数据库表字段匹配。 接着,我们需要使用MyBatis的SQL映射文件和Mapper接口,编写插入数据的SQL语句。在插入前,可能需要进行数据校验和预处理,例如去除空格、检查唯一性等。MyBatis允许我们动态构造...

    javaSwing仓库管理系统+Mysql数据库 2022-5-30

    这些类包含了与数据库表字段相对应的属性,并提供了getter和setter方法,便于数据的封装和解封。 7. **事务管理**: 仓库管理涉及到的数据库操作往往需要事务支持,以确保数据的一致性。例如,入库操作可能需要同时...

    发一个读取MySQL库,自动生成Pojo的工具

    描述中的“NULL”没有提供额外的信息,但我们可以根据标题推测这个工具可能的工作流程:连接到MySQL数据库,查询表结构,然后根据表的字段信息自动生成对应的Java类,这些类包含了对应数据库表字段的属性和getter/...

    mysql mybatis生成工具

    4. POJO类生成:根据表字段自动生成对应的Java实体类,用于数据的封装和解封。 5. Mapper接口生成:创建与数据库交互的Mapper接口,接口方法对应于XML文件中的SQL语句。 6. 映射文件生成:生成MyBatis的Mapper XML...

Global site tag (gtag.js) - Google Analytics