1. 程式人生 > >複習電商筆記-18-商品描述程式碼實現和級聯刪除

複習電商筆記-18-商品描述程式碼實現和級聯刪除

 

 

*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還是簡單快速。