From 7d7d7525b39fd1eb10d1e44da5b0b468b5a553ee Mon Sep 17 00:00:00 2001 From: hanchenhao Date: Sat, 4 Feb 2023 17:43:08 +0800 Subject: [PATCH] test --- src/main/java/com/github/hcsp/sql/Sql.java | 199 ++++++++------------- 1 file changed, 78 insertions(+), 121 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..6a89d22 100644 --- a/src/main/java/com/github/hcsp/sql/Sql.java +++ b/src/main/java/com/github/hcsp/sql/Sql.java @@ -1,60 +1,13 @@ 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 { -// 用户表: -// +----+----------+------+----------+ -// | ID | NAME | TEL | ADDRESS | -// +----+----------+------+----------+ -// | 1 | zhangsan | tel1 | beijing | -// +----+----------+------+----------+ -// | 2 | lisi | tel2 | shanghai | -// +----+----------+------+----------+ -// | 3 | wangwu | tel3 | shanghai | -// +----+----------+------+----------+ -// | 4 | zhangsan | tel4 | shenzhen | -// +----+----------+------+----------+ -// 商品表: -// +----+--------+-------+ -// | ID | NAME | PRICE | -// +----+--------+-------+ -// | 1 | goods1 | 10 | -// +----+--------+-------+ -// | 2 | goods2 | 20 | -// +----+--------+-------+ -// | 3 | goods3 | 30 | -// +----+--------+-------+ -// | 4 | goods4 | 40 | -// +----+--------+-------+ -// | 5 | goods5 | 50 | -// +----+--------+-------+ -// 订单表: -// +------------+-----------------+------------------+---------------------+-------------------------------+ -// | ID(订单ID) | USER_ID(用户ID) | GOODS_ID(商品ID) | GOODS_NUM(商品数量) | GOODS_PRICE(下单时的商品单价) | -// +------------+-----------------+------------------+---------------------+-------------------------------+ -// | 1 | 1 | 1 | 5 | 10 | -// +------------+-----------------+------------------+---------------------+-------------------------------+ -// | 2 | 2 | 1 | 1 | 10 | -// +------------+-----------------+------------------+---------------------+-------------------------------+ -// | 3 | 2 | 1 | 2 | 10 | -// +------------+-----------------+------------------+---------------------+-------------------------------+ -// | 4 | 4 | 2 | 4 | 20 | -// +------------+-----------------+------------------+---------------------+-------------------------------+ -// | 5 | 4 | 2 | 100 | 20 | -// +------------+-----------------+------------------+---------------------+-------------------------------+ -// | 6 | 4 | 3 | 1 | 20 | -// +------------+-----------------+------------------+---------------------+-------------------------------+ -// | 7 | 5 | 4 | 1 | 20 | -// +------------+-----------------+------------------+---------------------+-------------------------------+ -// | 8 | 5 | 6 | 1 | 60 | -// +------------+-----------------+------------------+---------------------+-------------------------------+ - // 用户信息 public static class User { Integer id; @@ -75,13 +28,16 @@ public String toString() { * @param goodsId 指定的商品ID * @return 有多少用户买过这个商品 */ -// 例如,输入goodsId = 1,返回2,因为有2个用户曾经买过商品1。 -// +-----+ -// |count| -// +-----+ -// | 2 | -// +-----+ + public static int countUsersWhoHaveBoughtGoods(Connection databaseConnection, Integer goodsId) throws SQLException { + PreparedStatement ps = databaseConnection.prepareStatement("select count(distinct USER_ID)\n" + + "from \"ORDER\"\n" + + "where GOODS_ID = ?;"); + ps.setInt(1, goodsId); + ResultSet resultSet = ps.executeQuery(); + if (resultSet.next()) { + return resultSet.getInt(1); + } return 0; } @@ -89,7 +45,7 @@ public static int countUsersWhoHaveBoughtGoods(Connection databaseConnection, In * 题目2: * 分页查询所有用户,按照ID倒序排列 * - * @param pageNum 第几页,从1开始 + * @param pageNum 第几页,从1开始 * @param pageSize 每页有多少个元素 * @return 指定页中的用户 */ @@ -100,7 +56,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 users = new ArrayList<>(); + PreparedStatement ps = databaseConnection.prepareStatement("select id, name, tel, address from USER order by ID desc limit ?, ?;"); + int searchStartIndex = (pageNum - 1) * pageSize; + int searchEndIndex = searchStartIndex + pageNum; + ps.setInt(1, searchStartIndex); + ps.setInt(2, searchEndIndex); + ResultSet resultSet = ps.executeQuery(); + while (resultSet.next()) { + User user = new User(); + user.id = resultSet.getInt("ID"); + user.name = resultSet.getString("NAME"); + user.tel = resultSet.getString("TEL"); + user.address = resultSet.getString("ADDRESS"); + users.add(user); + } + return users; } // 商品及其营收 @@ -119,20 +90,22 @@ public String toString() { * 题目3: * 查询所有的商品及其销售额,按照销售额从大到小排序 */ -// 预期的结果应该如图所示 -// +----+--------+------+ -// | ID | NAME | GMV | -// +----+--------+------+ -// | 2 | goods2 | 2080 | -// +----+--------+------+ -// | 1 | goods1 | 80 | -// +----+--------+------+ -// | 4 | goods4 | 20 | -// +----+--------+------+ -// | 3 | goods3 | 20 | -// +----+--------+------+ public static List getGoodsAndGmv(Connection databaseConnection) throws SQLException { - return null; + List goodsAndGmvs = new ArrayList<>(); + PreparedStatement ps = databaseConnection.prepareStatement("select G2.ID,G2.NAME, sum(GOODS_PRICE * GOODS_NUM) as GMV\n" + + "from \"ORDER\"\n" + + "join GOODS G2 on G2.ID = \"ORDER\".GOODS_ID\n" + + "group by GOODS_ID\n" + + "order by GMV desc ;"); + ResultSet resultSet = ps.executeQuery(); + while (resultSet.next()) { + GoodsAndGmv goodsAndGmv = new GoodsAndGmv(); + goodsAndGmv.gmv = resultSet.getBigDecimal("GMV"); + goodsAndGmv.goodsId = resultSet.getInt("ID"); + goodsAndGmv.goodsName = resultSet.getString("NAME"); + goodsAndGmvs.add(goodsAndGmv); + } + return goodsAndGmvs; } @@ -153,65 +126,49 @@ public String toString() { * 题目4: * 查询订单信息,只查询用户名、商品名齐全的订单,即INNER JOIN方式 */ -// 预期的结果为: -// +----------+-----------+------------+-------------+ -// | ORDER_ID | USER_NAME | GOODS_NAME | TOTAL_PRICE | -// +----------+-----------+------------+-------------+ -// | 1 | zhangsan | goods1 | 50 | -// +----------+-----------+------------+-------------+ -// | 2 | lisi | goods1 | 10 | -// +----------+-----------+------------+-------------+ -// | 3 | lisi | goods1 | 20 | -// +----------+-----------+------------+-------------+ -// | 4 | zhangsan | goods2 | 80 | -// +----------+-----------+------------+-------------+ -// | 5 | zhangsan | goods2 | 2000 | -// +----------+-----------+------------+-------------+ -// | 6 | zhangsan | goods3 | 20 | -// +----------+-----------+------------+-------------+ + public static List getInnerJoinOrders(Connection databaseConnection) throws SQLException { - return null; + List orders = new ArrayList<>(); + ResultSet resultSet = databaseConnection.createStatement().executeQuery("select \"ORDER\".ID as ORDER_ID,\n" + + " U.NAME as USER_NAME,\n" + + " G2.NAME as GOODS_NAME,\n" + + " \"ORDER\".GOODS_NUM * GOODS_PRICE as TOTAL_PRICE\n" + + "from \"ORDER\"\n" + + " join USER U on U.ID = \"ORDER\".USER_ID\n" + + " join GOODS G2 on G2.ID = \"ORDER\".GOODS_ID"); + + return getOrders((List) orders, resultSet); + } + + private static List getOrders(List orders, ResultSet resultSet) throws SQLException { + while (resultSet.next()) { + Order order = new Order(); + order.goodsName = resultSet.getString("GOODS_NAME"); + order.userName = resultSet.getString("USER_NAME"); + order.id = resultSet.getInt("ORDER_ID"); + order.totalPrice = resultSet.getBigDecimal("TOTAL_PRICE"); + orders.add(order); + } + return orders; } /** * 题目5: * 查询所有订单信息,哪怕它的用户名、商品名缺失,即LEFT JOIN方式 */ -// 预期的结果为: -// +----------+-----------+------------+-------------+ -// | ORDER_ID | USER_NAME | GOODS_NAME | TOTAL_PRICE | -// +----------+-----------+------------+-------------+ -// | 1 | zhangsan | goods1 | 50 | -// +----------+-----------+------------+-------------+ -// | 2 | lisi | goods1 | 10 | -// +----------+-----------+------------+-------------+ -// | 3 | lisi | goods1 | 20 | -// +----------+-----------+------------+-------------+ -// | 4 | zhangsan | goods2 | 80 | -// +----------+-----------+------------+-------------+ -// | 5 | zhangsan | goods2 | 2000 | -// +----------+-----------+------------+-------------+ -// | 6 | zhangsan | goods3 | 20 | -// +----------+-----------+------------+-------------+ -// | 7 | NULL | goods4 | 20 | -// +----------+-----------+------------+-------------+ -// | 8 | NULL | NULL | 60 | -// +----------+-----------+------------+-------------+ + public static List getLeftJoinOrders(Connection databaseConnection) throws SQLException { - return null; + List orders = new ArrayList<>(); + ResultSet resultSet = databaseConnection.createStatement().executeQuery("select \"ORDER\".ID as ORDER_ID,\n" + + " U.NAME as USER_NAME,\n" + + " G2.NAME as GOODS_NAME,\n" + + " \"ORDER\".GOODS_NUM * GOODS_PRICE as TOTAL_PRICE\n" + + "from \"ORDER\"\n" + + " left join USER U on U.ID = \"ORDER\".USER_ID\n" + + " left join GOODS G2 on G2.ID = \"ORDER\".GOODS_ID"); + + return getOrders((List) orders, resultSet); } - // 注意,运行这个方法之前,请先运行mvn initialize把测试数据灌入数据库 - public static void main(String[] args) throws SQLException { - File projectDir = new File(System.getProperty("basedir", System.getProperty("user.dir"))); - String jdbcUrl = "jdbc:h2:file:" + new File(projectDir, "target/test").getAbsolutePath(); - try (Connection connection = DriverManager.getConnection(jdbcUrl, "root", "Jxi1Oxc92qSj")) { - System.out.println(countUsersWhoHaveBoughtGoods(connection, 1)); - System.out.println(getUsersByPageOrderedByIdDesc(connection, 2, 3)); - System.out.println(getGoodsAndGmv(connection)); - System.out.println(getInnerJoinOrders(connection)); - System.out.println(getLeftJoinOrders(connection)); - } - } }