pstmt.setInt(1, start); pstmt.setInt(2, pageSize);这两句的作用
时间: 2024-05-21 19:11:48 浏览: 97
这两句代码是用于设置 PreparedStatement 对象中的参数值。其中,pstmt.setInt(1, start) 是设置第一个参数的值为 start,而 pstmt.setInt(2, pageSize) 是设置第二个参数的值为 pageSize。这些参数值可以用于执行 SQL 语句中的占位符,从而实现动态生成 SQL 语句的效果。具体地说,这里的 SQL 语句应该是使用了 LIMIT 子句的查询语句,用于限制查询结果的返回范围。
相关问题
Oracle分页查询emp表,已知:pageSize=6,查询第2页。(用java代码实现)
假设emp表结构如下:
| emp_id | emp_name | emp_salary |
| ------ | -------- | ---------- |
| 1 | Tom | 5000 |
| 2 | Jack | 6000 |
| 3 | Lucy | 7000 |
| 4 | Mike | 8000 |
| 5 | Mary | 9000 |
| 6 | John | 10000 |
| 7 | Anna | 11000 |
| 8 | Bob | 12000 |
| 9 | Kate | 13000 |
| 10 | David | 14000 |
Java代码实现:
```java
import java.sql.*;
public class EmpQuery {
public static void main(String[] args) throws SQLException {
int pageSize = 6; // 每页显示记录数
int pageNum = 2; // 查询第2页
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 加载数据库驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
// 获取数据库连接
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "username", "password");
// 构造SQL语句
String sql = "SELECT * FROM (SELECT ROWNUM AS rn, emp_id, emp_name, emp_salary FROM emp) WHERE rn > ? AND rn <= ?";
// 创建PreparedStatement对象
pstmt = conn.prepareStatement(sql);
// 设置参数
int start = (pageNum - 1) * pageSize;
pstmt.setInt(1, start);
pstmt.setInt(2, start + pageSize);
// 执行查询,并返回结果集
rs = pstmt.executeQuery();
// 遍历结果集,输出查询结果
while (rs.next()) {
int empId = rs.getInt("emp_id");
String empName = rs.getString("emp_name");
double empSalary = rs.getDouble("emp_salary");
System.out.println(empId + "\t" + empName + "\t" + empSalary);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放资源
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
}
}
}
```
输出结果:
```
7 Anna 11000.0
8 Bob 12000.0
9 Kate 13000.0
10 David 14000.0
```
第11题,写一个部门表dept2(数据至少15条)的分页存储过程,并使用java代码调用输出在jsp页面上。
### 回答1:
存储过程:
CREATE PROCEDURE dept2(IN PageSize INT, IN PageIndex INT)
BEGIN
DECLARE @startIndex INT, @endIndex INT;
SET @startIndex = PageSize * (PageIndex - 1);
SET @endIndex = PageSize * PageIndex;
SELECT * FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY deptno) as row_number,
deptno, dname, loc
FROM dept2
) AS tmp
WHERE row_number BETWEEN @startIndex AND @endIndex;
ENDJava代码:
public void getDept2(int pageSize, int pageIndex) {
String querySql = "CALL dept2(?, ?)";
try {
PreparedStatement pstmt = conn.prepareStatement(querySql);
pstmt.setInt(1, pageSize);
pstmt.setInt(2, pageIndex);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
int deptno = rs.getInt("deptno");
String dname = rs.getString("dname");
String loc = rs.getString("loc");
//将输出结果输出到jsp页面
}
} catch (SQLException e) {
e.printStackTrace();
}
}
### 回答2:
下面是一个示例的分页存储过程,用于查询和显示部门表dept2的数据。该存储过程在每一页只显示5条数据,将总页数和当前页的数据返回给调用它的Java代码。Java代码将数据输出在JSP页面上。
创建一个名为"getDeptData"的存储过程:
```sql
CREATE PROCEDURE getDeptData
@PageNum INT,
@PageSize INT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @TotalCount INT, @TotalPage INT;
SELECT @TotalCount = COUNT(*) FROM dept2;
SET @TotalPage = CEILING(CONVERT(FLOAT, @TotalCount) / @PageSize);
SELECT *
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY dept_id) AS RowNumber, *
FROM dept2
) AS T
WHERE T.RowNumber BETWEEN (@PageNum - 1) * @PageSize + 1 AND @PageNum * @PageSize;
SELECT @TotalPage AS TotalPage;
END
```
然后,使用Java代码调用该存储过程并在JSP页面上输出数据:
```java
// 导入所需的类
import java.sql.*;
...
// 连接数据库
String url = "jdbc:mysql://localhost:3306/mydatabase?useSSL=false";
String username = "yourUsername";
String password = "yourPassword";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, username, password);
// 调用存储过程并获取结果
CallableStatement stmt = conn.prepareCall("{call getDeptData(?, ?)}");
stmt.setInt(1, pageNum); // 传递当前页码
stmt.setInt(2, pageSize); // 传递每页大小
ResultSet rs = stmt.executeQuery();
// 输出数据到JSP页面
while (rs.next()) {
out.println("部门ID:" + rs.getInt("dept_id") + "<br>");
out.println("部门名称:" + rs.getString("dept_name") + "<br>");
out.println("部门地址:" + rs.getString("dept_address") + "<br>");
// 可根据实际情况输出其他字段
}
out.println("总页数:" + stmt.getInt(3) + "<br>"); // 获取总页数
// 关闭连接和结果集
rs.close();
stmt.close();
conn.close();
```
以上代码将连接到数据库并调用getDeptData存储过程获取指定页码的数据,并将结果输出在JSP页面上。你需要根据实际情况修改数据库连接的URL、用户名和密码,以及存储过程中的表名和字段名。
### 回答3:
以下是一个使用MySQL数据库,并使用Java代码调用的分页存储过程的例子:
首先,我们需要创建一个部门表dept2,并插入至少15条数据:
```sql
CREATE TABLE dept2 (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
location VARCHAR(50)
);
INSERT INTO dept2 (name, location)
VALUES
('部门1', '地点1'),
('部门2', '地点2'),
('部门3', '地点3'),
('部门4', '地点4'),
('部门5', '地点5'),
('部门6', '地点6'),
('部门7', '地点7'),
('部门8', '地点8'),
('部门9', '地点9'),
('部门10', '地点10'),
('部门11', '地点11'),
('部门12', '地点12'),
('部门13', '地点13'),
('部门14', '地点14'),
('部门15', '地点15');
```
接下来,我们创建一个用于分页查询的存储过程getDepartments:
```sql
DELIMITER //
CREATE PROCEDURE getDepartments(
IN pageNum INT,
IN pageSize INT
)
BEGIN
SET @start := (pageNum - 1) * pageSize;
SET @rows := pageSize;
SELECT * FROM dept2
LIMIT @start, @rows;
SET @totalRecords := (SELECT COUNT(*) FROM dept2);
SET @totalPages := CEIL(@totalRecords / pageSize);
SELECT @totalRecords AS totalRecords, @totalPages AS totalPages;
END//
DELIMITER ;
```
然后,我们可以使用Java代码调用这个存储过程,并将结果输出到JSP页面:
```java
import java.sql.*;
public class PaginationExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/database_name";
String username = "username";
String password = "password";
int pageNum = 1; // 当前页码
int pageSize = 5; // 每页的记录数
try (Connection conn = DriverManager.getConnection(url, username, password);
CallableStatement stmt = conn.prepareCall("{CALL getDepartments(?, ?)}")) {
stmt.setInt(1, pageNum);
stmt.setInt(2, pageSize);
boolean hasResults = stmt.execute();
if (hasResults) {
ResultSet rs = stmt.getResultSet();
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String location = rs.getString("location");
// 输出结果到JSP页面
System.out.println("部门ID:" + id + " 部门名称:" + name + " 地点:" + location);
}
if (stmt.getMoreResults()) {
rs = stmt.getResultSet();
if (rs.next()) {
int totalRecords = rs.getInt("totalRecords");
int totalPages = rs.getInt("totalPages");
// 输出总记录数和总页数到JSP页面
System.out.println("总记录数:" + totalRecords + " 总页数:" + totalPages);
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
```
你可以将上述Java代码嵌入到你的JSP页面中,然后通过运行JSP页面来调用分页存储过程,并在页面上显示查询结果和总页数。
阅读全文