亿级并发|day04-PowerDesigner和通用Mapper

0 前期准备

  1. PowerDesigner
    链接:https://pan.baidu.com/s/1m04NiWaSE0Fzwm7PPSlmbQ
    密码:yyve

1 数据建模工具-PD的使用

1.1 创建工作区

亿级并发|day04-PowerDesigner和通用Mapper

亿级并发|day04-PowerDesigner和通用Mapper

1.2 创建表

  1. 添加备注消息
    亿级并发|day04-PowerDesigner和通用Mapper

  2. 添加字段
    亿级并发|day04-PowerDesigner和通用Mapper

1.3 一对一关系

总结
关联关系一般是主键作为其他表的外键,主外键关联一般只存在于表设计中。真实的数据库中只有主键没有外键,目的是加快查询速度。一般的关联关系,通过业务代码来维护。

说明
用户表与用户详情表是一对一的对应关系
亿级并发|day04-PowerDesigner和通用Mapper

1.4 一对多关系

一只狗只有一个主人,而一个主人可以有很多宠物。
在数据建模中,一对多的关联关系几乎不存在,使用反向的一对一代替。
亿级并发|day04-PowerDesigner和通用Mapper

1.5 多对多关系

在业务代码角度,没有多对多,只有双向的一对多。

伪代码:

User{
	List  roles;
}

Role{
	List  users;
}

亿级并发|day04-PowerDesigner和通用Mapper

2 通用Mapper

2.1 数据持久层框架发展

2.1.1 发展史:

  1. JDBC

连接数据库最为直接的方式,但是JDBC使用繁琐。

  1. JPA思想

JPA是Java Persistence API的简称,中文名Java持久层API,是JDK
5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中的一组API。

例子:

//SQL
insert into user(id,name) values(1,”tomcat”);
//JPA
User user = new User();
User.setId(1);
User.setName(“tomcat”);

通过工具实现User入库,将对象在底层转化为对应的sql,实现数据库操作。

核心概念:

以操作对象的方式操作数据库。

  1. haibernate(ORM)对象关系映射

定义

对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R
mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 [1]
。从效果上说,它其实是创建了一个可在编程语言里使用的–“虚拟对象数据库”。

概括

描述对象与数据表之间的映射关系。

缺点

  • 进行数据库操作时,会有大量的冗余的sql语句,执行效率低。
  • 进行关联操作时,需要配置额外的配置文件,并且学习hql语句。
  • 使用该框架对数据量有要求,最好不要超过500万。

优点

  • ORM思想,可以以面向对象的方式操作数据库。
  1. Mybatis

优点

  • sql语句需要手写,实现结果集自动映射。(半ORM)

缺点

  • 无论多么简单都需要自己手写。
  1. 通用Mapper

优势

  • 基于mybatis实现单表增删改查不需要写sql。
  • 以面向对象的方式操作。

2.1.2 如何实现通用Mapper

问题

  • 如何实现单表增删改查的通用?

过程

  1. 将对象与表一一映射,对象中的属性与表中的字段一一对应。
  2. 准备通用的模板方法。
XXXMapper.insert(对象)
XXXMapper.delete(对象)
XXXMapper.update(对象)
XXXMapper.select(对象)
  1. 将特定的方法转换为sql语句。
//以新增为例
Insert into 表名(字段…..) values (属性值……)

2.2 通用Mapper入门

2.2.1 添加插件

<plugins>
	<!-- 通用Mapper插件 -->
	<plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
		<!--主键自增回写方法,默认值MYSQL,详细说明请看文档 -->
		<property name="IDENTITY" value="MYSQL" />
		<!--通用Mapper接口,多个通用接口用逗号隔开 -->
		<property name="mappers" value="com.jt.common.mapper.SysMapper" />
	</plugin>
</plugins>

2.2.2 表与对象一一映射

亿级并发|day04-PowerDesigner和通用Mapper

2.2.3 引入通用Mapper方法

亿级并发|day04-PowerDesigner和通用Mapper

2.3 商品分类目录展现

2.3.1 EasyUI中弹出框

$("#btn1").bind("click",function(){
			
	$("#win1").window({
		title:"弹出框",
		width:400,
		height:400,
		modal:true   //这是一个模式窗口,只能点击弹出框,不允许点击别处
	})
})

2.3.2 页面分析

亿级并发|day04-PowerDesigner和通用Mapper

2.3.3 VO对象封装分析

根据EasyUITree中的格式要求,需要封装一个VO对象。
亿级并发|day04-PowerDesigner和通用Mapper

2.3.4 定义VO对象

亿级并发|day04-PowerDesigner和通用Mapper

2.3.5 定义ItemCat对象

亿级并发|day04-PowerDesigner和通用Mapper

2.3.6 定义Mapper接口文件

亿级并发|day04-PowerDesigner和通用Mapper

2.3.7 EasyUI异步树加载

树控件读取url,子节点的加载依赖于父节点的状态。
当展开一个封闭的节点,如果节点没有加载子节点,它会将节点id的值作为http请求参数并命名为 ‘id’ ,通过url发送到服务器上面检索子节点。

2.3.8 编辑controller

@Controller
@RequestMapping("/item/cat")
public class ItemCatController {
	
	@Autowired
	private ItemCatService itemCatService;
	
	/**
	 * 实现商品分类目录展现
	 * @RequestParam
	 * 	defaultValue= 如果没有传递参数 默认值为...
	 *  required=true/false 默认为false  如果true 那么前台必须传递该参数.
	 *  value 需要转化变量的名称
	 * @param parentId
	 * @return
	 */
	@RequestMapping("/list")
	@ResponseBody
	public List<EasyUITree> findItemCatById(@RequestParam(value="id",defaultValue="0") Long parentId){
		//查询一级商品分类目录
		//Long parentId = 0L;
		return itemCatService.findItemCatById(parentId);
	}
}

