Java数据库操作与XML基础全解析
立即解锁
发布时间: 2025-08-18 02:33:46 阅读量: 7 订阅数: 21 


Java编程入门与进阶指南
### Java数据库操作与XML基础全解析
#### 数据库查询基础
在建立与数据库的连接后,我们就能执行`select`语句来检索数据。要实现这一点,需要用到几个关键的类和接口:
- **Connection**:这个类有两个常用方法,`close`用于关闭连接,`createStatement`返回一个`Statement`对象,后续可用于执行语句。
- **Statement**:该接口包含向数据库发送语句并执行,以及返回结果所需的方法。其中,`executeQuery`用于执行`select`语句,`executeUpdate`用于执行`insert`、`update`或`delete`语句。
- **ResultSet**:此接口代表查询返回的行,提供了逐行移动和获取列数据的方法。
以下是`Connection`类和`Statement`接口用于执行查询的方法列表:
| 类/接口 | 方法 | 描述 |
| ---- | ---- | ---- |
| Connection | `void close()` | 关闭连接 |
| Connection | `Statement createStatement()` | 创建一个能在连接的数据库上执行SQL语句的`Statement`对象 |
| Connection | `Statement createStatement(int type, int concur)` | 创建一个能在连接的数据库上执行SQL语句的`Statement`对象 |
| Statement | `ResultSet executeQuery(String sql)` | 执行字符串参数中的`select`语句,并将结果数据作为`ResultSet`对象返回 |
| Statement | `int executeUpdate(String sql)` | 执行字符串参数中的`insert`、`update`或`delete`语句,并返回受影响的行数 |
`createStatement`方法的第一个参数指定创建的结果集类型,可选值如下:
- `ResultSet.TYPE_FORWARD_ONLY`
- `ResultSet.TYPE_SCROLL_INSENSITIVE`
- `ResultSet.TYPE_SCROLL_SENSITIVE`
第二个参数表示结果集是只读还是可更新的,可选值如下:
- `ResultSet.CONCUR_READ_ONLY`
- `ResultSet.CONCUR_UPDATABLE`
执行`select`语句的示例代码如下:
```java
Statement s = con.createStatement();
String select = "Select title, year, price "
+ "from movie order by year";
ResultSet rows = s.executeQuery(select);
```
#### 结果集的导航与数据获取
`executeQuery`语句返回的`ResultSet`对象包含了`select`语句检索到的所有行,但一次只能访问其中一行。结果集维护着一个名为游标(cursor)的指针来跟踪当前行。可以使用以下方法移动游标:
| 方法 | 描述 |
| ---- | ---- |
| `void close()` | 关闭结果集 |
| `void last()` | 将游标移动到最后一行 |
| `int getRow()` | 获取当前行号 |
| `boolean next()` | 移动到下一行 |
处理结果集中每行数据的代码结构示例:
```java
while(rows.next())
{
// process the current row
}
```
从结果集中获取数据的方法有两种版本,一种通过列名指定列,另一种通过索引编号指定列。如果知道索引编号,使用它访问列值会比使用列名更高效。以下是获取当前行标题、年份和价格的代码示例:
```java
// 通过列名获取
String title = row.getString("title");
int year = row.getInt("year");
double price = row.getDouble("price");
// 通过索引获取
String title = row.getString(1);
int year = row.getInt(2);
double price = row.getDouble(3);
```
需要注意的是,与Java中几乎所有其他索引不同,列索引从1开始,而不是0。
#### 完整的数据库读取程序示例
以下是一个完整的Java程序,用于从电影数据库中读取数据并在控制台列出:
```java
import java.sql.*;
import java.text.NumberFormat;
public class ListMovies
{
public static void main(String[] args)
{
NumberFormat cf = NumberFormat.getCurrencyInstance();
ResultSet movies = getMovies();
try
{
while (movies.next())
{
Movie m = getMovie(movies);
String msg = Integer.toString(m.year);
msg += ": " + m.title;
msg += " (" + cf.format(m.price) + ")";
System.out.println(msg);
}
}
catch (SQLException e)
{
System.out.println(e.getMessage());
}
}
private static ResultSet getMovies()
{
Connection con = getConnection();
try
{
Statement s = con.createStatement();
String select = "Select title, year, price "
+ "from movie order by year";
ResultSet rows;
rows = s.executeQuery(select);
return rows;
}
catch (SQLException e)
{
System.out.println(e.getMessage());
}
return null;
}
private static Connection getConnection()
{
Connection con = null;
try
{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost/Movies";
String user = "root";
String pw = "PassWord";
con = DriverManager.getConnection(url, user, pw);
}
catch (ClassNotFoundException e)
{
System.out.println(e.getMessage());
System.exit(0);
}
catch (SQLException e)
{
System.out.println(e.getMessage());
System.exit(0);
}
return con;
}
private static Movie getMovie(ResultSet movies)
{
try
{
String title = movies.getString("Title");
int year = movies.getInt("Year");
double price = movies.getDouble("Price");
return new Movie(title, year, price);
}
catch (SQLException e)
{
System.out.println(e.getMessage());
}
return null;
}
private static class Movie
{
public String title;
public int year;
public double price;
public Movie(String title, int year, double price)
{
this.title = title;
this.year = year;
this.price = price;
}
}
}
```
这个程序的工作原理如下:
1. `main`方法首先调用`getMovies`方法获取包含要列出的电影的`ResultSet`对象,然后通过`while`循环读
0
0
复制全文
相关推荐










