PowerDesigner和通用Mapper

  • 0 前期准备
  • 1 数据建模工具-PD的使用
    • 1.1 创建工作区
    • 1.2 创建表
    • 1.3 一对一关系
    • 1.4 一对多关系
    • 1.5 多对多关系
  • 2 通用Mapper
    • 2.1 数据持久层框架发展
      • 2.1.1 发展史:
      • 2.1.2 如何实现通用Mapper
    • 2.2 通用Mapper入门
      • 2.2.1 添加插件
      • 2.2.2 表与对象一一映射
      • 2.2.3 引入通用Mapper方法
    • 2.3 商品分类目录展现
      • 2.3.1 EasyUI中弹出框
      • 2.3.2 页面分析
      • 2.3.3 VO对象封装分析
      • 2.3.4 定义VO对象
      • 2.3.5 定义ItemCat对象
      • 2.3.6 定义Mapper接口文件
      • 2.3.7 EasyUI异步树加载
      • 2.3.8 编辑controller
      • 2.3.9 编辑service
      • 2.3.10 页面效果
    • 2.4 商品新增
      • 2.4.1 EasyUI中数据有效性
      • 2.4.2 页面分析
      • 2.4.3 定义返回VO对象
      • 2.4.4 编辑controller
      • 2.4.5 编辑service
    • 2.5 商品修改
      • 2.5.1 页面分析
      • 2.5.2 编辑controller
      • 2.5.3 编辑service
    • 2.6 商品上/下架
      • 2.6.1 页面分析
      • 2.7.2 编辑controller
      • 2.7.3 编辑service
      • 2.7.4 编辑Mapper接口和映射文件
  • 3 完整项目代码

0 前期准备

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

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

1.1 创建工作区

1.2 创建表

  1. 添加备注消息

  2. 添加字段

1.3 一对一关系

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

说明
用户表与用户详情表是一对一的对应关系

1.4 一对多关系

一只狗只有一个主人,而一个主人可以有很多宠物。
在数据建模中,一对多的关联关系几乎不存在,使用反向的一对一代替。

1.5 多对多关系

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

伪代码:

User{List  roles;
}Role{List  users;
}

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 表与对象一一映射

2.2.3 引入通用Mapper方法

2.3 商品分类目录展现

2.3.1 EasyUI中弹出框

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

2.3.2 页面分析

2.3.3 VO对象封装分析

根据EasyUITree中的格式要求,需要封装一个VO对象。

2.3.4 定义VO对象

2.3.5 定义ItemCat对象

2.3.6 定义Mapper接口文件

2.3.7 EasyUI异步树加载

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

2.3.8 编辑controller

@Controller
@RequestMapping("/item/cat")
public class ItemCatController {@Autowiredprivate ItemCatService itemCatService;/*** 实现商品分类目录展现* @RequestParam*   defaultValue= 如果没有传递参数 默认值为...*  required=true/false 默认为false  如果true 那么前台必须传递该参数.*  value 需要转化变量的名称* @param parentId* @return*/@RequestMapping("/list")@ResponseBodypublic 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 {@Autowiredprivate ItemCatMapper itemCatMapper;/*** 1.根据parentId查询列表信息* 2.将列表数据转化为返回voList集合*/@Overridepublic 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,如果不是父级 openString state = itemCatTemp.getIsParent() ? "closed" : "open";       easyUITree.setState(state);treeList.add(easyUITree);}return treeList;}
}

2.3.10 页面效果

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分析

  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对象

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)*/@Overridepublic 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

