64. 购物车-创建数据表
# 注意:没有添加相应的not null约束
CREATE TABLE t_cart (
cid INT AUTO_INCREMENT COMMENT '购物车数据id',
uid INT COMMENT '用户id',
pid INT COMMENT '商品id',
num INT COMMENT '商品数量',
price BIGINT(20) COMMENT '加入时商品价格(以便做促销,降价了有个差值)',
created_user VARCHAR(20) COMMENT '创建人',
created_time DATETIME COMMENT '创建时间',
modified_user VARCHAR(20) COMMENT '最后修改人',
modified_time DATETIME COMMENT '最后修改时间',
PRIMARY KEY (cid)
) DEFAULT CHARSET=utf8mb4;
65. 购物车-创建实体类
在cn.demo.store.entity
包中创建Cart
类:
/**
* 购物车数据的实体类
*/
public class Cart extends BaseEntity {
private static final long serialVersionUID = -9051846958681813039L;
private Integer cid;
private Integer uid;
private Integer pid;
private Integer num;
private Long price;
// 添加get,set...等方法
}
66. 购物车-加入购物车-持久层
(a) 规划需要的SQL语句
将商品添加到购物车,可能会产生新的购物车数据,也可能是将原有购物车数据中商品数量进行增加!可以判断该用户的购物车中有没有该商品:
select * from t_cart where uid=? and pid=?;
当该用户从来没有把该商品加入到购物车中时,需要插入新的购物车数据,在插入购物车数据时,需要执行的SQL语句大致是:
insert into t_cart (除了cid以外的字段列表) values (值列表);
当该用户的购物车中已经有该商品了,如果反复将该商品加入到购物车,应该只增加商品的数量,即修改原有数据的数量:
update t_cart set num=?, modified_user=?, modified_time=? where cid=?;
(b) 设计抽象方法
在cn.demo.store.mapper
中创建CartMapper
接口,并添加抽象方法:
/**
* 处理购物车数据的持久层接口
*/
public interface CartMapper {
/**
* 插入购物车数据
* @param cart 购物车数据
* @return 受影响的行数
*/
Integer insert(Cart cart);
/**
* 修改购物车中商品的数量
* @param cid 购物车数据id
* @param num 新的数量
* @param modifiedUser 最后修改人
* @param modifiedTime 最后修改时间
* @return 受影响的行数
*/
Integer updateNumByCid(
@Param("cid") Integer cid,
@Param("num") Integer num,
@Param("modifiedUser") String modifiedUser,
@Param("modifiedTime") Date modifiedTime
);
/**
* 查询某用户在购物车添加的某商品的详情
* @param uid 用户的id
* @param pid 商品的id
* @return 匹配的购物车详情,如果该用户没有将该商品添加到购物车,则返回null
*/
Cart findByUidAndPid(
@Param("uid") Integer uid,
@Param("pid") Integer pid
);
}
© 配置映射并测试
在src/main/resources/mappers/下创建CartMapper.xml文件,并配置映射:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="cn.tedu.store.mapper.CartMapper">
<!-- 插入购物车数据 -->
<!-- Integer insert(Cart cart) -->
<insert id="insert" useGeneratedKeys="true" keyProperty="cid">
INSERT INTO t_cart (
uid, pid, num, price,
created_user, created_time, modified_user, modified_time
) VALUES (
#{uid}, #{pid}, #{num}, #{price},
#{createdUser}, #{createdTime}, #{modifiedUser}, #{modifiedTime}
)
</insert>
<!-- 修改购物车中商品的数量 -->
<!-- Integer updateNumByCid(
@Param("cid") Integer cid,
@Param("num") Integer num,
@Param("modifiedUser") String modifiedUser,
@Param("modifiedTime") Date modifiedTime
); -->
<update id="updateNumByCid">
UPDATE
t_cart
SET
num=#{num},
modified_user=#{modifiedUser},
modified_time=#{modifiedTime}
WHERE
cid=#{cid}
</update>
<!-- 查询某用户在购物车添加的某商品的详情 -->
<!-- Cart findByUidAndPid(
@Param("uid") Integer uid,
@Param("pid") Integer pid
); -->
<select id="findByUidAndPid" resultType="cn.tedu.store.entity.Cart">
SELECT * FROM t_cart WHERE uid=#{uid} AND pid=#{pid}
</select>
</mapper>
在src/test/java的cn.demo.store.mapper
下创建CartMapperTests
测试类,编写并执行单元测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class CartMapperTests {
@Autowired
private CartMapper mapper;
@Test
public void insert() {
Cart cart = new Cart();
cart.setUid(1);
cart.setPid(2);
cart.setNum(3);
cart.setPrice(4L);
Integer rows = mapper.insert(cart);
System.err.println("rows=" + rows);
System.err.println(cart);
}
@Test
public void updateNumByCid() {
Integer cid = 1;
Integer num = 10;
String modifiedUser