*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还是简单快速。