亿级流量架构|day04-PowerDesigner和通用Mapper相关推荐

  1. 亿级流量架构之服务器扩容思路及问题分析

    为什么要扩容 说人话就是, 无论如何优化性能,能达到的最大值是一定的,对于一个用户量大的应用,可以对服务器进行各种优化,诸如‍限流‍.资源隔离,但是上限还是在那里,这时候就应该改变我们的硬件,例如使用 ...

  2. 亿级流量架构:为什么要扩容?服务器扩容思路及问题分析

    为什么要扩容 说人话就是, 无论如何优化性能,能达到的最大值是一定的,对于一个用户量大的应用,可以对服务器进行各种优化,诸如限流.资源隔离,但是上限还是在那里,这时候就应该改变我们的硬件,例如使用更强 ...

  3. 亿级流量架构:服务器扩容思路及问题分析

    为什么要扩容 说人话就是, 无论如何优化性能,能达到的最大值是一定的,对于一个用户量大的应用,可以对服务器进行各种优化,诸如限流.资源隔离,但是上限还是在那里,这时候就应该改变我们的硬件,例如使用更强 ...

  4. 亿级流量架构怎么做资源隔离?口琴这篇写得太好了!

    作者:等不到的口琴 链接:www.cnblogs.com/Courage129/p/14421585.html 为什么要资源隔离 常见的资源,例如磁盘.网络.CPU等等,都会存在竞争的问题,在构建分布 ...

  5. 亿级流量架构演进实战 | 从零构建亿级流量API网关 02

    这不是一个讲概念的专栏,而且我也不擅长讲概念,每一篇文章都是一个故事,我希望你可以通过这些故事了解我当时在实际工作中遇到问题和背后的思考,架构设计是种经验,我有幸参与到多个亿级系统的架构设计中,有所收 ...

  6. 亿级流量架构实战之秒杀设计

    前面已经写了很多亿级流量的文章, 中间讲了各种处理思路, 这儿将这些思路与业务综合起来, 情形一就是秒杀, 提到秒杀, 很多人都会觉得这是一件技术要求很高的事情, 因为这涉及到超大访问量(可能瞬间千万 ...

  7. 亿级流量架构演进实战 | 架构演进重构消息PUSH系统 05

    这不是一个讲概念的专栏,而且我也不擅长讲概念,每一篇文章都是一个故事,我希望你可以通过这些故事了解我当时在实际工作中遇到问题和背后的思考,架构设计是种经验,我有幸参与到多个亿级系统的架构设计中,有所收 ...

  8. 亿级流量架构演进实战 | 从零构建亿级流量API网关 01

    这不是一个讲概念的专栏,而且我也不擅长讲概念,每一篇文章都是一个故事,我希望你可以通过这些故事了解我当时在实际工作中遇到问题和背后的思考,架构设计是种经验,我有幸参与到多个亿级系统的架构设计中,有所收 ...

  9. 亿级流量架构演进实战 | 架构演进构建TCP长连接网关 04

    这不是一个讲概念的专栏,而且我也不擅长讲概念,每一篇文章都是一个故事,我希望你可以通过这些故事了解我当时在实际工作中遇到问题和背后的思考,架构设计是种经验,我有幸参与到多个亿级系统的架构设计中,有所收 ...

最新文章

  1. HTML5培训教程:HTML5基础介绍
  2. 套接字没有连接并且没有提供地址_网络是怎样连接的 -- web服务器接到请求后将会做什么...
  3. 41.简单说一下noexecpt关键字
  4. 双目标定与矫正 matlab
  5. Unity2019.2中文更新日志速览版
  6. Spring 系统学习:Spring的事务管理---事务回顾
  7. java随机生成车牌_JDBC:随机生成车牌号,批量插入数据库
  8. 为什么要从vmware切换到kvm?
  9. 2022 年“苹果学者”名单公布,4 位华人学生位列其中
  10. pycharm conda 环境 切换 linux_windows配置wsl2环境+pycharm指路
  11. Spring学习笔记之基础、IOC、DI(1)
  12. crio电压采集 labview_基于cRIO远程数据采集终端
  13. c语言课程设计找出肇事车牌,C语言课程设计参考题目.doc
  14. H5制作平台开发游戏成本解析
  15. mysql 向上取整_mysql的取整函数
  16. Apple应用证书申请过程
  17. 亿万用户网站MySpace的成功秘密
  18. 主视图和左视图算体积最大最小值
  19. React - 红绿灯
  20. HBase 2.0 API 初步窥探

热门文章

  1. BZOJ3834: [Poi2014]Solar Panels
  2. 【nowcoder 217602】照看小猫
  3. Fibonacci数列递归算法与非递归算法
  4. 面试中你必须要知道的语言陷阱(很好,怕再找不到了)
  5. a标签移动上去没有下划线怎么设置_a标签如何添加“行内样式为鼠标移入出现下划线”效果?...
  6. IIS7.x渗透笔记
  7. 申请海外MBA如何写英文自荐信和推荐信
  8. python3表格数据处理
  9. Linux centos7网络配置
  10. python--基础4 (文件操作)