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,关于Column在JDBC里面有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_NAME、DATA_TYPE、TYPE_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 JDBC的doc,这也是支持的该接口的,并没有任何特别的说明。那奇怪了。再在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();
for( int 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 );
}
相关推荐
此外,为了提高代码的健壮性和可维护性,推荐使用try-with-resources语句处理数据库资源,以及使用PreparedStatement代替Statement,防止SQL注入攻击。 在提供的压缩包文件中,"说明.txt"可能包含了更详细的步骤或...
标题 "修改mybatis-generator源码实现实体类字段上方加上数据库中填写的注释" 描述了一种增强MyBatis Generator(MBG)功能的方法,目的是在生成的实体类字段上添加对应数据库字段的注释。这能提高代码的可读性和...
在数据库管理中,有时候我们需要将数据库的结构信息,如表名、字段类型、字段长度以及注释等导出到Excel文件中,以便于数据分析、文档记录或分享给团队成员。这个过程可以通过编程方式实现,例如使用Java的JDBC和...
本主题将深入探讨如何自定义数据库表字段,以及它的重要性、实现方式和最佳实践。 首先,我们要明白数据库表是数据组织的核心,而字段则是表的构成元素,它们决定了表能存储何种类型的数据。自定义字段意味着可以...
在这个项目中,重点是MBG能生成包含字段注释的Java模型类,这对于理解数据库表字段的含义非常有帮助。 在`pom.xml`文件中,会配置MBG插件的相关参数,包括数据库连接信息(如URL、用户名、密码)、目标生成目录、...
解决MySQL连接时中文显示乱码的问题,关键在于确保数据库、连接参数以及应用程序内部各环节的字符集设置保持一致,并采用适合中文字符的编码方式,如UTF-8。通过上述步骤,可以有效避免中文乱码现象,保证数据的正确...
它凭借其全面的JDBC兼容性,几乎可以与任何支持Java Database Connectivity (JDBC) 的数据库系统无缝对接,无论你使用的是Oracle、MySQL、PostgreSQL、SQL Server还是其他众多的数据库平台。 DbVisualizer的核心...
DBVisualizer使用教程一个完全基于JDBC的跨平台数据库管理工具,市面上常见的数据库它都可以连接.另外这个工具属于一款轻量化/平民化/简单化的产品,
在这个"mybatis-generator.zip"压缩包中,我们可以看到它主要针对Oracle数据库,并且能为生成的实体类添加基于表字段Comment的注释。 首先,让我们来了解一下MyBatis Generator的基本概念和工作原理。MyBatis ...
在本例中,我们关注的是`mybatis-generator-core-1.3.6.jar`,这是一个包含自定义注释功能的版本,能够生成带有表字段注释的实体类。这在开发过程中极大地提高了效率,因为手动编写这些注释既耗时又容易出错。 ...
这些生成的文件通常包含了数据库表字段与Java属性的对应关系,以及基本的CRUD操作对应的SQL语句。 使用MyBatis逆向工程步骤如下: 1. **配置环境**:首先确保已经安装并配置好Java环境,同时在项目中引入MyBatis的...
这个类通常包含与数据库表字段相对应的私有属性,以及这些属性的getter和setter方法。例如,如果我们有一个名为`User`的表,包含`id`、`name`和`email`字段,我们可以这样创建JavaBean: ```java public class ...
- 自动映射:实体类生成工具能够连接到指定的数据库,读取表结构,并自动将表字段映射为实体类的属性。 - 自定义模板:用户可以设置自定义模板,调整生成的实体类样式,如注释、访问修饰符、序列化特性等。 - ...
这意味着,如果你在数据库表字段上添加了注释,这些注释会在生成的实体类中作为字段的 javadoc 出现,这对于代码的可读性和文档性非常有帮助。 在实际应用中,MBG 通常结合 Maven 或者 Gradle 进行集成,通过执行...
3. **实体类生成**:基于数据库表信息,生成对应的Java实体类,实体类的属性与数据库表字段一一对应,并且会包含字段的注释,方便理解字段含义。 4. **Mapper接口及XML文件**:自动生成Mapper接口,用于数据库操作...
在这里,你需要创建一个名为`UserInfo`的实体类,该类应包含与数据库表字段相对应的属性,并提供getter和setter方法。 4. **数据库设计**: 首先要在Sql Server中创建一个名为`BookShop`的数据库,并建立一个数据表`...
我们也想过很多办法解决这个问题,包括用MyEclipse连接数据库生成JavaBean,但多多少少还是会有一些不尽人意的地方,包括表和表字段的comment总是无法生成,而且还会生成很多无用的注释代码,让代码看起来一点都不...
2. **生成Java实体类**:MBG可以根据数据库表字段生成对应的Java实体类,这些类通常包含了getter和setter方法,方便在业务逻辑中使用。 3. **生成DAO接口和实现**:MBG可以生成基于MyBatis的DAO接口及其实现,这样...
使用此工具时,开发者需要配置一个`generator.xml`文件,来指定数据库连接信息、需要生成代码的表以及生成代码的目标位置和样式。`generator.xml`配置文件是MBG工作的心脏,它定义了如何与数据库交互以及生成哪些...
- JDBC连接数据库并执行查询 - 数据库关联查询,涉及Order Details、Products和Orders表 - 错误处理和用户反馈 **二、商品信息添加功能** 这个题目要求实现商品信息的添加功能,包含验证和展示列表: 1. 添加商品的...