複習電商筆記-18-商品描述程式碼實現和級聯刪除
阿新 • • 發佈:2018-11-17
*MySQL獲取剛插入的自增長id的值
INSERT INTO TB_USER (id,username) VALUE(NULL,'a');
SELECT LAST_INSERT_ID(); #內部加鎖實現,所以不會有併發的執行緒安全問題
新增
ItemDesc.java
package com.jt.manage.pojo; import javax.persistence.Column; import javax.persistence.Id; import javax.persistence.Table; @Table(name = "tb_item_desc") public class ItemDesc extends BasePojo{ @Id @Column(name = "item_id") private Long itemId; @Column(name = "item_desc") private String itemDesc; public Long getItemId() { return itemId; } public void setItemId(Long itemId) { this.itemId = itemId; } public String getItemDesc() { return itemDesc; } public void setItemDesc(String itemDesc) { this.itemDesc = itemDesc; } }
ItemDescMapper.java
package com.jt.manage.mapper;
import com.jt.manage.mapper.base.mapper.SysMapper;
import com.jt.manage.pojo.ItemDesc;
public interface ItemDescMapper extends SysMapper<ItemDesc>{
}
ItemDescService.java
package com.jt.manage.service; import org.springframework.stereotype.Service; import com.jt.manage.pojo.ItemDesc; @Service public class ItemDescService extends BaseService<ItemDesc> { }
修改ItemController.java
package com.jt.manage.controller; import java.util.Date; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.jt.common.vo.SysResult; import com.jt.manage.pojo.Item; import com.jt.manage.service.ItemService; /** * 商品相關的業務邏輯處理 * */ @RequestMapping("item") @Controller public class ItemController { private static final Logger log = LoggerFactory.getLogger(ItemController.class); @Autowired private ItemService itemService; //@ Autowired //private ItemDescService itemDescService; /** * 新增商品資料 */ @RequestMapping(value = "save", method = RequestMethod.POST) @ResponseBody public SysResult saveItem(Item item, @RequestParam("desc") String desc, @RequestParam("itemParams") String itemParams) { item.setCreated(new Date()); item.setUpdated(item.getCreated()); item.setStatus(1); if (item.getId() != null) { log.warn("傳入的商品資料中包含id資料! id = {}", item.getId()); } item.setId(null); // 安全方面考慮,強制設定id為null log.info("新增商品資料! title = {}, cid = {}", item.getTitle(), item.getCid()); // 儲存到資料庫 try { this.itemService.saveItem(item, desc); } catch (Exception e) { log.error("儲存失敗! title = " + item.getTitle(), e); // 返回錯誤狀態 return SysResult.build(500, "新增商品資料失敗!"); } if (log.isDebugEnabled()) {// 判斷debug是否啟用 log.debug("商品新增成功! item = " + item); } return SysResult.ok(); } }
注意:
1)分表設計:縱向拆分,將大欄位單獨分表,這樣充分保障主表的查詢效率。
2)兩個事務重構到一個事務中。將儲存商品資訊和商品的描述資訊兩個儲存事務放到一個Service的方法中,從而變成一個事務。
3)事務巢狀:在ItemService中注入ItemDescService,利用Spring事務的傳遞,來保證它們使用一個事務。
修改
$.getJSON('/item/query/item/desc/'+data.id,function(_data){
if(_data.status == 200){
//UM.getEditor('itemeEditDescEditor').setContent(_data.data.itemDesc, false);
itemEditEditor.html(_data.data.itemDesc);
}
});
在ItemController中增加查詢方法:
@RequestMapping(value = "query/item/desc/{itemId}", method = RequestMethod.GET)
@ResponseBody
public SysResult queryItemDescByItemId(@PathVariable("itemId") Long itemId) {
ItemDesc itemDesc = this.itemDescService.queryById(itemId);
return SysResult.ok(itemDesc);
}
級聯刪除
mybatis是基於SQL的,無法按物件實現級聯刪除,只能自己手動去解決。
public void deleteItem(Long[] ids){
//先刪除從表,再刪除主表;主外來鍵一致呼叫更加方便
itemDescMapper.deleteByIDS(ids);
itemMapper.deleteByIDS(ids);
}
hibernate 級聯刪除,非常符合面向物件思想。
根本不考慮孫子之後關聯,只考慮上下級即可;
使用hibernate對映檔案,配置物件關聯關係,只配置上級和下級。而使用mybatis就演化出幾十種變化,而這種程式碼對業務絲毫沒有幫助,純手工勞動。從這裡可以看出兩個架構在設計層面,hibernate非常值得學習,但如果在專案中就效能而言,mybatis還是簡單快速。