JDBC数据库操作与XML基础入门
立即解锁
发布时间: 2025-08-18 00:27:57 阅读量: 3 订阅数: 19 

### JDBC数据库操作与XML基础入门
#### 1. JDBC查询数据库
在建立与数据库的连接后,就可以执行`select`语句来检索数据。这需要使用几个类和接口:
- **Connection**:该类有两个常用方法,`close`方法用于关闭连接,`createStatement`方法返回一个`Statement`对象,用于执行语句。
- **Statement**:此接口包含将语句发送到数据库执行并返回结果所需的方法。可以使用`executeQuery`方法执行`select`语句,或使用`executeUpdate`方法执行`insert`、`update`或`delete`语句。
- **ResultSet**:该接口表示查询返回的行,提供了逐行移动并获取列数据的方法。
以下是`Connection`类和`Statement`接口用于执行查询的方法列表:
| Connection类方法 | 描述 |
| --- | --- |
| `void close()` | 关闭连接 |
| `Statement createStatement()` | 创建一个能在连接的数据库上执行SQL语句的`Statement`对象 |
| `Statement createStatement(int type, int concur)` | 创建一个能在连接的数据库上执行SQL语句的`Statement`对象 |
| Statement接口方法 | 描述 |
| --- | --- |
| `ResultSet executeQuery(String sql)` | 执行字符串参数中的`select`语句,并将结果数据作为`ResultSet`对象返回 |
| `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);
```
#### 2. 遍历结果集
`executeQuery`语句返回的`ResultSet`对象包含`select`语句检索到的所有行,一次只能访问其中一行。结果集维护一个称为游标的指针来跟踪当前行,可以使用以下方法移动游标:
| 方法 | 描述 |
| --- | --- |
| `void close()` | 关闭结果集 |
| `void last()` | 将游标移动到最后一行 |
| `int getRow()` | 获取当前行号 |
| `boolean next()` | 移动到下一行 |
处理结果集中每一行的代码结构示例:
```java
while(rows.next())
{
// process the current row
}
```
#### 3. 从结果集获取数据
`ResultSet`接口提供了从当前行检索数据的方法,每个方法有两种版本:一种通过列名指定列,另一种通过索引编号指定列。如果知道索引编号,使用它访问列值比使用列名更高效。
| 方法 | 描述 |
| --- | --- |
| `BigDecimal getBigDecimal(String columnName)` | 获取指定列的值作为`BigDecimal`类型 |
| `BigDecimal getBigDecimal(int columnIndex)` | 获取指定列的值作为`BigDecimal`类型 |
| `boolean getBoolean(String columnName)` | 获取指定列的值作为`boolean`类型 |
| `boolean getBoolean(int columnIndex)` | 获取指定列的值作为`boolean`类型 |
| `Date getDate(String columnName)` | 获取指定列的值作为`Date`类型 |
| `Date getDate(int columnIndex)` | 获取指定列的值作为`Date`类型 |
| `double getDouble(String columnName)` | 获取指定列的值作为`double`类型 |
| `double getDouble(int columnIndex)` | 获取指定列的值作为`double`类型 |
| `float getFloat(String columnName)` | 获取指定列的值作为`float`类型 |
| `float getFloat(int columnIndex)` | 获取指定列的值作为`float`类型 |
| `int getInt(String columnName)` | 获取指定列的值作为`int`类型 |
| `int getInt(int columnIndex)` | 获取指定列的值作为`int`类型 |
| `long getLong(String columnName)` | 获取指定列的值作为`long`类型 |
| `long getLong(int columnIndex)` | 获取指定列的值作为`long`类型 |
| `short getShort(String columnName)` | 获取指定列的值作为`short`类型 |
| `short getShort(int columnIndex)` | 获取指定列的值作为`short`类型 |
| `String getString(String columnName)` | 获取指定列的值作为`String`类型 |
| `String getString(int columnIndex)` | 获取指定列的值作为`String`类型 |
获取当前行的标题、年份和价格的代码示例:
```java
String title = row.getString("title");
int year = row.getInt("year");
double price = row.getDouble("price");
```
也可以使用索引编号:
```java
String title = row.getString(1);
int year = row.getInt(2);
double price = row.getDouble(3);
```
注意,与Java中几乎所有其他索引不同,列索引从1开始,而不是0。
#### 4. 完整示例:从数据库读取数据的程序
以下是一个从电影数据库读取数据并在控制台列出的程序示例:
```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;
}
}
}
```
程序的基本工作原理如下:
- `main`方法首先调用`getMovies`方法获取包含要列出的电影的`ResultSet`对象,然后使用`while`循环读取结果集的每一行。调用`getMovie`方法从当前行的数据创建一个`Movie`对象,然后创建一个输出字符串并发送到控制台。循环包含在`try/catch`语句中,因为`ne
0
0
复制全文
相关推荐










