利用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和JDBC获取MySQL数据库中表的字段信息: ```java import java.sql.*; public class FieldInfoExtractor { public static void main(String[] args) { String url = ...
要实现这一功能,主要依靠`java.sql.ResultSetMetaData`类来获取元数据信息。通过执行SQL查询语句(如`SELECT * FROM table_name`),可以获取到结果集(`ResultSet`)。然后利用该结果集的`getMetaData()`方法得到...
综上所述,"自定义生产数据表字段说明文档"涉及到的知识点包括用户认证、数据库连接、数据库操作、元数据获取、文件生成、扩展性设计以及权限管理等多个方面。这些技术的掌握和应用,对于构建高效、安全的数据库管理...
本篇将深入探讨如何利用Java读取Excel文件内容,并自动根据这些内容在MySQL数据库中创建相应的表。 首先,我们需要了解Java中用于读取Excel文件的库。Apache POI是一个流行的选择,它提供了对Microsoft Office格式...
Java MySQL 学生信息管理系统是一种基于Java编程语言和MySQL数据库技术构建的应用,用于高效地管理和操作学生数据。在这个系统中,开发者使用Java的 JDBC(Java Database Connectivity)接口来与MySQL数据库建立连接...
- 在MySQL中,你可以创建一个带有`AUTO_INCREMENT`属性的表字段,这个字段会在每次插入新记录时自动增加。这可以作为序列的替代方案。例如,创建一个名为`sequence`的表,包含一个名为`id`的自增字段。 4. **存储...
本篇将围绕Java结合`RestltData`获取数据库、数据库表、表字段以及执行SQL等数据源操作的相关知识点进行深入探讨。 首先,`RestltData`这个名字可能是"Result Data"的缩写,它可能是一个用来封装查询结果的对象,...
例如,如果你有一个名为`users`的表,可能会生成一个`User`类,包含与表字段相对应的属性。 “自动生相应的实体类格式的表结构”可能是指反向工程(Reverse Engineering)的过程,通过工具分析数据库表结构,自动...
实体类通常包含对应于数据库表字段的属性,并且具有getter和setter方法,以及可能的构造函数和注解,如`@Entity`、`@Table`、`@Id`等,以定义表名和主键。 接下来,我们讨论如何自动生成这些实体类。这里提到的工具...
6. **“数据库说明.xls”**:这个文件可能是关于数据库结构和表字段的详细指南,包含列名、数据类型以及可能的约束和索引。这对于理解和维护数据库结构至关重要。 7. **“atm_java”**:这个文件可能是ATM模拟器的...
例如,假设有一个`User`表,我们可以创建一个`User`类,包含与表字段相对应的属性和getter/setter方法。这样,我们可以通过JDBC的`PreparedStatement`和`ResultSet`来实现对象与记录之间的转换。 ```java public ...
【Java+MyEclipse+Tomcat 配置MySQL及查询数据显示在JSP网页中】 本文将详细介绍如何在Java开发环境中,结合MyEclipse IDE和Tomcat服务器,配置MySQL数据库并实现查询结果显示在JSP网页中。这个过程对于任何Java ...
在Java编程中,Blob(Binary Large Object)是用于存储大量二进制数据的数据类型,常被用在数据库中保存图片、文件等非文本信息。本教程将深入探讨如何使用Java进行Blob字段的操作,以实现将图片或文件保存到数据库...
在实际应用中,你可以通过JOIN操作连接这些表,以获取完整的地址信息,例如查询某个城市的所有区县,或者根据行政区划代码查找对应的地区。此外,这种设计也方便扩展,如果需要添加更详细的行政级别,如街道、社区,...
用java把excel表的数据导入到数据库(可能有些类型还没考虑完全,抽空写的) 简单的思路 ... 二、读取excel文件的数据(注意:excel文件的数据表字段的顺序与该表的顺序一致,有空再做导出) 三、拼接sql
在Java编程中,当我们需要与Oracle数据库交互时,`java.sql.DatabaseMetaData`接口提供了一种方式来获取关于数据库的各种元数据信息。这篇文章将详细介绍如何利用`DatabaseMetaData`查询Oracle数据库的所有表。 ...
确保数据类型与数据库表字段匹配。 接着,我们需要使用MyBatis的SQL映射文件和Mapper接口,编写插入数据的SQL语句。在插入前,可能需要进行数据校验和预处理,例如去除空格、检查唯一性等。MyBatis允许我们动态构造...
这些类包含了与数据库表字段相对应的属性,并提供了getter和setter方法,便于数据的封装和解封。 7. **事务管理**: 仓库管理涉及到的数据库操作往往需要事务支持,以确保数据的一致性。例如,入库操作可能需要同时...
描述中的“NULL”没有提供额外的信息,但我们可以根据标题推测这个工具可能的工作流程:连接到MySQL数据库,查询表结构,然后根据表的字段信息自动生成对应的Java类,这些类包含了对应数据库表字段的属性和getter/...
4. POJO类生成:根据表字段自动生成对应的Java实体类,用于数据的封装和解封。 5. Mapper接口生成:创建与数据库交互的Mapper接口,接口方法对应于XML文件中的SQL语句。 6. 映射文件生成:生成MyBatis的Mapper XML...