商品创建
1.优先考虑对应的产品经理提出的需求,而不是先去创建数据库。先设计领域模型,想好对应的商品模型
建一个ItemModel.java
引入商品属性
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
public class ItemModel {
private Integer id;
//商品名称
@NotBlank(message = "商品名称不能为空")
private String title;
//商品价格
@NotNull(message = "商品价格不能为空")
@Min(value = 0,message = "商品价格必须大于0")
private BigDecimal price;
//商品库存(不多)
@NotNull(message = "库存不能不填")
private Integer stock;
//商品描述
@NotBlank(message = "商品描述信息不能为空")
private String description;
//商品销量
private Integer sales;
//商品描述的图片
@NotBlank(message = "商品图片信息不能为空")
private String imgUrl;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public Integer getStock() {
return stock;
}
public void setStock(Integer stock) {
this.stock = stock;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getSales() {
return sales;
}
public void setSales(Integer sales) {
this.sales = sales;
}
public String getImgUrl() {
return imgUrl;
}
public void setImgUrl(String imgUrl) {
this.imgUrl = imgUrl;
}
}
做数据库设计
库存 stock 和商品是一对一的关系 为了数据库性能设计考虑
库存表
使用mybatis-generator 生成所想要的Mapper和Dao文件以及data object对象
(1)在pom.xml中 将true改为false 不允许覆盖
(2)在mybatis-generator中添加表
<table tableName="item" domainObjectName="ItemDO"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false"></table>
<table tableName="item_stock" domainObjectName="ItemStockDO"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false"></table>
运行
⚠出现bug
mybatis-generator-maven-plugin 版本原来为1.3.5 换为 1.3.1后成功
奇怪的是 先前也是因为版本而报错 调试成功后 这次又报错
(3)在ItemDOMapper.xml进行修改
<insert id="insert" parameterType="com.miaoshaproject.dataobject.ItemDO" useGeneratedKeys="true" keyProperty="id">
<insert id="insertSelective" parameterType="com.miaoshaproject.dataobject.ItemDO" useGeneratedKeys="true" keyProperty="id">
(4)在ItemStockDOMapper.xml进行修改
<insert id="insert" parameterType="com.miaoshaproject.dataobject.ItemStockDO" useGeneratedKeys="true" keyProperty="id">
<insert id="insertSelective" parameterType="com.miaoshaproject.dataobject.ItemStockDO" useGeneratedKeys="true" keyProperty="id">
2.创建ItemService接口
import com.miaoshaproject.service.model.ItemModel;
import java.util.List;
public interface ItemService {
//创建商品
ItemModel creatItem(ItemModel itemModel);
//商品列表浏览
List<ItemModel> listItem();
//商品详情浏览
ItemModel getItemById(Integer id);
}
ItemServiceImpl实现类
import com.miaoshaproject.dao.ItemDOMapper;
import com.miaoshaproject.dao.ItemStockDOMapper;
import com.miaoshaproject.dataobject.ItemDO;
import com.miaoshaproject.dataobject.ItemStockDO;
import com.miaoshaproject.error.BusinessException;
import com.miaoshaproject.error.EmBusinessError;
import com.miaoshaproject.service.ItemService;
import com.miaoshaproject.service.model.ItemModel;
import com.miaoshaproject.validator.ValidationResult;
import com.miaoshaproject.validator.ValidatorImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.List;
@Service
public class ItemServiceImpl implements ItemService {
@Autowired
private ValidatorImpl validator;
@Autowired(required = false)
private ItemDOMapper itemDOMapper;
@Autowired(required = false)
private ItemStockDOMapper itemStockDOMapper;
private ItemDO convertItemDOFromItemModel(ItemModel itemModel){
if(itemModel == null){
return null;
}
ItemDO itemDO = new ItemDO();
BeanUtils.copyProperties(itemModel,itemDO);
//手动设置price类型
itemDO.setPrice(itemModel.getPrice().doubleValue());
return itemDO;
}
private ItemStockDO convertItemStockDOFromItemModel(ItemModel itemModel){
if(itemModel == null){
return null;
}
ItemStockDO itemStockDO = new ItemStockDO();
itemStockDO.setItemId(itemModel.getId());
itemStockDO.setStock(itemModel.getStock());
return itemStockDO;
}
@Override
@Transactional//在同一个事务当中
public ItemModel createItem(ItemModel itemModel) throws BusinessException {
//创建item信息
//入户前的校验入参
ValidationResult result=validator.validate(itemModel);
if(result.isHasErrors()){
throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,result.getErrMsg());
}
//转化itemmodel->dataobject
ItemDO itemDO=this.convertItemDOFromItemModel(itemModel);
//写入数据库
//创建了一个item对象 并且成功入库
itemDOMapper.insertSelective(itemDO);
itemModel.setId(itemDO.getId());
ItemStockDO itemStockDO=this.convertItemStockDOFromItemModel(itemModel);
itemStockDOMapper.insertSelective(itemStockDO);
//返回创建完成的对象
return this.getItemById(itemModel.getId());
}
@Override
public List<ItemModel> listItem() {
return null;
}
@Override
public ItemModel getItemById(Integer id) {
ItemDO itemDO = itemDOMapper.selectByPrimaryKey(id);
if(itemDO == null){
return null;
}
//操作获得库存数量
ItemStockDO itemStockDO=itemStockDOMapper.selectByItemId(itemDO.getId());
//将dataobject->model
ItemModel itemModel =convertModelFromDataObject(itemDO,itemStockDO);
return itemModel;
}
private ItemModel convertModelFromDataObject(ItemDO itemDO,ItemStockDO itemStockDO){
ItemModel itemModel = new ItemModel();
BeanUtils.copyProperties(itemDO,itemModel);
itemModel.setPrice(new BigDecimal(itemDO.getPrice()));
itemModel.setStock(itemStockDO.getStock());
return itemModel;
}
}
在ItemStockDOMapper.xml 中 添加 selectByItemId方法
<select id="selectByItemId" parameterType="java.lang.Integer" resultMap="BaseResultMap">
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Sat Feb 11 11:35:13 CST 2023.
-->
select
<include refid="Base_Column_List" />
from item_stock
where item_id = #{itemId,jdbcType=INTEGER}
</select>
在 ItemStockDOMapper接口中声明方法
⚠在ItemServiceImpl实现类中使用selectByItemId 一直划红线 原因是没有在此接口中声明
ItemStockDO selectByItemId(Integer itemId);
3.前端界面
createitem.html
<html>
<head>
<meta charset="UTF-8">
<link href="static/assets/global/plugins/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css"/>
<link href="static/assets/global/css/components.css" rel="stylesheet" type="text/css"/>
<link href="static/assets/admin/pages/css/login.css" rel="stylesheet" type="text/css"/>
<script src="static/assets/global/plugins/jquery-1.11.0.min.js" type="text/javascript"></script>
<title>Title</title>
</head>
<body class="login">
<div class="content">
<h3 class="form-title">创建商品</h3>
<div class="form-group">
<label class="control-label">商品名</label>
<div>
<input class="form-control" type="text" name="title" id="title"/>
</div>
</div>
<div class="form-group">
<label class="control-label">商品描述</label>
<div>
<input class="form-control" type="text" name="description" id="description"/>
</div>
</div>
<div class="form-group">
<label class="control-label">价格</label>
<div>
<input class="form-control" type="text" name="price" id="price"/>
</div>
</div>
<div class="form-group">
<label class="control-label">图片</label>
<div>
<input class="form-control" type="text" name="imgUrl" id="imgUrl"/>
</div>
</div>
<div class="form-group">
<label class="control-label">库存</label>
<div>
<input class="form-control" type="text" name="stock" id="stock"/>
</div>
</div>
<div class="form-actions">
<button class="btn blue" id="create" type="submit">
提交创建
</button>
</div>
</div>
</body>
<script>
jQuery(document).ready(function () {
//绑定register按钮的click事件
$("#create").on("click",function () {
var title=$("#title").val();
var description=$("#description").val();
var price=$("#price").val();
var imgUrl=$("#imgUrl").val();
var stock=$("#stock").val();
if (title==null || title=="") {
alert("商品名不能为空");
return false;
}
if (description==null || description=="") {
alert("商品描述不能为空");
return false;
}
if (price==null || price=="") {
alert("价格不能为空");
return false;
}
if (imgUrl==null || imgUrl=="") {
alert("图片不能为空");
return false;
}
if (stock==null || stock=="") {
alert("库存不能为空");
return false;
}
//映射到后端/create
$.ajax({
type:"POST",
contentType:"application/x-www-form-urlencoded",
url:"http://localhost:8090/item/create",
data:{
"title":title,
"description":description,
"price":price,
"imgUrl":imgUrl,
"stock":stock
},
//允许跨域请求
xhrFields:{withCredentials:true},
success:function (data) {
if (data.status=="success") {
alert("创建成功");
}else {
alert("创建失败,原因为" + data.data.errMsg);
}
},
error:function (data) {
alert("创建失败,原因为"+data.responseText);
}
});
return false;
});
});
</script>
</html>
运行后报错
解决: 异常:java.lang.IllegalArgumentException: Result Maps collection already contains value_KyrieCao的博客-CSDN博客UserDOMapper.xml 和UserPasswordDOMapper.xml出现同样的BaseResultMap
结果是失败
无论是本地还是we打开都是失败
不会解决