校园商铺-4店铺注册功能模块-1Dao层之新增店铺
1. 系统功能开发的优先级。
项目共有3个系统,前端展示系统,店家管理系统,超级管理员管理系统。
店家的优先级是最高的,因为最有可能带来收益的是店家,而且一旦店家系统开发出来,店家往系统里填写商品信息、前端展示系统才有展示的数据源。
超级管理员系统可以用手工录入的方式来代替,优先级是最低。
分析之后,开发的优先级从高到低依次为店铺管理、前端展示、超级管理员系统。
2. 项目1.0-店家管理系统开发
店家可以通过店家管理系统来管理店铺信息
- 店铺
- 商品
2.1 店铺注册从底层到前端开发
学习目标:
- 连接数据库
- Mybatis数据库表映射关系配置
永远不会改变的配置:driver(那种类型的数据库)、数据库的地址、用户名、密码、连接池最大的线程数 - dao->service->controller层代码的编写,Junit的使用
- Session,图片处理工具Thumbnailator的使用
- suimobile前端设计与开发
2.2 创建Dao接口
package com.csj2018.o2o.dao;
import com.csj2018.o2o.entity.Shop;
public interface ShopDao {
/**
* 新增店铺
* @param shop
* @return 返回影响的行数;-1插入失败
*/
int insertShop(Shop shop);
}
2.3 myBatis配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org/DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<!-- useGeneratedKeys="true",一旦数据插入成功,使用JDBC的getGeneratedKeys获取数据库自增主键值 -->
<mapper namespace="com.csj2018.o2o.dao.ShopDao">
<insert id="insertShop" useGeneratedKeys="true"
keyColumn="shop_id" keyProperty="shopId">
insert into
tb_shop(ower_id,area_id,shop_category_id,shop_name,
shop_desc,shop_addr,phone,shop_img,priority,
create_time,last_edit_time,enable_status,advice)
values
(#{owner.userId}, #{area.areaId}, #{shopCategory.shopCategoryId}, #{shopName},
#{shopDesc}, #{shopAddr}, #{phone}, #{shopImg}, #{priority},
#{createTime}, #{lastEditTime}, #{enableStatus}, #{advice})
</insert>
</mapper>
useGeneratedKeys="true":一旦数据添加成功,我们就会通过jdbc来获取它的主键的值,然后将它插入到传入的实体类即shop对象中。
当我们添加店铺信息的时候,同时也需要存储店铺的图片,为了保证图片存储的合理性,我们需要将属于这个店铺的图片存储在这个店铺的目录下。这就导致了每个店铺拥有的名字是不相同的。我们需要依靠店铺的主键去区分店铺、名字,因此在存储图片的时候,需要获取店铺的id,也就是说一旦店铺添加完成,就需要记录返回它的店铺id。
疑问:店铺添加完成,再去数据库查询最新的id,不是一样吗?
解析:操作也是可以的,但有隐患:1.操作麻烦 2.如果多线程操作,其他的线程进行了同样的操作,返回的id就非想操作的id,造成乱序。
如果店铺完成不会有插入图片的需求,即不需要获取店铺的shopId,将useGeneratedKeys设置为false即可。
总之,设计一个系统要考虑它的灵活性
2.4 Junit测试
Shop.java还有3个类,Area,PersonInfo,ShopCategory,Area已有数据,其他两个还是空表,因此需要添加数据
insert into tb_person_info(`name`,`profile_img`,`email`,`gender`,`enable_status`,`user_type`)
values ('测试','test_person_png',"test@126.com",1,1,2);
insert into tb_shop_category(`shop_category_name`,`shop_category_desc`,`shop_category_img`,`priority`)
values('咖啡奶茶','飘香醇厚咖啡加上芳美浓郁的牛奶,两种经典饮品的绝妙搭配,两种滋味的碰撞,形成了具有双重口感享受的饮品!','test_shop_catetgory_png',1);
测试代码
package com.csj2018.o2o.dao;
import static org.junit.Assert.assertEquals;
import java.util.Date;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.csj2018.o2o.BaseTest;
import com.csj2018.o2o.entity.Area;
import com.csj2018.o2o.entity.PersonInfo;
import com.csj2018.o2o.entity.Shop;
import com.csj2018.o2o.entity.ShopCategory;
public class ShopDaoTest extends BaseTest{
@Autowired
private ShopDao shopDao;
@Test
public void testInsertShop() {
Shop shop = new Shop();
PersonInfo owner = new PersonInfo();
Area area = new Area();
ShopCategory shopCategory = new ShopCategory();
owner.setUserId(1L);
area.setAreaId(2);
shopCategory.setShopCategoryId(1L);
shop.setOwner(owner);
shop.setArea(area);
shop.setShopCategory(shopCategory);
shop.setShopName("测试de店铺");
shop.setShopDesc("店铺描述");
shop.setShopAddr("测试路1号");
shop.setPhone("123456789");
shop.setShopImg("shopimg");
shop.setCreateTime(new Date());
shop.setEnableStatus(1);
shop.setAdvice("审核中");
shop.setPriority(3);
int effectedNum = shopDao.insertShop(shop);
assertEquals(1,effectedNum);
}
}
3. 问题:一直执行失败,打印日志观察
日志给出的错误不明显,需要自己去捕捉异常
ShopDaoTest.java添加捕捉异常代码
try{
int effectedNum = shopDao.insertShop(shop);
assertEquals(1,effectedNum);
System.out.print(effectedNum);
}catch (Exception e) {
e.printStackTrace();
}
原来是自己的成员变量拼写错误,此处大骂自己三声猪头
Shop.java部分问题代码
```#java
private String adevice;
public String getAdevice() {
return advice;
}
public void setAdevice(String adevice) {
this.advice = adevice;
}
```