From 647eb87934808636a362554c03b89c6f0cc7f2bf Mon Sep 17 00:00:00 2001 From: leo2c Date: Thu, 6 Feb 2020 15:34:05 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E5=AE=9E?= =?UTF-8?q?=E6=88=98:=20SELECT=E5=91=BD=E4=BB=A4=E4=B8=8EJDBC=E4=BD=BF?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/github/hcsp/sql/Sql.java | 101 +++++++++++++++++++-- 1 file changed, 92 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/github/hcsp/sql/Sql.java b/src/main/java/com/github/hcsp/sql/Sql.java index 418a0df..17f4a54 100644 --- a/src/main/java/com/github/hcsp/sql/Sql.java +++ b/src/main/java/com/github/hcsp/sql/Sql.java @@ -1,10 +1,10 @@ package com.github.hcsp.sql; + import java.io.File; import java.math.BigDecimal; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; +import java.sql.*; +import java.util.ArrayList; import java.util.List; public class Sql { @@ -73,6 +73,8 @@ public String toString() { * 查询有多少所有用户曾经买过指定的商品 * * @param goodsId 指定的商品ID + * @param databaseConnection 数据库连接对象 + * @exception SQLException SQL异常 * @return 有多少用户买过这个商品 */ // 例如,输入goodsId = 1,返回2,因为有2个用户曾经买过商品1。 @@ -82,15 +84,25 @@ public String toString() { // | 2 | // +-----+ public static int countUsersWhoHaveBoughtGoods(Connection databaseConnection, Integer goodsId) throws SQLException { - return 0; + try (PreparedStatement statement = databaseConnection.prepareStatement("select count(distinct USER_ID) from \"ORDER\" where GOODS_ID = ?")) { + statement.setInt(1, goodsId); + statement.executeQuery(); + ResultSet resultSet = statement.getResultSet(); + while (resultSet.next()) { + return resultSet.getInt(1); + } + } + return -1; } /** * 题目2: * 分页查询所有用户,按照ID倒序排列 * - * @param pageNum 第几页,从1开始 + * @param pageNum 第几页,从1开始 * @param pageSize 每页有多少个元素 + * @param databaseConnection 数据库连接对象 + * @exception SQLException SQL异常 * @return 指定页中的用户 */ // 例如,pageNum = 2, pageSize = 3(每页3个元素,取第二页),则应该返回: @@ -100,7 +112,22 @@ public static int countUsersWhoHaveBoughtGoods(Connection databaseConnection, In // | 1 | zhangsan | tel1 | beijing | // +----+----------+------+----------+ public static List getUsersByPageOrderedByIdDesc(Connection databaseConnection, int pageNum, int pageSize) throws SQLException { - return null; + List userList = new ArrayList<>(); + try (PreparedStatement statement = databaseConnection.prepareStatement("select * from user order by id desc limit ?,?")) { + statement.setInt(1, (pageNum - 1) * pageSize); + statement.setInt(2, pageSize); + statement.executeQuery(); + ResultSet resultSet = statement.getResultSet(); + while (resultSet.next()) { + User user = new User(); + user.id = resultSet.getInt(1); + user.name = resultSet.getString(2); + user.tel = resultSet.getString(3); + user.address = resultSet.getString(4); + userList.add(user); + } + } + return userList; } // 商品及其营收 @@ -118,6 +145,9 @@ public String toString() { /** * 题目3: * 查询所有的商品及其销售额,按照销售额从大到小排序 + * @param databaseConnection 数据库连接对象 + * @exception SQLException SQL异常 + * @return 商品id,商品名称,商品销售总额列表 */ // 预期的结果应该如图所示 // +----+--------+------+ @@ -132,7 +162,22 @@ public String toString() { // | 3 | goods3 | 20 | // +----+--------+------+ public static List getGoodsAndGmv(Connection databaseConnection) throws SQLException { - return null; + List goodsAndGmvList = new ArrayList<>(); + try (PreparedStatement statement = databaseConnection.prepareStatement("select \"GOODS\".id,GOODS.name, sum(\"ORDER\".GOODS_NUM*\"ORDER\".GOODS_PRICE) as gmv from \"ORDER\"\n" + + "join GOODS on \"ORDER\".GOODS_ID = GOODS.ID\n" + + "group by \"GOODS\".ID\n" + + "order by gmv desc")) { + statement.executeQuery(); + ResultSet resultSet = statement.getResultSet(); + while (resultSet.next()) { + GoodsAndGmv goodsAndGmv = new GoodsAndGmv(); + goodsAndGmv.goodsId = resultSet.getInt(1); + goodsAndGmv.goodsName = resultSet.getString(2); + goodsAndGmv.gmv = resultSet.getBigDecimal(3); + goodsAndGmvList.add(goodsAndGmv); + } + } + return goodsAndGmvList; } @@ -152,6 +197,9 @@ public String toString() { /** * 题目4: * 查询订单信息,只查询用户名、商品名齐全的订单,即INNER JOIN方式 + * @param databaseConnection 数据库连接对象 + * @exception SQLException SQL异常 + * @return 订单信息 */ // 预期的结果为: // +----------+-----------+------------+-------------+ @@ -170,12 +218,31 @@ public String toString() { // | 6 | zhangsan | goods3 | 20 | // +----------+-----------+------------+-------------+ public static List getInnerJoinOrders(Connection databaseConnection) throws SQLException { - return null; + List orderList = new ArrayList<>(); + try (PreparedStatement statement = databaseConnection.prepareStatement("select \"ORDER\".id, USER.NAME, GOODS.NAME,\"ORDER\".GOODS_NUM*\"ORDER\".GOODS_PRICE as TOTAL_PRICE\n" + + "from \"ORDER\"\n" + + " join GOODS on \"ORDER\".GOODS_ID = GOODS.ID\n" + + " join USER on \"ORDER\".USER_ID = USER.ID")) { + statement.executeQuery(); + ResultSet resultSet = statement.getResultSet(); + while (resultSet.next()) { + Order order = new Order(); + order.id = resultSet.getInt(1); + order.userName = resultSet.getString(2); + order.goodsName = resultSet.getString(3); + order.totalPrice = resultSet.getBigDecimal(4); + orderList.add(order); + } + } + return orderList; } /** * 题目5: * 查询所有订单信息,哪怕它的用户名、商品名缺失,即LEFT JOIN方式 + * @param databaseConnection 数据库连接对象 + * @exception SQLException SQL异常 + * @return 订单信息 */ // 预期的结果为: // +----------+-----------+------------+-------------+ @@ -198,7 +265,23 @@ public static List getInnerJoinOrders(Connection databaseConnection) thro // | 8 | NULL | NULL | 60 | // +----------+-----------+------------+-------------+ public static List getLeftJoinOrders(Connection databaseConnection) throws SQLException { - return null; + List orderList = new ArrayList<>(); + try (PreparedStatement statement = databaseConnection.prepareStatement("select \"ORDER\".id, USER.NAME, GOODS.NAME, \"ORDER\".GOODS_NUM * \"ORDER\".GOODS_PRICE as TOTAL_PRICE\n" + + "from \"ORDER\"\n" + + " left join GOODS on \"ORDER\".GOODS_ID = GOODS.ID\n" + + " left join USER on \"ORDER\".USER_ID = USER.ID")) { + statement.executeQuery(); + ResultSet resultSet = statement.getResultSet(); + while (resultSet.next()) { + Order order = new Order(); + order.id = resultSet.getInt(1); + order.userName = resultSet.getString(2); + order.goodsName = resultSet.getString(3); + order.totalPrice = resultSet.getBigDecimal(4); + orderList.add(order); + } + } + return orderList; } // 注意,运行这个方法之前,请先运行mvn initialize把测试数据灌入数据库 From 6efdfbb0c03763369bbdaaca9d268e5e411d34a4 Mon Sep 17 00:00:00 2001 From: leo2c Date: Fri, 7 Feb 2020 11:31:08 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=8F=90=E5=8F=96=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=B8=BA=E5=85=AC=E5=85=B1=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/github/hcsp/sql/Sql.java | 51 +++++++++++----------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/github/hcsp/sql/Sql.java b/src/main/java/com/github/hcsp/sql/Sql.java index 17f4a54..af9c7a7 100644 --- a/src/main/java/com/github/hcsp/sql/Sql.java +++ b/src/main/java/com/github/hcsp/sql/Sql.java @@ -72,10 +72,10 @@ public String toString() { * 题目1: * 查询有多少所有用户曾经买过指定的商品 * - * @param goodsId 指定的商品ID + * @param goodsId 指定的商品ID * @param databaseConnection 数据库连接对象 - * @exception SQLException SQL异常 * @return 有多少用户买过这个商品 + * @throws SQLException SQL异常 */ // 例如,输入goodsId = 1,返回2,因为有2个用户曾经买过商品1。 // +-----+ @@ -99,11 +99,11 @@ public static int countUsersWhoHaveBoughtGoods(Connection databaseConnection, In * 题目2: * 分页查询所有用户,按照ID倒序排列 * - * @param pageNum 第几页,从1开始 - * @param pageSize 每页有多少个元素 + * @param pageNum 第几页,从1开始 + * @param pageSize 每页有多少个元素 * @param databaseConnection 数据库连接对象 - * @exception SQLException SQL异常 * @return 指定页中的用户 + * @throws SQLException SQL异常 */ // 例如,pageNum = 2, pageSize = 3(每页3个元素,取第二页),则应该返回: // +----+----------+------+----------+ @@ -145,9 +145,10 @@ public String toString() { /** * 题目3: * 查询所有的商品及其销售额,按照销售额从大到小排序 + * * @param databaseConnection 数据库连接对象 - * @exception SQLException SQL异常 - * @return 商品id,商品名称,商品销售总额列表 + * @return 商品id, 商品名称, 商品销售总额列表 + * @throws SQLException SQL异常 */ // 预期的结果应该如图所示 // +----+--------+------+ @@ -197,9 +198,10 @@ public String toString() { /** * 题目4: * 查询订单信息,只查询用户名、商品名齐全的订单,即INNER JOIN方式 + * * @param databaseConnection 数据库连接对象 - * @exception SQLException SQL异常 * @return 订单信息 + * @throws SQLException SQL异常 */ // 预期的结果为: // +----------+-----------+------------+-------------+ @@ -225,14 +227,7 @@ public static List getInnerJoinOrders(Connection databaseConnection) thro " join USER on \"ORDER\".USER_ID = USER.ID")) { statement.executeQuery(); ResultSet resultSet = statement.getResultSet(); - while (resultSet.next()) { - Order order = new Order(); - order.id = resultSet.getInt(1); - order.userName = resultSet.getString(2); - order.goodsName = resultSet.getString(3); - order.totalPrice = resultSet.getBigDecimal(4); - orderList.add(order); - } + conversionResultSetToOrderList(resultSet, orderList); } return orderList; } @@ -240,9 +235,10 @@ public static List getInnerJoinOrders(Connection databaseConnection) thro /** * 题目5: * 查询所有订单信息,哪怕它的用户名、商品名缺失,即LEFT JOIN方式 + * * @param databaseConnection 数据库连接对象 - * @exception SQLException SQL异常 * @return 订单信息 + * @throws SQLException SQL异常 */ // 预期的结果为: // +----------+-----------+------------+-------------+ @@ -272,18 +268,23 @@ public static List getLeftJoinOrders(Connection databaseConnection) throw " left join USER on \"ORDER\".USER_ID = USER.ID")) { statement.executeQuery(); ResultSet resultSet = statement.getResultSet(); - while (resultSet.next()) { - Order order = new Order(); - order.id = resultSet.getInt(1); - order.userName = resultSet.getString(2); - order.goodsName = resultSet.getString(3); - order.totalPrice = resultSet.getBigDecimal(4); - orderList.add(order); - } + conversionResultSetToOrderList(resultSet, orderList); } return orderList; } + private static void conversionResultSetToOrderList(ResultSet resultSet, List orderList) throws SQLException { + while (resultSet.next()) { + Order order = new Order(); + order.id = resultSet.getInt(1); + order.userName = resultSet.getString(2); + order.goodsName = resultSet.getString(3); + order.totalPrice = resultSet.getBigDecimal(4); + orderList.add(order); + } + } + + // 注意,运行这个方法之前,请先运行mvn initialize把测试数据灌入数据库 public static void main(String[] args) throws SQLException { File projectDir = new File(System.getProperty("basedir", System.getProperty("user.dir")));