jdbc查找数据表的主键

导读:
  大多数数据库有许多主键,但是在一个表中不允许两条记录的同一个主键具有相同的值。可以使用Java Database Connectivity(JDBC)来判断一个数据表的主键。
  JDBC具有强大的元数据处理能力。java.sql.Connection类和java.sql.ResultSet类可以通过调用其getMetaData方法进行反射,例如:
  // 对java.sql中所有的类
  Connection connection = .....
  DatabaseMetaData dbMeta = connection.getMetaData();
  ResultSet rset = .....
  ResultSetMetaData rsMeta = rset.getMetaData();
  java.sql.DatabaseMetaData类包含一个查找数据表主键的方法。你需要知道表的名字,catalog名和schema名。如果不知道catalog和schema,那么你可以不使用它们而输入“ null”。例如:
  // 查找一个名字为“Comment”的表的主键
  // 没有catalog或schema,都设置为null
  ResultSet pkRSet = dbMeta.getPrimaryKeys( null, null, "Comment");
   while( pkRSet.next() ) {
  System.err.println("****** Comment ******");
  System.err.println("TABLE_CAT : "+pkRSet.getObject(1));
  System.err.println("TABLE_SCHEM: "+pkRSet.getObject(2));
  System.err.println("TABLE_NAME : "+pkRSet.getObject(3));
  System.err.println("COLUMN_NAME: "+pkRSet.getObject(4));
  System.err.println("KEY_SEQ : "+pkRSet.getObject(5));
  System.err.println("PK_NAME : "+pkRSet.getObject(6));
  System.err.println("****** ******* ******");
  }
  在这个例子中表“Comment”具有一个叫做“comment_id”的主键。
  下面是上面这些代码在MySQL上的输出:
  ****** Comment ******
  TABLE_CAT :
  TABLE_SCHEM:
  TABLE_NAME : Comment
  COLUMN_NAME: column_id
  KEY_SEQ : 1
  PK_NAME : column_id
  ****** ******* ******
  存在PK_NAME的原因是有时会为一个主键使用列名之外的名字。而KEY_SEQ表示了主键的顺序位置。有些使用字母顺序保存主键的数据库会为KEY_SEQ返回0。
  当创建通用的数据库应用时,查找一个表的主键是很基本的。JDBC的MetaData类提供了所需的数据库反射机制,从而使得这些应用的实现成为可能。
  (本文是为ZDNet翻译的系列文章之一,原文已经发表在ZDNet网站)

本文转自
http://www.javaresearch.org/article/4590.htm
### 创建数据库数据表 在 SQL 中,可以通过 `CREATE DATABASE` 和 `CREATE TABLE` 语句来分别创建数据库数据表。以下是具体的实现方法: #### 创建名为 `books` 的数据库 可以使用以下 SQL 命令来创建一个名为 `books` 的数据库: ```sql CREATE DATABASE books; ``` 这条命令会创建一个新的数据库[^1]。 #### 创建名为 `book` 的数据表 假设需要在一个已经存在的 `books` 数据库中创建一张名为 `book` 的数据表,并定义其字段包括 `bno`, `bname`, `price`, `count`(编号、书名、单价、数量),则可以按照如下方式编写 SQL 脚本: ```sql USE books; CREATE TABLE book ( bno INT PRIMARY KEY AUTO_INCREMENT, bname VARCHAR(255) NOT NULL, price DECIMAL(10, 2), count INT DEFAULT 0 ); ``` 上述脚本中的每一部分解释如下: - `USE books;`:切换到已创建的 `books` 数据库。 - `CREATE TABLE book (...)`: 定义了一个新的数据表 `book`。 - 字段说明: - `bno INT PRIMARY KEY AUTO_INCREMENT`: 主键字段,自动递增。 - `bname VARCHAR(255) NOT NULL`: 存储书名,最大长度为 255 个字符,不能为空。 - `price DECIMAL(10, 2)`: 单价字段,支持两位小数精度。 - `count INT DEFAULT 0`: 数量字段,默认值为 0。 此语法适用于 MySQL 数据库环境[^2]。 --- ### 使用 JDBC 实现对数据库的操作 如果希望通过 Java 编程语言使用 JDBC 来完成对该数据库及其数据表的操作,则需遵循 JDBC 编程的一般流程。具体代码示例如下所示: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DatabaseExample { private static final String DB_URL = "jdbc:mysql://localhost:3306/books"; private static final String USER = "root"; // 替换为实际用户名 private static final String PASSWORD = "password"; // 替换为实际密码 public static void main(String[] args) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { // 注册驱动程序 Class.forName("com.mysql.cj.jdbc.Driver"); // 获取连接 connection = DriverManager.getConnection(DB_URL, USER, PASSWORD); // 插入一条记录 String insertQuery = "INSERT INTO book (bname, price, count) VALUES (?, ?, ?)"; preparedStatement = connection.prepareStatement(insertQuery); preparedStatement.setString(1, "Java Programming"); preparedStatement.setDouble(2, 49.99); preparedStatement.setInt(3, 10); int rowsAffected = preparedStatement.executeUpdate(); System.out.println(rowsAffected + " row(s) inserted."); // 查询所有记录 String selectQuery = "SELECT * FROM book WHERE price < ?"; preparedStatement = connection.prepareStatement(selectQuery); preparedStatement.setDouble(1, 50); // 统计价格低于50元的书籍 resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { int id = resultSet.getInt("bno"); String name = resultSet.getString("bname"); double p = resultSet.getDouble("price"); int c = resultSet.getInt("count"); System.out.printf("ID=%d, Name=%s, Price=%.2f, Count=%d\n", id, name, p, c); } } catch (SQLException | ClassNotFoundException e) { e.printStackTrace(); } finally { // 关闭资源 try { if (resultSet != null) resultSet.close(); if (preparedStatement != null) preparedStatement.close(); if (connection != null) connection.close(); } catch (SQLException ex) { ex.printStackTrace(); } } } } ``` 以上代码实现了通过 JDBC数据库进行插入和查询操作的功能[^3]。 --- ### 相关统计功能 对于题目提到的具体需求,如统计单价小于 50 元的书籍种类数目或者查找单价最高的书籍信息,可通过以下 SQL 查询实现: #### 统计单价小于 50 元的书籍种类数目 ```sql SELECT COUNT(*) AS total_books_under_50 FROM book WHERE price < 50; ``` #### 查找单价最高的书籍信息 ```sql SELECT * FROM book ORDER BY price DESC LIMIT 1; ``` 这些查询可以直接嵌套至 JDBC 程序中以满足业务逻辑的需求。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值