目录
一、商品列表
本关任务
一个商场不能缺少商品,本关需要借助JDBC
,从 t_goods
表中获取销量前四的商品信息,并展示到页面。
JDBC
信息;
MYSQL用户名 | MYSQL密码 | 驱动 | URL |
---|---|---|---|
root | 123123 | com.mysql.jdbc.Driver | jdbc:mysql://127.0.0.1:3306/online_shop?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true |
com.educoder.entity.Goods
字段及方法;
字段 | 描述 | 类型 | get方法 | set方法 |
---|---|---|---|---|
goodsId | 商品Id | String | getGoodsId() | setGoodsId(String goodsId) |
goodsName | 商品名 | String | getGoodsName() | setGoodsName(String goodsName) |
goodsImg | 展示于主页的图 | String | getGoodsImg() | setGoodsImg(String goodsImg) |
goodsPrice | 价格 | BigDecimal | getGoodsPrice() | setGoodsPrice(BigDecimal goodsPrice) |
goodsNum | 库存数量 | Integer | getGoodsNum() | setGoodsNum(Integer goodsNum) |
salesNum | 销售数量 | Integer | getSalesNum() | setSalesNum(Integer salesNum) |
goodsSize | 商品规格 | String | getGoodsSize() | setGoodsSize(String goodsSize) |
goodsFrom | 商品产地 | String | getGoodsFrom() | setGoodsFrom(String goodsFrom) |
goodsTime | 保质期 | String | getGoodsTime() | setGoodsTime(String goodsTime) |
goodsSaveCondition | 存储条件 | String | getGoodsSaveCondition() | setGoodsSaveCondition(String goodsSaveCondition) |
goodsDescribe | 商品描述介绍 | String | getGoodsDescribe() | setGoodsDescribe(String goodsDescribe) |
goodsExplain | 对商品简短说明 | String | getGoodsExplain() | setGoodsExplain(String goodsExplain) |
goodsClass | 所属类别 | String | getGoodsClass() | setGoodsClass(String goodsClass) |
goodsDiscount | 折扣 | BigDecimal | getGoodsDiscount() | setGoodsDiscount(BigDecimal goodsDiscount) |
discountStartTime | 优惠起始时间 | Date | getDiscountStartTime() | setDiscountStartTime(Date discountStartTime) |
discountEndTime | 优惠截止时间 | Date | getDiscountEndTime() | setDiscountEndTime(Date discountEndTime) |
表和类对应表;
库名 | 表名 | 类名 |
---|---|---|
online_shop | t_goods | Goods |
注意:类字段和对应的表字段名称一致,这里不再重复列出了。
页面初始效果图:
最终页面效果图:
具体要求
- 补全
getGoodsList()
方法,返回List
(商品列表)。
结果输出
[{"goodsClass":"甜品","goodsDescribe":"口感绵密,精致细腻\r\n这份雪白让你有如获至宝的幸福感","goodsExplain":"手工打发而成的进口鲜奶油","goodsFrom":"上海","goodsId":"list1","goodsImg":"list_1-1.jpg","goodsName":"雪域牛乳芝士","goodsNum":996,"goodsPrice":98.00,"goodsSaveCondition":"冷藏0~4摄氏度","goodsSize":"约450g","goodsTime":"3天","salesNum":44},{"goodsClass":"甜品","goodsDescribe":"酸甜清爽\r\n回味无穷","goodsExplain":"卡福洛芒果泥","goodsFrom":"上海","goodsId":"list3","goodsImg":"list_3-1.jpg","goodsName":"芒果熔岩星球蛋糕 Mango Planet","goodsNum":1994,"goodsPrice":118.00,"goodsSaveCondition":"冷藏0~4摄氏度","goodsSize":"约680g","goodsTime":"2天","salesNum":42},{"goodsClass":"甜品","goodsDescribe":"通过精致的工艺\r\n将巧克力的香醇甜蜜发挥到极致\r\n每一口都倍感甜蜜","goodsExplain":"进口的黑巧克力","goodsFrom":"上海","goodsId":"list2","goodsImg":"list_2-1.jpg","goodsName":"哈!蜜瓜蛋糕 Hey Melon","goodsNum":1496,"goodsPrice":99.00,"goodsSaveCondition":"冷藏0~4摄氏度","goodsSize":"约500g","goodsTime":"3天","salesNum":39},{"goodsClass":"甜品","goodsDescribe":"在金色芒果淋面的外衣下\r\n是芒果慕斯的柔情\r\n是芒果啫喱的牵挂\r\n还有丝丝香草戚风蛋糕的香气","goodsExplain":"手工打发而成的进口鲜奶油","goodsFrom":"上海","goodsId":"list5","goodsImg":"list_5-1.jpg","goodsName":"蟹蟹你偷吃 Yum Yum Cake","goodsNum":6999,"goodsPrice":88.00,"goodsSaveCondition":"冷藏0~4摄氏度","goodsSize":"约480g","goodsTime":"3天","salesNum":5}]
实现代码
package com.educoder.service.impl; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import com.educoder.entity.Goods; import com.educoder.service.GoodsService; import com.educoder.dao.impl.BaseDao; public class GoodsServiceImpl implements GoodsService { public Goods getGoodsByGoodsId(String goodsId) { String sql = "select * from t_goods where goodsId = ?"; List
二、商品详情
本关任务
有了商品还需要看商品的详细信息,本关需要借助JDBC
,通过参数商品Id
从数据库中获取商品详情,展示到页面。为了完成本关任务,需要了解:
JDBC
查询方法封装;- 商品相关信息介绍。
JDBC查询方法封装
为了方便JDBC
操作,平台对JDBC
查询方法进行了封装,封装类com.educoder.dao.impl.BaseDao
。
public static List operQuery(String sql, List p, Class cls) throws Exception { Connection conn = null; PreparedStatement pste = null; ResultSet rs = null; List list = new ArrayList(); conn = getConn(); try { pste = conn.prepareStatement(sql); if (p != null) { for (int i = 0; i < p.size(); i++) { pste.setObject(i + 1, p.get(i)); } } rs = pste.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); while (rs.next()) { T entity = cls.newInstance(); for (int j = 0; j < rsmd.getColumnCount(); j++) { String col_name = rsmd.getColumnName(j + 1); Object value = rs.getObject(col_name); Field field = cls.getDeclaredField(col_name); field.setAccessible(true); field.set(entity, value); } list.add(entity); } } catch (SQLException e) { e.printStackTrace(); } finally { releaseAll(rs, pste, conn); } return list; }
例如,第一关可以使用如下方法,获取商品列表:
String sql = "select * from t_goods order by salesNum desc limit 4"; List goodsList = null; try { goodsList = BaseDao.operQuery(sql, null, Goods.class); } catch (Exception e) { e.printStackTrace(); }
商品相关信息介绍
MYSQL用户名 | MYSQL密码 | 驱动 | URL |
---|---|---|---|
root | 123123 | com.mysql.jdbc.Driver | jdbc:mysql://127.0.0.1:3306/online_shop?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true |
com.educoder.entity.Goods
字段及方法;
字段 | 描述 | 类型 | get方法 | set方法 |
---|---|---|---|---|
goodsId | 商品Id | String | getGoodsId() | setGoodsId(String goodsId) |
goodsName | 商品名 | String | getGoodsName() | setGoodsName(String goodsName) |
goodsImg | 展示于主页的图 | String | getGoodsImg() | setGoodsImg(String goodsImg) |
goodsPrice | 价格 | BigDecimal | getGoodsPrice() | setGoodsPrice(BigDecimal goodsPrice) |
goodsNum | 库存数量 | Integer | getGoodsNum() | setGoodsNum(Integer goodsNum) |
salesNum | 销售数量 | Integer | getSalesNum() | setSalesNum(Integer salesNum) |
goodsSize | 商品规格 | String | getGoodsSize() | setGoodsSize(String goodsSize) |
goodsFrom | 商品产地 | String | getGoodsFrom() | setGoodsFrom(String goodsFrom) |
goodsTime | 保质期 | String | getGoodsTime() | setGoodsTime(String goodsTime) |
goodsSaveCondition | 存储条件 | String | getGoodsSaveCondition() | setGoodsSaveCondition(String goodsSaveCondition) |
goodsDescribe | 商品描述介绍 | String | getGoodsDescribe() | setGoodsDescribe(String goodsDescribe) |
goodsExplain | 对商品简短说明 | String | getGoodsExplain() | setGoodsExplain(String goodsExplain) |
goodsClass | 所属类别 | String | getGoodsClass() | setGoodsClass(String goodsClass) |
goodsDiscount | 折扣 | BigDecimal | getGoodsDiscount() | setGoodsDiscount(BigDecimal goodsDiscount) |
discountStartTime | 优惠起始时间 | Date | getDiscountStartTime() | setDiscountStartTime(Date discountStartTime) |
discountEndTime | 优惠截止时间 | Date | getDiscountEndTime() | setDiscountEndTime(Date discountEndTime) |
表和类对应表;
库名 | 表名 | 类名 |
---|---|---|
online_shop | t_goods | Goods |
注意:类字段和对应的表字段名称一致,这里不再重复列出了。
页面初始效果图:
最终页面效果图:
具体要求
- 补全
getGoodsByGoodsId()
方法,完成查询商品详情的任务,最后返回Goods
(商品)。
结果输出
{"goodsClass":"甜品","goodsDescribe":"口感绵密,精致细腻\r\n这份雪白让你有如获至宝的幸福感","goodsExplain":"手工打发而成的进口鲜奶油","goodsFrom":"上海","goodsId":"list1","goodsImg":"list_1-1.jpg","goodsName":"雪域牛乳芝士","goodsNum":996,"goodsPrice":98.00,"goodsSaveCondition":"冷藏0~4摄氏度","goodsSize":"约450g","goodsTime":"3天","salesNum":44}
实现代码
package com.educoder.service.impl; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import com.educoder.entity.Goods; import com.educoder.service.GoodsService; import com.educoder.dao.impl.BaseDao; public class GoodsServiceImpl implements GoodsService { public Goods getGoodsByGoodsId(String goodsId) { String sql = "select * from t_goods where goodsId = ?"; List parameters = new ArrayList(); parameters.add(goodsId); List goodsList = null; try { goodsList = BaseDao.operQuery(sql, parameters, Goods.class); } catch (Exception e) { e.printStackTrace(); } return goodsList.size() == 0 ? null : goodsList.get(0); } public List searchGoods(String condition) { String sql = "select * from t_goods where goodsName like ? or goodsClass like ? order by salesNum desc"; List goodsList = null; condition = "%" + condition + "%"; List paramenter = new ArrayList(); paramenter.add(condition); paramenter.add(condition); try { goodsList = BaseDao.operQuery(sql, paramenter, Goods.class); } catch (Exception e) { e.printStackTrace(); } return goodsList; } public List getGoodsList() { String USERNAME = "root"; String PASSWORD = "123123"; String URL = "jdbc:mysql://127.0.0.1:3306/online_shop?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true"; Connection conn = null; PreparedStatement pste = null; ResultSet executeQuery = null; List list = new ArrayList(); String sql = "select * from t_goods order by salesNum desc limit 4"; try { conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); pste = conn.prepareStatement(sql); executeQuery = pste.executeQuery(); while (executeQuery.next()) { Goods goods = new Goods(); goods.setGoodsId(executeQuery.getString("goodsId")); goods.setGoodsName(executeQuery.getString("goodsName")); goods.setGoodsImg(executeQuery.getString("goodsImg")); goods.setGoodsPrice(executeQuery.getBigDecimal("goodsPrice")); goods.setGoodsNum(executeQuery.getInt("goodsNum")); goods.setSalesNum(executeQuery.getInt("salesNum")); goods.setGoodsSize(executeQuery.getString("goodsSize")); goods.setGoodsFrom(executeQuery.getString("goodsFrom")); goods.setGoodsTime(executeQuery.getString("goodsTime")); goods.setGoodsSaveCondition(executeQuery.getString("goodsSaveCondition")); goods.setGoodsDescribe(executeQuery.getString("goodsDescribe")); goods.setGoodsExplain(executeQuery.getString("goodsExplain")); goods.setGoodsClass(executeQuery.getString("goodsClass")); goods.setGoodsDiscount(executeQuery.getBigDecimal("goodsDiscount")); goods.setDiscountStartTime(executeQuery.getDate("discountStartTime")); goods.setDiscountEndTime(executeQuery.getDate("discountEndTime")); list.add(goods); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (executeQuery != null) executeQuery.close(); if (pste != null) pste.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } return list; } }
三、商品搜索
编程要求
请仔细阅读右侧代码,在Begin-End
区域内进行代码补充,实现商品搜索的功能,具体需求如下:
- 补全
searchGoods()
方法,完成商品搜索的功能,最后返回List
(商品列表)。
测试说明
平台会对你编写的代码进行测试:
测试输入:雪域牛
预期输出:
[{"goodsClass":"甜品","goodsDescribe":"口感绵密,精致细腻\r\n这份雪白让你有如获至宝的幸福感","goodsExplain":"手工打发而成的进口鲜奶油","goodsFrom":"上海","goodsId":"list1","goodsImg":"list_1-1.jpg","goodsName":"雪域牛乳芝士","goodsNum":996,"goodsPrice":98.00,"goodsSaveCondition":"冷藏0~4摄氏度","goodsSize":"约450g","goodsTime":"3天","salesNum":44}]
实现代码
package com.educoder.service.impl; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import com.educoder.entity.Goods; import com.educoder.service.GoodsService; import com.educoder.dao.impl.BaseDao; public class GoodsServiceImpl implements GoodsService { public Goods getGoodsByGoodsId(String goodsId) { String sql = "select * from t_goods where goodsId = ?"; List parameters = new ArrayList(); parameters.add(goodsId); List goodsList = null; try { goodsList = BaseDao.operQuery(sql, parameters, Goods.class); } catch (Exception e) { e.printStackTrace(); } return goodsList.size() == 0 ? null : goodsList.get(0); } public List searchGoods(String condition) { String sql = "select * from t_goods where goodsName like ? or goodsClass like ? order by salesNum desc"; List goodsList = null; condition = "%" + condition + "%"; List paramenter = new ArrayList(); paramenter.add(condition); paramenter.add(condition); try { goodsList = BaseDao.operQuery(sql, paramenter, Goods.class); } catch (Exception e) { e.printStackTrace(); } return goodsList; } public List getGoodsList() { String USERNAME = "root"; String PASSWORD = "123123"; String URL = "jdbc:mysql://127.0.0.1:3306/online_shop?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true"; Connection conn = null; PreparedStatement pste = null; ResultSet executeQuery = null; List list = new ArrayList(); String sql = "select * from t_goods order by salesNum desc limit 4"; try { conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); pste = conn.prepareStatement(sql); executeQuery = pste.executeQuery(); while (executeQuery.next()) { Goods goods = new Goods(); goods.setGoodsId(executeQuery.getString("goodsId")); goods.setGoodsName(executeQuery.getString("goodsName")); goods.setGoodsImg(executeQuery.getString("goodsImg")); goods.setGoodsPrice(executeQuery.getBigDecimal("goodsPrice")); goods.setGoodsNum(executeQuery.getInt("goodsNum")); goods.setSalesNum(executeQuery.getInt("salesNum")); goods.setGoodsSize(executeQuery.getString("goodsSize")); goods.setGoodsFrom(executeQuery.getString("goodsFrom")); goods.setGoodsTime(executeQuery.getString("goodsTime")); goods.setGoodsSaveCondition(executeQuery.getString("goodsSaveCondition")); goods.setGoodsDescribe(executeQuery.getString("goodsDescribe")); goods.setGoodsExplain(executeQuery.getString("goodsExplain")); goods.setGoodsClass(executeQuery.getString("goodsClass")); goods.setGoodsDiscount(executeQuery.getBigDecimal("goodsDiscount")); goods.setDiscountStartTime(executeQuery.getDate("discountStartTime")); goods.setDiscountEndTime(executeQuery.getDate("discountEndTime")); list.add(goods); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (executeQuery != null) executeQuery.close(); if (pste != null) pste.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } return list; } }
四、购物车列表
本关任务
网上看中的商品,暂时不买,还需要保存起来,这个需要通过购物车来实现。本关需要从session
里获取属性名为user
的User
对象,并借助JDBC
,通过表t_cart
、t_goods
获取用户购物车的商品内容,并展示到页面。
为了完成本关任务,需要了解:
-
JDBC
查询方法封装; -
购物车相关信息介绍。
JDBC查询方法封装
为了方便JDBC
操作,平台对JDBC
查询方法进行了封装,封装类com.educoder.dao.impl.BaseDao
。
public static List operQuery(String sql, List p, Class cls) throws Exception { Connection conn = null; PreparedStatement pste = null; ResultSet rs = null; List list = new ArrayList(); conn = getConn(); try { pste = conn.prepareStatement(sql); if (p != null) { for (int i = 0; i < p.size(); i++) { pste.setObject(i + 1, p.get(i)); } } rs = pste.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); while (rs.next()) { T entity = cls.newInstance(); for (int j = 0; j < rsmd.getColumnCount(); j++) { String col_name = rsmd.getColumnName(j + 1); Object value = rs.getObject(col_name); Field field = cls.getDeclaredField(col_name); field.setAccessible(true); field.set(entity, value); } list.add(entity); } } catch (SQLException e) { e.printStackTrace(); } finally { releaseAll(rs, pste, conn); } return list; }
例如,第一关可以使用如下方法,获取商品列表:
String sql = "select * from t_goods order by salesNum desc limit 4";
List
goodsList = null; try {
goodsList = BaseDao.operQuery(sql, null, Goods.class);
} catch (Exception e) {
e.printStackTrace();
}
购物车相关信息介绍
MYSQL用户名 | MYSQL密码 | 驱动 | URL |
---|---|---|---|
root | 123123 | com.mysql.jdbc.Driver | jdbc:mysql://127.0.0.1:3306/online_shop?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true |
com.educoder.entity.Goods
字段及方法;
字段 | 描述 | 类型 | get方法 | set方法 |
---|---|---|---|---|
goodsId | 商品Id | String | getGoodsId() | setGoodsId(String goodsId) |
goodsName | 商品名 | String | getGoodsName() | setGoodsName(String goodsName) |
goodsImg | 展示于主页的图 | String | getGoodsImg() | setGoodsImg(String goodsImg) |
goodsPrice | 价格 | BigDecimal | getGoodsPrice() | setGoodsPrice(BigDecimal goodsPrice) |
goodsNum | 库存数量 | Integer | getGoodsNum() | setGoodsNum(Integer goodsNum) |
salesNum | 销售数量 | Integer | getSalesNum() | setSalesNum(Integer salesNum) |
goodsSize | 商品规格 | String | getGoodsSize() | setGoodsSize(String goodsSize) |
goodsFrom | 商品产地 | String | getGoodsFrom() | setGoodsFrom(String goodsFrom) |
goodsTime | 保质期 | String | getGoodsTime() | setGoodsTime(String goodsTime) |
goodsSaveCondition | 存储条件 | String | getGoodsSaveCondition() | setGoodsSaveCondition(String goodsSaveCondition) |
goodsDescribe | 商品描述介绍 | String | getGoodsDescribe() | setGoodsDescribe(String goodsDescribe) |
goodsExplain | 对商品简短说明 | String | getGoodsExplain() | setGoodsExplain(String goodsExplain) |
goodsClass | 所属类别 | String | getGoodsClass() | setGoodsClass(String goodsClass) |
goodsDiscount | 折扣 | BigDecimal | getGoodsDiscount() | setGoodsDiscount(BigDecimal goodsDiscount) |
discountStartTime | 优惠起始时间 | Date | getDiscountStartTime() | setDiscountStartTime(Date discountStartTime) |
discountEndTime | 优惠截止时间 | Date | getDiscountEndTime() | setDiscountEndTime(Date discountEndTime) |
注意:
Cart
类冗余信息是通过和t_goods
表关联查询出来的,不是存在下面的t_cart
表里。
表和类对应表;
库名 | 表名 | 类名 |
---|---|---|
online_shop | t_cart | Cart |
注意:类字段和对应的表字段名称一致,这里不再重复列出了。
页面初始效果图:
最终页面效果图:
编程要求
根据提示,在右侧编辑器补充getGoodsByUserId
方法代码,并返回Cart
列表。
注意:后续关卡都是需要从
request
获取用户信息,从而获得userId
。在本关卡获取成功后,后续关卡默认已经获取到userId
,并当成接口参数传入,不再需要重复获取。
测试说明
平台会对你编写的代码进行测试:
预期输出:
[{"addTime":1543505629000,"buyNum":1,"cartId":101,"goodsClass":"甜品","goodsDescribe":"酸甜清爽\r\n回味无穷","goodsExplain":"卡福洛芒果泥","goodsFrom":"上海","goodsId":"list3","goodsImg":"list_3-1.jpg","goodsName":"芒果熔岩星球蛋糕 Mango Planet","goodsNum":1994,"goodsPrice":118.00,"goodsSaveCondition":"冷藏0~4摄氏度","goodsSize":"约680g","goodsTime":"2天","salesNum":42,"userId":"123456"},{"addTime":1543505631000,"buyNum":1,"cartId":102,"discountEndTime":1499184679000,"discountStartTime":1498923465000,"goodsClass":"甜品","goodsDescribe":"芝士与香草戚风被雪域奶油的浪漫笼罩\r\n每一口都充满快乐的滋味","goodsDiscount":0.75,"goodsExplain":"选用进口白巧克力","goodsFrom":"上海","goodsId":"list6","goodsImg":"list_6-1.jpg","goodsName":"美刀刀蛋糕 Ms. Golden","goodsNum":3000,"goodsPrice":99.00,"goodsSaveCondition":"冷藏0~4摄氏度","goodsSize":"约700g","goodsTime":"3天","salesNum":5,"userId":"123456"}]
实现代码
package com.educoder.service.impl; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.servlet.http.HttpServletRequest; import com.educoder.dao.impl.BaseDao; import com.educoder.entity.Cart; import com.educoder.entity.User; import com.educoder.service.CartService; public class CartServiceImpl implements CartService { // 查询购物车列表 public List getGoodsByUserId(HttpServletRequest request) { User user = (User)request.getSession().getAttribute("user"); String userId = user.getUserId(); String sql = "select * from t_cart as a, t_goods as b where a.goodsId = b.goodsId and a.userId = ?"; List cartList = null; List parameters = new ArrayList(); parameters.add(userId); try { cartList = BaseDao.operQuery(sql, parameters, Cart.class); } catch (Exception e) { e.printStackTrace(); } return cartList; } // 购物车操作接口 @Override public void doCartHandle(String userId, String goodsId, String buyNum, String oper) { String deletesql = "delete from t_cart where userId=? and goodsId=?"; String querysql = "select * from t_cart where userId = ? and goodsId = ?"; String updatesql = "update t_cart set buyNum=? where userId=? and goodsId=?"; String addsql = "insert into t_cart(userId, goodsId, buyNum, addTime) values(?, ?, ?, ?)"; List parameters = new ArrayList(); //删除 if(buyNum == null) { parameters.add(userId); parameters.add(goodsId); BaseDao.operUpdate(deletesql, parameters); } else{ //进行修改和添加 List goodsList = null; parameters.add(userId); parameters.add(goodsId); try { goodsList = BaseDao.operQuery(querysql, parameters, Cart.class); parameters.clear(); } catch (Exception e) { e.printStackTrace(); } //进行添加 if(goodsList.isEmpty()) { parameters.add(userId); parameters.add(goodsId); parameters.add(buyNum); parameters.add(new Date()); BaseDao.operUpdate(addsql, parameters); } else { //进行修改 if(oper != null) { buyNum += goodsList.get(0).getBuyNum(); parameters.add(buyNum); parameters.add(userId); parameters.add(goodsId); BaseDao.operUpdate(updatesql, parameters); } } } } }
五、购物车操作
本关任务
为了能进行购物车的修改、添加、删除操作,本关需要借助JDBC
,对数据库表t_cart
、t_goods
表进行操作。
为了完成本关任务,需要了解:
-
JDBC
更新方法封装; -
购物车相关信息介绍。
JDBC查询方法封装
为了方便JDBC
操作,平台进行的JDBC
更新方法进行了封装,封装类com.educoder.dao.impl.BaseDao
。
public static boolean operUpdate(String sql, List p) { Connection conn = null; PreparedStatement pste = null; int res = 0; conn = getConn(); try { pste = conn.prepareStatement(sql); if (p != null) { for (int i = 0; i < p.size(); i++) { pste.setObject(i + 1, p.get(i)); } } res = pste.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { releaseAll(null, pste, conn); } return res > 0;// }
购物车相关信息介绍
MYSQL用户名 | MYSQL密码 | 驱动 | URL |
---|---|---|---|
root | 123123 | com.mysql.jdbc.Driver | jdbc:mysql://127.0.0.1:3306/online_shop?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true |
com.educoder.entity.Goods
字段及方法;
字段 | 描述 | 类型 | get方法 | set方法 |
---|---|---|---|---|
goodsId | 商品Id | String | getGoodsId() | setGoodsId(String goodsId) |
goodsName | 商品名 | String | getGoodsName() | setGoodsName(String goodsName) |
goodsImg | 展示于主页的图 | String | getGoodsImg() | setGoodsImg(String goodsImg) |
goodsPrice | 价格 | BigDecimal | getGoodsPrice() | setGoodsPrice(BigDecimal goodsPrice) |
goodsNum | 库存数量 | Integer | getGoodsNum() | setGoodsNum(Integer goodsNum) |
salesNum | 销售数量 | Integer | getSalesNum() | setSalesNum(Integer salesNum) |
goodsSize | 商品规格 | String | getGoodsSize() | setGoodsSize(String goodsSize) |
goodsFrom | 商品产地 | String | getGoodsFrom() | setGoodsFrom(String goodsFrom) |
goodsTime | 保质期 | String | getGoodsTime() | setGoodsTime(String goodsTime) |
goodsSaveCondition | 存储条件 | String | getGoodsSaveCondition() | setGoodsSaveCondition(String goodsSaveCondition) |
goodsDescribe | 商品描述介绍 | String | getGoodsDescribe() | setGoodsDescribe(String goodsDescribe) |
goodsExplain | 对商品简短说明 | String | getGoodsExplain() | setGoodsExplain(String goodsExplain) |
goodsClass | 所属类别 | String | getGoodsClass() | setGoodsClass(String goodsClass) |
goodsDiscount | 折扣 | BigDecimal | getGoodsDiscount() | setGoodsDiscount(BigDecimal goodsDiscount) |
discountStartTime | 优惠起始时间 | Date | getDiscountStartTime() | setDiscountStartTime(Date discountStartTime) |
discountEndTime | 优惠截止时间 | Date | getDiscountEndTime() | setDiscountEndTime(Date discountEndTime) |
注意:
Cart
类冗余信息是需要通过和t_goods
表关联查询出来的,不会存在下面的t_cart
表里。
表和类对应表;
库名 | 表名 | 类名 |
---|---|---|
online_shop | t_cart | Cart |
注意:类字段和对应的表字段名称一致,这里不再重复列出了。
编程要求
根据提示,在右侧编辑器补充doCartHandle
方法代码。
接口请求参数说明:
-
userId
用户Id
; -
goodsId
商品Id
; -
buyNum
添加或修改数量,当为null
,表示删除; -
oper
如果存在,添加buyNum
;如果不存在,修改为buyNum
。
测试输入:123456 list2 1 2
预期输出:插入成功 userId:123456 goodsId:list2 buyNum:1 oper:2
实现代码
package com.educoder.service.impl; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.servlet.http.HttpServletRequest; import com.educoder.dao.impl.BaseDao; import com.educoder.entity.Cart; import com.educoder.entity.User; import com.educoder.service.CartService; public class CartServiceImpl implements CartService { // 查询购物车列表 public List getGoodsByUserId(HttpServletRequest request) { User user = (User)request.getSession().getAttribute("user"); String userId = user.getUserId(); String sql = "select * from t_cart as a, t_goods as b where a.goodsId = b.goodsId and a.userId = ?"; List cartList = null; List parameters = new ArrayList(); parameters.add(userId); try { cartList = BaseDao.operQuery(sql, parameters, Cart.class); } catch (Exception e) { e.printStackTrace(); } return cartList; } // 购物车操作接口 @Override public void doCartHandle(String userId, String goodsId, String buyNum, String oper) { String deletesql = "delete from t_cart where userId=? and goodsId=?"; String querysql = "select * from t_cart where userId = ? and goodsId = ?"; String updatesql = "update t_cart set buyNum=? where userId=? and goodsId=?"; String addsql = "insert into t_cart(userId, goodsId, buyNum, addTime) values(?, ?, ?, ?)"; List parameters = new ArrayList(); //删除 if(buyNum == null) { parameters.add(userId); parameters.add(goodsId); BaseDao.operUpdate(deletesql, parameters); } else{ //进行修改和添加 List goodsList = null; parameters.add(userId); parameters.add(goodsId); try { goodsList = BaseDao.operQuery(querysql, parameters, Cart.class); parameters.clear(); } catch (Exception e) { e.printStackTrace(); } //进行添加 if(goodsList.isEmpty()) { parameters.add(userId); parameters.add(goodsId); parameters.add(buyNum); parameters.add(new Date()); BaseDao.operUpdate(addsql, parameters); } else { //进行修改 if(oper != null) { buyNum += goodsList.get(0).getBuyNum(); parameters.add(buyNum); parameters.add(userId); parameters.add(goodsId); BaseDao.operUpdate(updatesql, parameters); } } } } }
六、下单
本关任务
上一关已经完成了购物车操作功能开发,现在我们就可以编写下单接口进行购买商品了,本关需要借助JDBC
,在t_order
、t_order_child
表中存储用户订单信息。
下单相关信息介绍;
MYSQL用户名 | MYSQL密码 | 驱动 | URL |
---|---|---|---|
root | 123123 | com.mysql.jdbc.Driver | jdbc:mysql://127.0.0.1:3306/online_shop?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true |
com.educoder.entity.Order
字段及方法;
字段 | 描述 | 类型 | get方法 | set方法 |
---|---|---|---|---|
orderId | 订单编号 | String | getOrderId() | setOrderId(String orderId) |
userId | 用户Id | String | getUserId() | setUserId(String userId) |
orderTime | 订单时间 | Date | getOrderTime() | setOrderTime(Date orderTime) |
addressId | 订单地址 | String | getAddressId() | setAddressId()(String addressId) |
com.educoder.entity.Order
冗余信息字段及方法;
字段 | 描述 | 类型 | get方法 | set方法 |
---|---|---|---|---|
goodsId | 商品Id | String | getGoodsId() | setGoodsId(String goodsId) |
goodsName | 商品名称 | String | getGoodsName() | setGoodsName(String goodsName) |
goodsImg | 商品图片 | String | getGoodsImg() | setGoodsImg(String goodsImg) |
goodsPrice | 下单价格 | BigDecimal | getGoodsPrice() | setGoodsPrice(BigDecimal goodsPrice) |
注意:
Order
类冗余信息是需要通过关联查询出来的,不会存在下面的t_order
表里。
com.educoder.entity.OrderChildTable
字段及方法;
字段 | 描述 | 类型 | get方法 | set方法 |
---|---|---|---|---|
id | 订单商品主键 | Integer | getId() | setId(Integer id) |
orderId | 订单Id | String | getOrderId() | setOrderId(String orderId) |
goodsId | 商品Id | String | getGoodsId() | setGoodsId(String goodsId) |
buyNum | 购买数量 | Integer | getBuyNum() | setBuyNum()(Integer buyNum) |
表和类对应表;
库名 | 表名 | 类名 |
---|---|---|
online_shop | t_order | Order |
online_shop | t_order_child | OrderChildTable |
注意:类字段和对应的表字段名称一致,这里不再重复列出了。
编程要求
在右侧编辑器补充submitOrder
方法代码,并返回Order
类。
接口请求参数说明:
-
userId
用户Id
; -
addressId
地址Id
; -
goodsBuyNum
数组,购物车选中的商品数量; -
chooseGoodId
数组,购物车选中的商品Id
。
逻辑说明:
-
下单时
orderId
需要唯一,可以使用UUID
; -
表分为
t_order
订单表和t_order_child
订单子表,因为下单商品有可能多个; -
在下单时,需要调用上一关的购物车操作接口,进行购物车数据清空。
测试输入:123456 d01e153c-fc1f-4326-9956-cbf9582a9df7 1,1 list3,list6
预期输出:
清空购物车成功订单存储信息: userId:123456 addressId:d01e153c-fc1f-4326-9956-cbf9582a9df7订单商品存储信息:[{"buyNum":1,"goodsId":"list3","id":53},{"buyNum":1,"goodsId":"list6","id":54}]
实现代码
package com.educoder.service.impl;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.UUID;import com.educoder.dao.impl.BaseDao;import com.educoder.entity.Order;import com.educoder.service.OrderService;public class OrderServiceImpl implements OrderService { private CartServiceImpl catService = new CartServiceImpl(); // 下单 public Order submitOrder(String userId, String addressId, String[] goodsBuyNum, String[] chooseGoodId) { Order order = new Order(); String ordersql = "insert into t_order(orderId, userId, orderTime, addressId) values(?, ?, ?, ?)"; String child_order_sql = "insert into t_order_child (orderId, goodsId, buyNum) values( ?, ?, ?) "; String orderId = UUID.randomUUID().toString(); List parameters = new ArrayList(); parameters.add(orderId); parameters.add(userId); parameters.add(new Date()); parameters.add(addressId); BaseDao.operUpdate(ordersql, parameters); for(int n = 0 ; n < chooseGoodId.length; n++) { parameters.clear(); parameters.add(orderId); parameters.add(chooseGoodId[n]); parameters.add(goodsBuyNum[n]); BaseDao.operUpdate(child_order_sql, parameters); //下单后,需要清空购物车 catService.doCartHandle(userId, chooseGoodId[n], null, null); } //返回带有订单id的订单 order.setOrderId(orderId); return order; } // 订单查询 public List getOrderByUserId(String userId) { String sql = "select A.orderId, A.userId, B.userName, A.orderTime, C.address, E.goodsId, E.goodsName, D.buyNum, E.goodsPrice from " + "t_order as A, t_user as B, t_address as C, t_order_child as D, t_goods as E " + "where A.userId=? and A.orderId=D.orderId and A.userId=B.userId and A.addressId=C.addressId and D.goodsId=E.goodsId " + "order by orderTime desc"; List parameters = new ArrayList(); parameters.add(userId); List orderList = null; try { orderList = BaseDao.operQuery(sql, parameters, Order.class); } catch (Exception e) { e.printStackTrace(); } return orderList; }}
七、订单查询
本关任务
上一关已经完成下单接口,本关需要完成查询订单列表,本关需要借助JDBC
从t_order
、t_user
、t_address
、t_order_child
表中查询订单信息。
订单查询相关信息介绍;
MYSQL用户名 | MYSQL密码 | 驱动 | URL |
---|---|---|---|
root | 123123 | com.mysql.jdbc.Driver | jdbc:mysql://127.0.0.1:3306/online_shop?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true |
com.educoder.entity.Order
字段及方法;
字段 | 描述 | 类型 | get方法 | set方法 |
---|---|---|---|---|
orderId | 订单编号 | String | getOrderId() | setOrderId(String orderId) |
userId | 用户Id | String | getUserId() | setUserId(String userId) |
orderTime | 订单时间 | Date | getOrderTime() | setOrderTime(Date orderTime) |
addressId | 订单地址 | String | getAddressId() | setAddressId()(String addressId) |
com.educoder.entity.Order
冗余信息字段及方法;
字段 | 描述 | 类型 | get方法 | set方法 |
---|---|---|---|---|
goodsId | 商品Id | String | getGoodsId() | setGoodsId(String goodsId) |
goodsName | 商品名称 | String | getGoodsName() | setGoodsName(String goodsName) |
goodsImg | 商品图片 | String | getGoodsImg() | setGoodsImg(String goodsImg) |
goodsPrice | 下单价格 | BigDecimal | getGoodsPrice | setGoodsPrice(BigDecimal goodsPrice) |
注意:
Order
类冗余信息是需要通过关联查询出来的,不会存在下面的t_order
表里。
com.educoder.entity.OrderChildTable
字段及方法;
字段 | 描述 | 类型 | get方法 | set方法 |
---|---|---|---|---|
id | 订单商品主键 | Integer | getId() | setId(Integer id) |
orderId | 订单Id | String | getOrderId() | setOrderId(String orderId) |
goodsId | 商品Id | String | getGoodsId() | setGoodsId(String goodsId) |
buyNum | 购买数量 | Integer | getBuyNum() | setBuyNum()(Integer buyNum) |
com.educoder.entity.Address
字段及方法;
字段 | 描述 | 类型 | get方法 | set方法 |
---|---|---|---|---|
addressId | 地址Id | String | getAddressId() | setAddressId(String addressId) |
userId | 用户Id | String | getUserId() | setUserId(String userId) |
userName | 收货姓名 | String | getUserName() | setUserName(String userName) |
userTel | 收货电话 | String | getUserTel() | setUserTel()(String addressId) |
address | 收货地址 | String | getAddress() | setAddress()(String addressId) |
表和类对应表;
库名 | 表名 | 类名 |
---|---|---|
online_shop | t_order | Order |
online_shop | t_order_child | OrderChildTable |
online_shop | t_address | Address |
注意:类字段和对应的表字段名称一致,这里不再重复列出了。
页面初始效果图:
最终页面效果图:
编程要求
在右侧编辑器补充getOrderByUserId
方法代码,并返回Goods
列表。
接口请求参数说明:
userId
用户Id
。
测试说明
测试输入:123456
预期输出:
[{"address":"测试地址","buyNum":1,"goodsId":"list1","goodsName":"雪域牛乳芝士","goodsPrice":98.00,"orderId":"ab25ca41-2230-4af1-81f7-6cfe8872d6b0","orderTime":1543220250000,"userId":"123456","userName":"test"},{“address":"测试地址","buyNum":1,"goodsId":"list2","goodsName":"哈!蜜瓜蛋糕 Hey Melon","goodsPrice":99.00,"orderId":"ab25ca41-2230-4af1-81f7-6cfe8872d6b0","orderTime":1543220250000,"userId":"123456","userName":"test"}]
实现代码
package com.educoder.service.impl;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.UUID;import com.educoder.dao.impl.BaseDao;import com.educoder.entity.Order;import com.educoder.service.OrderService;public class OrderServiceImpl implements OrderService { private CartServiceImpl catService = new CartServiceImpl(); // 下单 public Order submitOrder(String userId, String addressId, String[] goodsBuyNum, String[] chooseGoodId) { Order order = new Order(); String ordersql = "insert into t_order(orderId, userId, orderTime, addressId) values(?, ?, ?, ?)"; String child_order_sql = "insert into t_order_child (orderId, goodsId, buyNum) values( ?, ?, ?) "; String orderId = UUID.randomUUID().toString(); List parameters = new ArrayList(); parameters.add(orderId); parameters.add(userId); parameters.add(new Date()); parameters.add(addressId); BaseDao.operUpdate(ordersql, parameters); for(int n = 0 ; n < chooseGoodId.length; n++) { parameters.clear(); parameters.add(orderId); parameters.add(chooseGoodId[n]); parameters.add(goodsBuyNum[n]); BaseDao.operUpdate(child_order_sql, parameters); //下单后,需要清空购物车 catService.doCartHandle(userId, chooseGoodId[n], null, null); } //返回带有订单id的订单 order.setOrderId(orderId); return order; } // 订单查询 public List getOrderByUserId(String userId) { String sql = "select A.orderId, A.userId, B.userName, A.orderTime, C.address, E.goodsId, E.goodsName, D.buyNum, E.goodsPrice from " + "t_order as A, t_user as B, t_address as C, t_order_child as D, t_goods as E " + "where A.userId=? and A.orderId=D.orderId and A.userId=B.userId and A.addressId=C.addressId and D.goodsId=E.goodsId " + "order by orderTime desc"; List parameters = new ArrayList(); parameters.add(userId); List orderList = null; try { orderList = BaseDao.operQuery(sql, parameters, Order.class); } catch (Exception e) { e.printStackTrace(); } return orderList; }}
来源地址:https://blog.csdn.net/zhou2622/article/details/130442497