2.3.9 编辑service

@Service
public class ItemCatServiceImpl implements ItemCatService {
	
	@Autowired
	private ItemCatMapper itemCatMapper;
	
	/**
	 * 1.根据parentId查询列表信息
	 * 2.将列表数据转化为返回voList集合
	 */
	@Override
	public List<EasyUITree> findItemCatById(Long parentId) {
		ItemCat itemCat = new ItemCat();
		itemCat.setParentId(parentId);
		List<ItemCat> itemCatList = 
				itemCatMapper.select(itemCat);
		List<EasyUITree> treeList = new ArrayList<>();
		for (ItemCat itemCatTemp : itemCatList) {
			EasyUITree easyUITree = new EasyUITree();
			easyUITree.setId(itemCatTemp.getId());
			easyUITree.setText(itemCatTemp.getName());
			//如果是父级则应该closed,如果不是父级 open
			String state = 
			itemCatTemp.getIsParent() ? "closed" : "open";		
			easyUITree.setState(state);
			treeList.add(easyUITree);
		}
		return treeList;
	}
}

2.3.10 页面效果

亿级并发|day04-PowerDesigner和通用Mapper

2.4 商品新增

2.4.1 EasyUI中数据有效性

  1. 必填项
    data-options=“required:true”

  2. 设定取值区间

data-options="min:1,max:99999999,precision:2,required:true"

2.4.2 页面分析

  1. 页面url分析
    亿级并发|day04-PowerDesigner和通用Mapper

  2. 页面js

alert($("#itemAddForm").serialize());
$.post("/item/save",$("#itemAddForm").serialize(),
	function(data){
		if(data.status == 200){
			$.messager.alert('提示','新增商品成功!');
		}else{
			$.messager.alert("提示","新增商品失败!");
		}
	});

2.4.3 定义返回VO对象

亿级并发|day04-PowerDesigner和通用Mapper

2.4.4 编辑controller

//实现商品新增
@RequestMapping("/save")
@ResponseBody
public SysResult saveItem(Item item){
	try {
		itemService.saveItem(item);
		return SysResult.oK();
	} catch (Exception e) {
		e.printStackTrace();
	}
	return SysResult.build(201,"商品新增失败");
}

2.4.5 编辑service

@Override
public void saveItem(Item item) {
	//利用通用mapper实现数据入库
	item.setStatus(1);
	item.setCreated(new Date());
	item.setUpdated(item.getCreated());
	itemMapper.insert(item);
}

2.5 商品修改

2.5.1 页面分析

$.post("/item/update",$("#itemeEditForm").serialize(),
	function(data){
		if(data.status == 200){
			$.messager.alert('提示','修改商品成功!','info',
				function(){
					$("#itemEditWindow").window('close');
					$("#itemList").datagrid("reload");
				});
		}else{
			$.message.alert("提示",data.msg);
		}
	});

2.5.2 编辑controller

//实现商品修改
@RequestMapping("/update")
@ResponseBody
public SysResult updateItem(Item item){
	try {
		itemService.updateItem(item);
		return SysResult.oK();
	} catch (Exception e) {
		e.printStackTrace();
	}
	return SysResult.build(201,"商品修改失败");
}

2.5.3 编辑service

@Override
public void updateItem(Item item) {
	item.setUpdated(new Date());
	//将对象中不为null的数据修改.
	itemMapper.updateByPrimaryKeySelective(item);
}

2.6 商品上/下架

2.6.1 页面分析

$.messager.confirm('确认','确定下架ID为 '+ids+' 的商品吗?',
	function(r){
		
		if (r){
			var params = {"ids":ids};   //1,2,3,45
			$.post("/item/instock",params,
				function(data){
				
         			if(data.status == 200){
         				$.messager.alert('提示','下架商品成功!',undefined,
         					function(){
         						$("#itemList").datagrid("reload");
         					});
         			}
         		});
   	    }
   	});

2.7.2 编辑controller

//商品下架  /item/instock      12,3,4,5,6
@RequestMapping("/instock")
@ResponseBody
public SysResult instock(Long[] ids){
	try {
		int status = 2;  //下架       1是上架
		itemService.updateStatus(ids,status);
		return SysResult.oK();
	} catch (Exception e) {
		e.printStackTrace();
	}
	return SysResult.build(201,"商品下架失败");
}

2.7.3 编辑service

/**
	 * 能否使用通用Mapper   单表操作
	 * sql:
	 * 	update tb_item set status = #{status},updated = #{updated}/now()
	 *  where id  in (1,2,3,4,5)
	 */
	@Override
	public void updateStatus(Long[] ids, int status) {
		
		/*for (Long id : ids) {
			Item item = new Item();
			item.setId(id);
			item.setStatus(status);
			item.setUpdated(new Date());
			itemMapper.updateByPrimaryKeySelective(item);
		}*/
		itemMapper.updateStatus(ids,status);
	}

2.7.4 编辑Mapper接口和映射文件

void updateStatus(@Param("ids")Long[] ids,@Param("status")int status);
<!--批量修改状态  
	Array 数组   void updateStatus(Long[] ids);
	<foreach collection="array"  固定写法
	
	List集合		void updateStatus(List idList);
	<foreach collection="list"  固定写法

	Map集合		void updateStatus(@Param("ids") List ids);
	<foreach collection="map中的Key"  固定写法
-->
<update id="updateStatus">
	update tb_item set status = #{status},updated = now() 
	where id  in (
	<foreach collection="ids" item="id" separator=",">
		#{id}
	</foreach>
	)
</update>

3 完整项目代码

链接:https://pan.baidu.com/s/1oHzoKAROR7xE9NRlPEQflA
密码:le6m