天天看点

java创建表格_Java 创建表结构

Java 创建表结构

2014-07-05·WeaponX

8698 次浏览

## 技术要点

获取数据库和数据表元数据的技术要点如下:

* 通过create table表名(字段名字段类型长度)的sql形式创建表结构。

* ResultSetMetaData接口的作用是获取ResultSet对象中列的类型和属性信息。由于ResultSetMetaData是接口,所以没有构造方法,故不能使用new来创建ResultSetMetaData对象,但是可以通过ResultSet的getMetaData()方法创建,如ResultSetMetaData md=rs.getMetaData()。

* 调用ResultSetMetaData的getColumnCount()可以返回ResultSet对象中的列数。

* 调用ResultSetMetaData的getColumnName(int column)可以获取指定列的名称,其中column指的是列数。

* 调用ResultSetMetaData的getColumnTypeName(int column)返回检索指定列的数据库特定的类型名称,其中column指的是列数。

* 调用ResultSetMetaData的isNullable(int column)的作用是说明指定列中的值是否可以为null,其中column指的是列数。

## 代码实现

```java

package net.xsoftlab.baike;

import java.sql.Connection;

import java.sql.*;

import java.sql.DriverManager;

public class Structure {

// 在myuser数据库中创建了一个名字为staff的数据表。

public static void Create_Data(Connection con, String tableName) {

String sql = "create table if not exists " + tableName + "(id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,"// 主键

+ "name VARCHAR(50)NOT NULL UNIQUE,"// 姓名

+ "age INT(3)UNSIGNED NOT NULL,"// 年龄

+ "sex VARCHAR(3)NOT NULL,"// 性别

+ "address VARCHAR(50)NOT NULL,"// 居住地址

+ "depart VARCHAR(50)NOT NULL,"// 部门

+ "worklen VARCHAR(10)NOT NULL,"// 工龄

+ "wage VARCHAR(20)"// 工资

+ ")";

Statement sm = null;

try {

sm = con.createStatement();

sm.execute(sql);

} catch (SQLException e) {

e.printStackTrace();

} finally {

// 关闭Statement

if (sm != null) {

try {

sm.close();

} catch (SQLException e1) {

e1.printStackTrace();

}

}

}

}

// 显示数据表的元数据,主要是列的信息 con 与数据库的连接 tableName 数据表名

public static void Show_Data(Connection con, String tableName) {

String sql = "SELECT * FROM " + tableName;

Statement sm = null;

try {

sm = con.createStatement();

ResultSet rs = sm.executeQuery(sql);// 首先获得表的所有数据

ResultSetMetaData md = rs.getMetaData();// 得到结果集的元数据

System.out.println("数据表" + tableName + "的表结构如下:");

int columnCount = md.getColumnCount();// 表的列数

System.out.println();

StringBuffer sbf = new StringBuffer("");

sbf.append("序号    列名        ").append("类型        ");

sbf.append("是否为空        ");

System.out.println(sbf);

sbf.delete(0, sbf.length());

// 输出列的属性信息

for (int i = 1; i <= columnCount; i++) {

sbf.append(i).append("    ");

sbf.append(md.getColumnName(i)).append("        ");

sbf.append(md.getColumnTypeName(i)).append("        ");

sbf.append(md.isNullable(i));

System.out.println(sbf);

sbf.delete(0, sbf.length());

}

System.out.println("此表共有 " + columnCount + " 列");

rs.close();

} catch (SQLException e) {

e.printStackTrace();

} finally {

// 关闭Statement

if (sm != null) {

try {

sm.close();

} catch (SQLException e1) {

e1.printStackTrace();

}

}

}

}

public static void main(String[] args) throws ClassNotFoundException, SQLException {

String tableName = "staff";

Connection con = null;

try {

// 获得数据库连接

con = getConnection();

System.out.println();

// 创建表

Create_Data(con, tableName);

// 显示数据表的元信息

Show_Data(con, tableName);

} finally {

// 关闭数据库连接

if (con != null) {

try {

con.close();

} catch (SQLException e1) {

e1.printStackTrace();

}

}

}

}

public static Connection getConnection() {

Connection con = null;

try {

Class.forName("com.mysql.jdbc.Driver");

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/myuser", "root", "123456");

} catch (Exception e) {

e.printStackTrace();

}

return con;

}

}

```

## 程序解读

1. Show_Data()方法实现了获取数据表元数据的功能。首先调用Connection的createStatement方法,创建一个java.sql.Statement对象,它用于执行静态SQL语句并返回执行结果;调用Statement的executeQuery方法,执行查询操作,获得数据表的所有数据,得到的结果集是一个ResultSet对象,该对象里包含了数据表的所有列和行的数据;调用ResultSet的getMetaData方法,获得描述结果集元数据的ResultSetMetaData对象,该对象实质上描述了数据表的元数据。

2. ResultSetMetaData的getColumnCount方法获得数据表定义的列数,getColumnName方法获得某列的列名,getColumnTypeName方法获得某列的类型名,isNullable方法判断某列是否允许为null。ResultSetMetaData还提供了很多方法,这里不一一列出。

**注意**

在读取完结果集中的数据后,需要调用ResultSet的close方法关闭该结果集,因为,每个ResultSet都与数据库存在一个连接,然后调用Statement的close方法,再调用Connection的close方法,即可彻底地关闭连接。这三个关闭是数据库编程中必须注意的,先后顺序不能改变。