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条数据: