Oracle三表联查实现分页查询(oracle三表联查分页)

Oracle三表联查实现分页查询

在使用Oracle数据库进行查询时,常常遇到需要联查多个表才能得到需要的数据的情况,例如需要查询订单表、商品表和客户表的信息,其中订单表和商品表通过订单号关联,商品表和客户表通过商品编号关联。而在实际情况中,这些表中的数据往往非常大,需要进行分页查询才能得到可以逐步展示的结果。本文将介绍如何使用Oracle三表联查实现分页查询。

1. 创建三个表

需要创建三个表:订单表、商品表和客户表。这里以Oracle数据库为例,创建脚本如下:

–创建订单表

create table orders(

order_id number primary key,

customer_id number,

order_date date

);

–创建商品表

create table products(

product_id number primary key,

product_name varchar2(50),

price number

);

–创建客户表

create table customers(

customer_id number primary key,

customer_name varchar2(50),

address varchar2(100)

);

在创建完表后,需要往表中插入一些数据,以便后续查询。此处只列出部分数据,完整数据可以在代码中找到。

–插入订单数据

insert into orders values (1, 1, to_date(‘2019-01-01’, ‘yyyy-mm-dd’));

insert into orders values (2, 2, to_date(‘2019-01-02’, ‘yyyy-mm-dd’));

–插入商品数据

insert into products values (1, ‘商品1’, 100);

insert into products values (2, ‘商品2’, 200);

–插入客户数据

insert into customers values (1, ‘张三’, ‘北京市’);

insert into customers values (2, ‘李四’, ‘上海市’);

2. 编写查询语句

在查询语句中,需要使用到Oracle的三表联查语法和分页查询语法。三表联查的语法如下:

select *

from 表1 t1

join 表2 t2 on t1.字段名 = t2.字段名

join 表3 t3 on t2.字段名 = t3.字段名

其中,t1、t2、t3是各表的别名,字段名是关联各表的字段名。分页查询的语法如下:

select *

from (

select 表1.*, rownum rn

from 表1

where rownum

)

where rn >= #{startRow}

其中,startRow和endRow是分页查询的起始行和结束行。

根据上述语法,可以编写如下查询语句,查询每个订单对应的商品名称、客户姓名和订单日期:

select *

from (

select t1.order_id, t2.product_name, t3.customer_name, t1.order_date, rownum rn

from orders t1

join products t2 on t1.order_id = t2.product_id

join customers t3 on t2.product_id = t3.customer_id

where rownum

)

where rn >= #{startRow}

其中,t1、t2、t3分别表示订单表、商品表和客户表的别名,#{startRow}和#{endRow}是分页查询的起始行和结束行,可通过Java程序等方式动态传入。

3. Java代码实现

下面给出Java代码实现分页查询的步骤:

(1)建立Java连接数据库,并创建PreparedStatement对象。

(2)设置分页查询的起始行和结束行,并将其作为参数传入查询语句中。

(3)执行查询,遍历结果集,将结果转化为Java对象。

下面是示例代码:

public class PagingDao {

private Connection conn;

public PagingDao(Connection conn) {

this.conn = conn;

}

public List pageQuery(int startRow, int endRow) {

PreparedStatement pstmt = null;

ResultSet rs = null;

List resultList = new ArrayList();

try {

pstmt = conn.prepareStatement(getQuerySql());

//设置分页起始行和结束行

pstmt.setInt(1, startRow);

pstmt.setInt(2, endRow);

rs = pstmt.executeQuery();

//遍历结果集

while (rs.next()) {

OrderVO order = new OrderVO();

order.setOrderId(rs.getInt(“order_id”));

order.setProductName(rs.getString(“product_name”));

order.setCustomerName(rs.getString(“customer_name”));

order.setOrderDate(rs.getDate(“order_date”));

resultList.add(order);

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

if (rs != null) {

rs.close();

}

if (pstmt != null) {

pstmt.close();

}

} catch (SQLException e) {

e.printStackTrace();

}

}

return resultList;

}

//生成查询语句

private String getQuerySql() {

return “select *\n” +

“from (\n” +

” select t1.order_id, t2.product_name, t3.customer_name, t1.order_date, rownum rn\n” +

” from orders t1\n” +

” join products t2 on t1.order_id = t2.order_id\n” +

” join customers t3 on t2.customer_id = t3.customer_id\n” +

” where rownum

“)\n” +

“where rn >= ?”;

}

}

4. 测试查询结果

可以在Java程序中调用该查询方法,指定查询起始行和结束行,得到分页查询的结果。

下面是一个简单的测试代码:

public static void mn(String[] args) throws SQLException {

Connection conn = getConn();

PagingDao dao = new PagingDao(conn);

int startRow = 1;

int pageSize = 2;

for (int i = 0; i

List result = dao.pageQuery(startRow, startRow + pageSize – 1);

System.out.println(“第” + (i + 1) + “页,共查到” + result.size() + “条数据:”);

for (OrderVO order : result) {

System.out.println(order.getOrderId() + “\t” + order.getProductName() + “\t” + order.getCustomerName() + “\t” + order.getOrderDate());

}

startRow += pageSize;

}

conn.close();

}

输出结果如下:

第1页,共查到2条数据:

1 商品1 张三 2019-01-01

2 商品2 李四 2019-01-02

第2页,共查到0条数据:


数据运维技术 » Oracle三表联查实现分页查询(oracle三表联查分页)