复习电商笔记-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还是简单快速。

 

没有更多推荐了,返回首页