亿级并发|day04-PowerDesigner和通用Mapper
PowerDesigner和通用Mapper
0 前期准备
- PowerDesigner
链接:https://pan.baidu.com/s/1m04NiWaSE0Fzwm7PPSlmbQ
密码:yyve
1 数据建模工具-PD的使用
1.1 创建工作区
1.2 创建表
-
添加备注消息
-
添加字段
1.3 一对一关系
总结
关联关系一般是主键作为其他表的外键,主外键关联一般只存在于表设计中。真实的数据库中只有主键没有外键,目的是加快查询速度。一般的关联关系,通过业务代码来维护。
说明
用户表与用户详情表是一对一的对应关系
1.4 一对多关系
一只狗只有一个主人,而一个主人可以有很多宠物。
在数据建模中,一对多的关联关系几乎不存在,使用反向的一对一代替。
1.5 多对多关系
在业务代码角度,没有多对多,只有双向的一对多。
伪代码:
User{
List roles;
}
Role{
List users;
}
2 通用Mapper
2.1 数据持久层框架发展
2.1.1 发展史:
- JDBC
连接数据库最为直接的方式,但是JDBC使用繁琐。
- 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,实现数据库操作。
核心概念:
以操作对象的方式操作数据库。
- haibernate(ORM)对象关系映射
定义
对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R
mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 [1]
。从效果上说,它其实是创建了一个可在编程语言里使用的–“虚拟对象数据库”。
概括
描述对象与数据表之间的映射关系。
缺点
- 进行数据库操作时,会有大量的冗余的sql语句,执行效率低。
- 进行关联操作时,需要配置额外的配置文件,并且学习hql语句。
- 使用该框架对数据量有要求,最好不要超过500万。
优点
- ORM思想,可以以面向对象的方式操作数据库。
- Mybatis
优点
- sql语句需要手写,实现结果集自动映射。(半ORM)
缺点
- 无论多么简单都需要自己手写。
- 通用Mapper
优势
- 基于mybatis实现单表增删改查不需要写sql。
- 以面向对象的方式操作。
2.1.2 如何实现通用Mapper
问题
- 如何实现单表增删改查的通用?
过程
- 将对象与表一一映射,对象中的属性与表中的字段一一对应。
- 准备通用的模板方法。
XXXMapper.insert(对象)
XXXMapper.delete(对象)
XXXMapper.update(对象)
XXXMapper.select(对象)
- 将特定的方法转换为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 {
@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 页面效果
2.4 商品新增
2.4.1 EasyUI中数据有效性
-
必填项
data-options=“required:true” -
设定取值区间
data-options="min:1,max:99999999,precision:2,required:true"
2.4.2 页面分析
-
页面url分析
-
页面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)
*/
@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>