使用 mybatis + flying + 双向相关建模 的电商后端
代码下载地址:
http://www.demodashi.com/demo/12468.html
mybatis.flying
众所周知,mybatis 虽然易于上手,但放到互联网环境下使用时,不可避免的要面对诸如‘’一级缓存存在脏数据‘’、‘’需要写大量明文 SQL 语句‘’等问题。对于这些问题 mybatis 的开发团队选择了一种谦逊的方式,他们开放 mybatis 接口,允许用户开发插件,按自己的方式来解决这些问题。于是,一切 ORM 领域相关的问题在 mybatis 上通过插件都有了解决方案。
flying 主要特点:
以前我们在 mapper.xml 中要写很复杂的 sql 语句,但现在在 mapper.xml 中只需这样:
<select id="select" resultMap="result">flying#{?}:select</select><select id="selectOne" resultMap="result">flying:selectOne</select><insert id="insert">flying:insert</insert><update id="update">flying:update</update><delete id="delete">flying:delete</delete>
再在您的实体类上加上这样一些标注:
package myPackage;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;@Table(name = "account")
public class Account {@Id@Columnprivate Integer id;@Columnprivate java.lang.String name;@Columnprivate Integer age;/* 省略 getter 和 setter */
}
flying 就完全明白您的数据结构和您想做的事情了。 接下来您增删改查这个实体就会变得非常简单:
/* 新增 */Account newAccount = new Account();newAccount.setName("ann");newAccount.setAge(18);accountService.insert(newAccount);/* 按主键查询 */Account account = accountService.select(newAccount.getId());/* 按姓名查询,这里忽略了年龄 */Account accountC1 = new Account();accountC1.setName("ann");Account account1 = accountService.selectOne(accountC1);/* account1 和 account 代表相同的业务数据 *//* 按年龄查询,这里忽略了姓名 */Account accountC2 = new Account();accountC2.setAge(18);Account account2 = accountService.selectOne(accountC2);/* account2 和 account 代表相同的业务数据 *//* 按姓名和年龄查询 */Account accountC3 = new Account();accountC3.setName("ann");accountC3.setAge(18);Account account3 = accountService.selectOne(accountC3);/* account3 和 account 代表相同的业务数据 *//* 修改 */account.setName("bob");accountService.update(newAccount);/* 按主键删除 */accountService.delete(newAccount);
由于 flying 掌握了您全部的数据结构和实体关系,所以操作数据变得非常简单,您再也不需要定义 “getAccountById、getAccountByName、getAccountByAge” 这样重复性强的方法了,由此带来更大的好处是您的 service 层只需要关注事务方面的逻辑即可,它从低级代码中完全解放了出来。以上只是 flying 功能的冰山一角,其它的功能如多表联查、分页、乐观锁、跨数据源查询、二级缓存等 flying 都有简单的解决方案,您可以在 flying-doc.limeng32.com 中进行查看。
flying 特点总结如下:
数据操作入参和返回类型都是自定义的实体类,完全 no sql 杜绝各种‘’手滑‘’,项目可随意重构。
支持跨表操作和跨数据源操作。
非侵占工作机制,可以和您已有的 mybatis 方法协同工作。
加入了优化过的缓存插件,可以对多数据源环境下 flying 方法和传统 mybatis 方法同时进行缓存管理。
可以自定义主键生成器,全面支持或逻辑查询。(初雪版新增特性)
flying 获取方式:
flying 的 maven 坐标为:
<groupId>com.github.limeng32</groupId><artifactId>mybatis.flying</artifactId><version>0.9.3</version>
mybatis 版本与 flying 最新版本初雪的对应关系见下:
mybatis 版本 | flying-初雪 |
---|---|
3.3.0、3.3.1 | 0.8.3 |
3.4.0、3.4.1、3.4.2、3.4.3、3.4.4、3.4.5 | 0.9.3 |
之所以采用分版本发布的方式是因为我们对 mybatis 每个版本的用户都认真负责,力求使您得到 flying 最大的好处。
我们还为您提供了一个快速上手的示例,请按以下方式使用:
1、将代码搭建成 maven 项目。
2、以 maven 命令执行 tomcat7:run
以下是初始化时的添加的数据源 dataSource 和 dataSource2,将商品业务数据和用户数据分开存放是一种常见做法。dataSource 描述了两个购物车和 12 种商品和商品装入购物车的情况:
<dataset><CART ID="1" DEAL="0" DEAL_TIME=null PERSON_ID="1"/><CART ID="2" DEAL="0" DEAL_TIME=null PERSON_ID="2" /><COMMODITY ID="1" NAME="牙刷A" PRICE="1200" /><COMMODITY ID="2" NAME="牙刷B" PRICE="1850" /><COMMODITY ID="3" NAME="牙刷C" PRICE="2100" /><COMMODITY ID="4" NAME="佳洁士牙膏" PRICE="1499" /><COMMODITY ID="5" NAME="六必治牙膏" PRICE="1999" /><COMMODITY ID="6" NAME="云南白药牙膏" PRICE="2499" /><COMMODITY ID="7" NAME="潘婷洗发露" PRICE="3500" /><COMMODITY ID="8" NAME="多芬洗发露" PRICE="3900" /><COMMODITY ID="9" NAME="海飞丝洗发露" PRICE="5100" /><COMMODITY ID="10" NAME="浴液-1500ML" PRICE="2800" /><COMMODITY ID="11" NAME="浴液-2000ML" PRICE="3200" /><COMMODITY ID="12" NAME="浴液-4000ML" PRICE="4900" /><CART_COMMODITY ID="1" CART_ID="1" COMM_ID="1" AMOUNT="3" /><CART_COMMODITY ID="2" CART_ID="1" COMM_ID="5" AMOUNT="4" /><CART_COMMODITY ID="3" CART_ID="1" COMM_ID="8" AMOUNT="1" /><CART_COMMODITY ID="4" CART_ID="1" COMM_ID="12" AMOUNT="1" /><CART_COMMODITY ID="5" CART_ID="2" COMM_ID="2" AMOUNT="2" /><CART_COMMODITY ID="6" CART_ID="2" COMM_ID="4" AMOUNT="1" /><CART_COMMODITY ID="7" CART_ID="2" COMM_ID="9" AMOUNT="2" /><CART_COMMODITY ID="8" CART_ID="2" COMM_ID="11" AMOUNT="1" />
</dataset>
dataSource2 描述了 3 种会员级别和 3 位用户的情况:
<dataset><ROLE ID="1" NAME="普通会员" VALUE="normal" /><ROLE ID="2" NAME="银牌会员" VALUE="silver" /><ROLE ID="3" NAME="金牌会员" VALUE="gold" /><PERSON ID="1" NAME="张三" ROLE_ID="1" /><PERSON ID="2" NAME="李四" ROLE_ID="2" /><PERSON ID="3" NAME="王五" ROLE_ID="3" />
</dataset>
项目结构截图
运行效果
运行起来后,具体的功能访问页面可以用如下方式访问到,在浏览器中输入以下 url 可以看到效果:
查看购物车: http://localhost:8080/flying-demo2/getCart?id=${购物车cart的id}
查看商品: http://localhost:8080/flying-demo2/getCommodity?id=${商品commodity的id}
翻页查看商品(所有条件均为可选): http://localhost:8080/flying-demo2/getCommodityInPage?pageNum={页码}&priceOrder={页码}&priceOrder={页码}&priceOrder={按价格升序或降序输入asc或desc}&priceFrom={价格最小值}&priceTo={价格最小值}&priceTo={价格最小值}&priceTo={价格最大值}
增加新商品: http://localhost:8080/flying-demo2/addCommodity?name={新商品名称}&price={新商品名称}&price={新商品名称}&price={新商品价格}
编辑商品: http://localhost:8080/flying-demo2/updateCommodity?id={商品的id}&name={商品的id}&name={商品的id}&name={商品的名称}&price=${商品的价格}
查看购物车中的商品: http://localhost:8080/flying-demo2/getCommodityByCart?id=${购物车的id}
对购物车进行结账: http://localhost:8080/flying-demo2/dealCart?id=${购物车的id}
取消购物车的结账: http://localhost:8080/flying-demo2/undealCart?id=${购物车的id}
查看用户: http://localhost:8080/flying-demo2/getPerson?id=${用户的id}
查看会员级别: http://localhost:8080/flying-demo2/getRole?id=${会员级别的id}
编辑会员级别: http://localhost:8080/flying-demo2/updateRoleDirectly?id={会员级别的id}&name={会员级别的id}&name={会员级别的id}&name={会员级别的名称}
查询匹配两个级别值(如gold、silver、normal)的会员级别(使用或逻辑特性):
http://localhost:8080/flying-demo2/getRoleValue1OrValue2?value1={级别值1}&value2={级别值1}&value2={级别值1}&value2={级别值2}
查询会员级别值(如gold、silver、normal)或用户名称匹配给定值的用户(使用外键或逻辑特性)
http://localhost:8080/flying-demo2/getRoleValueOrPersonName?value={级别值}&name={级别值}&name={级别值}&name={用户名称}
向当前购物车加入/删除商品(amount为负数时为删除),并自动处理最终结果(用来展示双向相关算法下处理业务模型的优雅)
http://localhost:8080/flying-demo2/addCommodityToCart?cartId={购物车的id}&commId={购物车的id}&commId={购物车的id}&commId={商品的id}&amount=${购买数量}
按两个用户id查询购买的商品详情(使用跨库或逻辑特性)
http://localhost:8080/flying-demo2/getCartCommodityByPersonId1OrId2?id1={用户id1}&id2={用户id1}&id2={用户id1}&id2={用户id2}
不刷新缓存的编辑会员级别:http://localhost:8080/flying-demo2/updateRoleDirectlyWithoutCache?id={会员级别的id}&name={会员级别的id}&name={会员级别的id}&name={会员级别的名称}
以上方法的实现代码可见: https://github.com/limeng32/flying-demo2/blob/use-flying-0.9.3/src/main/java/indi/demo/flying/web/CommonController.java
从 use-flying-0.9.3
分支开始我们采用双向相关的方式构建 pojo,以求打造一个真实可用的电商前台,关于双向相关的详细信息请见: https://my.oschina.net/u/2280950/blog/1580056
以上API方法除最后一个外,其余均支持了二级缓存。您可以调用 updateRoleDirectlyWithoutCache
修改会员级别名称,之后调用 getRole
能看到新的名称,但调用 getCart
和 getCommodityByCart
则只能看到修改前的名称,这是因为 updateRoleDirectlyWithoutCache
设计为不支持二级缓存,从这里可以看出缓存确实发挥了作用;如果您调用 updateRoleDirectly
修改会员级别名称,在调用 getRole
、getCart
和 getCommodityByCart
都会显示出新的名称,因为 updateRoleDirectly
设计为支持二级缓存。如果再使用 redis 托管 mybatis 的二级缓存,就成为了可扩展的缓存解决方案,不过这已超过本例的讨论范围。
updateRoleDirectly
和 updateRoleDirectlyWithoutCache
都是普通 mybatis 方法而非 flying 自动映射方法,这个例子也说明改造 mybatis 二级缓存的插件可供 flying 自动映射方法和非 flying 自动映射方法同时工作。
最后,flying 项目介绍请见 flying-doc.limeng32.com ,我们为开发最好的 mybatis 插件而努力。
注:本文著作权归作者,由demo大师(http://www.demodashi.com)宣传,拒绝转载,转载需要作者同意
使用 mybatis + flying + 双向相关建模 的电商后端相关推荐
- 实战电商后端系统(三)—— 以vue-element-admin为基础的前端项目对接后端接口
文章目录 前言 正文 1. 项目初始化 2. 精简项目 3. 替换mock接口,对接后端接口 3.1 修改/src/api/user.js 3.2 修改项目中请求方式 4. 效果展示 参考 相关文章 ...
- 手把手实操|深度剖析电商贷款风控相关细节(电商贷模型)
序言: 在电商领域中,一直都有这样的场景:对于电商企业而言,资金短缺是经常出现的问题,尤其是在目前疫情状况下,经济下行,营业额逐渐降低,现金流紧张,企业这时就会考虑去借贷融资. 有需求就有供给,目前许 ...
- 基于java+springboot+mybatis+vue+elementui的B2C购物电商平台设计与实现
项目介绍 随着信息科技的发展,电子商务已经存在了我们生活的每一个角落,通过网络购物可以给人们的生活带来极大的便利,人们只需通过PC或者手机下单自己所需的商品,物流就会将购买的商品送到客户的手上,这极大 ...
- 【毕业求职季】-听说你想去大厂看学妹,带你看看字节跳动抖音电商后端面试长啥样?
前言 毕业求职季,你准备好了吗?希望各位小伙伴能够苦练技术,早日达成自己心仪的offer. 下面是博主收集的一些关于面试的比较帮的面试题目,有需要的小伙伴可自行订阅下载. Spring系列面试题129 ...
- 2017年11场下半年热门电子商务相关会议电商峰会合集
如果你对互联网一无所知,如果你对电商了解仅限于淘宝,如果你对电商还有那么一点兴趣. 那么请不要错过这篇文章! 也许从中学不到什么,也许会不明觉厉,也许会觉得不值一提. 但是这篇文章活动家为你总结了20 ...
- KDD 2021 | Neural Auction: 电商广告中的端到端机制优化方法
▐ 导读 拍卖机制设计一直是计算广告领域的核心问题,在本文中我们将机器学习和机制设计方法深度融合,提出一种基于深度神经网络建模的电商广告拍卖机制,并在满足 Value 最大化广告主激励兼容的机制解空 ...
- 电商异步消息系统的实践
声明:本文为<程序员>7月期原创投稿文章,未经许可禁止任何形式的转载. 作者:王晓宇,小米网平台研发部软件研发工程师.2015年入职小米,主要负责电商后端仓储物流相关的业务系统开发.曾在西 ...
- 一个页面区分管理者和普通用户如何设计_电商系统:优惠券原型设计说明(二)...
编辑导读:在整个产品发展的整个周期中,运营活动必不可少,而发放优惠券已成为运营活动的一种基本形式,而关于优惠券设计就尤为重要.本文作者分享了优惠券后台页面的相关设计步骤,推荐给对优惠券感兴趣的童鞋阅读 ...
- 【Axure电商原型】电商APP高保真原型+移动端通用版电商app模板+用户中心+会员体系+内容推荐+社区体系+运营推广+订单流程+运营活动+订单管理+售后及服务+秒杀专区+特惠推荐+高保真移动端电商
作品名称:Axure电商产品移动端交互原型 – 作品类型:模板类 软件版本:Axure 8.0 兼容9.0 备注:非代码真实系统,适用于交互设计师或者产品经理. Axure原型演示及下载地址 ...
最新文章
- 通过域名访问自己部署到服务器上的项目
- 第一个 Mybatis 程序(CURD操作)
- 厉害了!用 JS 实现人脑和计算机交互
- REDIS实践之请勿踩多进程共用一个实例连接的坑
- 认识学习网络布线与数制转换
- Spring:延迟初始化
- 一次redis集群连接数占满问题的排查
- L2-007 家庭房产 (25分)
- (三)洞悉linux下的Netfilteriptables:内核中的rule,match和target
- 计算机学数字电子基础知识,什么是数字电路?新手如何快速学习数字电路基础?...
- 最详细的Quartus + Modesim完整波形仿真过程
- 英语报纸计算机类,报纸和电脑英语作文
- 体渲染-------颜色、不透明度调整
- 域名购买以及云解析DNS
- js解决m3u8视频无法播放问题
- css通用命名大全,CSS的常用命名及规范
- mysql data too long for column xxx解决方案
- Android MVP伴侣,Nucleus框架使用简介
- Android 关于模拟点击和Hook框架的杂谈
- 51单片机之 LCD1602液晶显示屏
热门文章
- 【K210】【MaixPy】三、Maix Dock入门之LCD的使用(播放BadApple)
- 数字图像处理(四)——图像编码技术(二)
- python算法应用(三)——分级聚类
- linux input输入子系统分析《二》:s3c2440的ADC简单驱动实例分析
- 信号量、使用信号量来完成读写模型(消费者生产者模型)线程池、读写锁面试题
- mysql取消外键限制_mysql怎么取消外键限制(约束)?
- 卸载centos7自带mysql_centos7完全卸载mysql
- 数据挖掘–聚类思维导图
- 【LeetCode】【HOT】39. 组合总和(回溯)
- 《深入理解 Spring Cloud 与微服务构建》第十二章 服务注册和发现 Consul