`
xinklabi
  • 浏览: 1571802 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

使用JDBC连接数据库得到表字段的注释,以及其他字段信息

 
阅读更多
import java.io.File;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import javax.swing.filechooser.FileSystemView;
 
public class getXMLConfig {
    private static final String driver="com.mysql.jdbc.Driver";
    private static final String pwd="root";
    private static final String user="root";
    private static final String url = "jdbc:mysql://localhost/test"
            + "?user=" + user + "&password=" + pwd
            + "&useUnicode=true&characterEncoding=UTF-8";
    private static Connection getConnection=null;
 
    public static void main(String[] args) {
        getConnection=getConnections();
        try {
            DatabaseMetaData dbmd=getConnection.getMetaData();
            ResultSet resultSet = dbmd.getTables(null, "%", "%", new String[] { "TABLE" });
            while (resultSet.next()) {
                String tableName=resultSet.getString("TABLE_NAME");
                //System.out.println(tableName);
                if(tableName.equals("user")){
                    //ResultSet rs =getConnection.getMetaData().getColumns(null, getXMLConfig.getSchema(),tableName.toUpperCase(), "%");//其他数据库不需要这个方法的,直接传null,这个是oracle和db2这么用
                    ResultSet rs = dbmd.getColumns(null, "%", tableName, "%");
                    System.out.println("表名:"+tableName+"\t\n表字段信息:");
                    while(rs.next()){
                        System.out.println(rs.getString("COLUMN_NAME")+"----"+rs.getString("REMARKS"));
                    }
                }
            }
            FileSystemView fsv=FileSystemView.getFileSystemView();
            String path=fsv.getHomeDirectory().toString();//获取当前用户桌面路径
            File directory = new File(path);
            if (directory.exists()) {
            } else {
                directory.createNewFile();
            }
            /*FileWriter fw = new FileWriter(directory+ "\\"+dbname+".xml");
            PrintWriter pw = new PrintWriter(fw);
            pw.println("x");
            pw.flush();
            pw.close();
            System.out.println("生成成功!");*/
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnections(){
        try {
            //Properties props =new Properties();
            //props.put("remarksReporting","true");
            Class.forName(driver);
            getConnection=DriverManager.getConnection(url);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return getConnection;
    }
     
     public static String getSchema() throws Exception {
            String schema;
            schema =getConnection.getMetaData().getUserName();
            if ((schema == null) || (schema.length() == 0)) {
                throw new Exception("ORACLE数据库模式不允许为空");
            }
            return schema.toUpperCase().toString();
 
    }
 
}
 

字段信息     

       字段在表里就是一个Column,关于ColumnJDBC里面有20多个参数来描述它,称为元数据,Metadata。包括:

1.                TABLE_CAT String => table catalog (may be null)

2.                TABLE_SCHEM String => table schema (may be null)

3.                TABLE_NAME String => table name

4.                COLUMN_NAME String => column name

5.                DATA_TYPE int => SQL type from java.sql.Types

6.                TYPE_NAME String => Data source dependent type name, for a UDT the type name is fully qualified

7.                COLUMN_SIZE int => column size.

8.                BUFFER_LENGTH is not used.

9.                DECIMAL_DIGITS int => the number of fractional digits. Null is returned for data types where DECIMAL_DIGITS is not applicable.

10.            NUM_PREC_RADIX int => Radix (typically either 10 or 2)

11.            NULLABLE int => is NULL allowed.

o                                            columnNoNulls - might not allow NULL values

o                                            columnNullable - definitely allows NULL values

o                                            columnNullableUnknown - nullability unknown

12.            REMARKS String => comment describing column (may be null)

13.            COLUMN_DEF String => default value for the column, which should be interpreted as a string when the value is enclosed in single quotes (may be null)

14.            ……

    通常关注的是COLUMN_NAMEDATA_TYPETYPE_NAME等。

getColumns()获取字段信息

       JDBC里有DatabaseMetadata接口,通过它可以拿到数据库的元数据,也就是数据库的相关描述信息。果然,getColumns()就可以拿到表所有的字段信息:

Connection conn = dbms.getConnection();

DatabaseMetaData dmd = conn.getMetaData();

ResultSet rs = dmd.getColumns( null, “%”, strTableName, “%”);

Whiel( rs.next() )

{

    String strFieldName = Rs.getString( 4 );

    String strFieldType = Rs.getString( 5 );

}

       这种方式的特点是不需要去访问表内数据,看上去也很简洁。在mysql, postgresql中都很顺利,但很可惜,在连Oracle(JDBC 10.2.0.4)的时候,rs.next()false了。查看Oracle JDBCdoc,这也是支持的该接口的,并没有任何特别的说明。那奇怪了。再在OracleJDBC的文档上看到该版本Bug列表

The following table lists the JDBC bugs addressed in this patch set:

5892966

No columns from getColumns() when includeSynonyms=true

原来这里有个特殊的,当includeSysonyms设为true, getColumns是没有返回的。这个OracleOracle就有点不太符合JDBC的标准了。Oracle文档有这一段话:

By default, the getColumns method does not retrieve information about the columns if a synonym is specified. To enable the retrieval of information if a synonym is specified, you must call the setIncludeSynonyms method on the connection as follows:

( (oracle.jdbc.driver.OracleConnection)conn ).setIncludeSynonyms(true)

This will cause all subsequent getColumns method call on the connection to include synonyms. This is similar to setRemarksReporting. Alternatively, you can set the includeSynonymsconnection property. This is similar to the remarksReporting connection property.

这段话基本上也是讲了这个问题。针对Oracle特别的设置这是项目所不允许的,怎么办?

 

ResultSetMetaData获取字段信息

除了直接查看数据库元数据,还可以通过访问表数据来获取记录集元数据。利用ResultMetaData来获取字段信息是比较好的方式,无论表内是否有数据都可返回字段信息,同时测试发现在实验数据库当中都是可行的。

       Connection conn = dbms.getConnection();

       DatabaseMetaData dmd = conn.getMetaData();

      

       Statement st = conn.createStatement();

       String sql = "SELECT * FROM "+table;

       ResultSet rs = st.executeQuery(sql);

       ResultSetMetaData rsmd = rs.getMetaData();

             

       forint i=1; i<=rsmd.getColumnCount(); i++ )

       {

           String field = rsmd.getColumnName(i);

           fields.add( field );

          

           String type = Integer.toString( rsmd.getColumnType(i) ); //5--DATA_TYPE int => SQL type from java.sql.Types

           SqlType sqlT = SqlMapper.mapId( type );

           type = sqlT.sName;

           fieldTypes.add( type );

       }

分享到:
评论

相关推荐

    oracle数据库表,字段信息导出为excel

    在数据库管理中,有时候我们需要将数据库的结构信息,如表名、字段类型、字段长度以及注释等导出到Excel文件中,以便于数据分析、文档记录或分享给团队成员。这个过程可以通过编程方式实现,例如使用Java的JDBC和...

    数据库表字段自定义

    本主题将深入探讨如何自定义数据库表字段,以及它的重要性、实现方式和最佳实践。 首先,我们要明白数据库表是数据组织的核心,而字段则是表的构成元素,它们决定了表能存储何种类型的数据。自定义字段意味着可以...

    修改mybatis-generator源码实现实体类字段上方加上数据库中填写的注释

    标题 "修改mybatis-generator源码实现实体类字段上方加上数据库中填写的注释" 描述了一种增强MyBatis Generator(MBG)功能的方法,目的是在生成的实体类字段上添加对应数据库字段的注释。这能提高代码的可读性和...

    mybatis-generator自动生成字段注释的maven项目,执行StartUp.java即可

    在这个项目中,重点是MBG能生成包含字段注释的Java模型类,这对于理解数据库表字段的含义非常有帮助。 在`pom.xml`文件中,会配置MBG插件的相关参数,包括数据库连接信息(如URL、用户名、密码)、目标生成目录、...

    DBVisualizer使用教程

    DBVisualizer使用教程一个完全基于JDBC的跨平台数据库管理工具,市面上常见的数据库它都可以连接.另外这个工具属于一款轻量化/平民化/简单化的产品,

    DbVisualizer

    它凭借其全面的JDBC兼容性,几乎可以与任何支持Java Database Connectivity (JDBC) 的数据库系统无缝对接,无论你使用的是Oracle、MySQL、PostgreSQL、SQL Server还是其他众多的数据库平台。 DbVisualizer的核心...

    mybatis-generator.zip

    在这个"mybatis-generator.zip"压缩包中,我们可以看到它主要针对Oracle数据库,并且能为生成的实体类添加基于表字段Comment的注释。 首先,让我们来了解一下MyBatis Generator的基本概念和工作原理。MyBatis ...

    自定义注释的mybatis-generator-core-1.3.6.jar

    在本例中,我们关注的是`mybatis-generator-core-1.3.6.jar`,这是一个包含自定义注释功能的版本,能够生成带有表字段注释的实体类。这在开发过程中极大地提高了效率,因为手动编写这些注释既耗时又容易出错。 ...

    mybatis逆向工程数据库实体生产工具

    这些生成的文件通常包含了数据库表字段与Java属性的对应关系,以及基本的CRUD操作对应的SQL语句。 使用MyBatis逆向工程步骤如下: 1. **配置环境**:首先确保已经安装并配置好Java环境,同时在项目中引入MyBatis的...

    javabean的数据库增删改查

    这个类通常包含与数据库表字段相对应的私有属性,以及这些属性的getter和setter方法。例如,如果我们有一个名为`User`的表,包含`id`、`name`和`email`字段,我们可以这样创建JavaBean: ```java public class ...

    实体类生成工具.rar

    - 自动映射:实体类生成工具能够连接到指定的数据库,读取表结构,并自动将表字段映射为实体类的属性。 - 自定义模板:用户可以设置自定义模板,调整生成的实体类样式,如注释、访问修饰符、序列化特性等。 - ...

    mybatis 自动生成插件

    这意味着,如果你在数据库表字段上添加了注释,这些注释会在生成的实体类中作为字段的 javadoc 出现,这对于代码的可读性和文档性非常有帮助。 在实际应用中,MBG 通常结合 Maven 或者 Gradle 进行集成,通过执行...

    mybatis-generator-core

    3. **实体类生成**:基于数据库表信息,生成对应的Java实体类,实体类的属性与数据库表字段一一对应,并且会包含字段的注释,方便理解字段含义。 4. **Mapper接口及XML文件**:自动生成Mapper接口,用于数据库操作...

    北大青鸟s2jsp考试题

    在这里,你需要创建一个名为`UserInfo`的实体类,该类应包含与数据库表字段相对应的属性,并提供getter和setter方法。 4. **数据库设计**: 首先要在Sql Server中创建一个名为`BookShop`的数据库,并建立一个数据表`...

    根据表结构生成JavaBean,史上最强最专业的表结构转JavaBean的工具(第9版)

    我们也想过很多办法解决这个问题,包括用MyEclipse连接数据库生成JavaBean,但多多少少还是会有一些不尽人意的地方,包括表和表字段的comment总是无法生成,而且还会生成很多无用的注释代码,让代码看起来一点都不...

    mybatis generator 1.3.3

    2. **生成Java实体类**:MBG可以根据数据库表字段生成对应的Java实体类,这些类通常包含了getter和setter方法,方便在业务逻辑中使用。 3. **生成DAO接口和实现**:MBG可以生成基于MyBatis的DAO接口及其实现,这样...

    MyBatis_Generator_Tool

    使用此工具时,开发者需要配置一个`generator.xml`文件,来指定数据库连接信息、需要生成代码的表以及生成代码的目标位置和样式。`generator.xml`配置文件是MBG工作的心脏,它定义了如何与数据库交互以及生成哪些...

    mybatis快捷生成

    1. **实体类(Entity)**:基于数据库表字段生成的Java类,包含了对应字段的属性和getter/setter方法。 2. **Mapper接口(Mapper Interface)**:包含了一些数据库操作的方法声明,如增删改查。 3. **Mapper XML文件...

    mybatis-generator-core-1.3.2

    - **POJOs(Plain Old Java Objects)**:这些是与数据库表字段一一对应的 Java 类,包含了字段属性及 getter 和 setter 方法。 - **Mapper 接口**:这些接口定义了数据库操作,如查询、插入、更新和删除。每个...

    使用方法1

    - Model注释插件:将表字段的注释复制到模型类的字段上。 - Service和Controller层生成插件:自动生成业务逻辑和服务接口层代码。 8. **运行MyBatis Generator** - 完成以上步骤后,运行`mybatis-generator`项目...

Global site tag (gtag.js) - Google Analytics