代码下载地址:

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 能看到新的名称,但调用 getCartgetCommodityByCart 则只能看到修改前的名称,这是因为 updateRoleDirectlyWithoutCache 设计为不支持二级缓存,从这里可以看出缓存确实发挥了作用;如果您调用 updateRoleDirectly 修改会员级别名称,在调用 getRolegetCartgetCommodityByCart 都会显示出新的名称,因为 updateRoleDirectly 设计为支持二级缓存。如果再使用 redis 托管 mybatis 的二级缓存,就成为了可扩展的缓存解决方案,不过这已超过本例的讨论范围。

updateRoleDirectlyupdateRoleDirectlyWithoutCache 都是普通 mybatis 方法而非 flying 自动映射方法,这个例子也说明改造 mybatis 二级缓存的插件可供 flying 自动映射方法和非 flying 自动映射方法同时工作。

最后,flying 项目介绍请见 flying-doc.limeng32.com ,我们为开发最好的 mybatis 插件而努力。

注:本文著作权归作者,由demo大师(http://www.demodashi.com)宣传,拒绝转载,转载需要作者同意

使用 mybatis + flying + 双向相关建模 的电商后端相关推荐

  1. 实战电商后端系统(三)—— 以vue-element-admin为基础的前端项目对接后端接口

    文章目录 前言 正文 1. 项目初始化 2. 精简项目 3. 替换mock接口,对接后端接口 3.1 修改/src/api/user.js 3.2 修改项目中请求方式 4. 效果展示 参考 相关文章 ...

  2. 手把手实操|深度剖析电商贷款风控相关细节(电商贷模型)

    序言: 在电商领域中,一直都有这样的场景:对于电商企业而言,资金短缺是经常出现的问题,尤其是在目前疫情状况下,经济下行,营业额逐渐降低,现金流紧张,企业这时就会考虑去借贷融资. 有需求就有供给,目前许 ...

  3. 基于java+springboot+mybatis+vue+elementui的B2C购物电商平台设计与实现

    项目介绍 随着信息科技的发展,电子商务已经存在了我们生活的每一个角落,通过网络购物可以给人们的生活带来极大的便利,人们只需通过PC或者手机下单自己所需的商品,物流就会将购买的商品送到客户的手上,这极大 ...

  4. 【毕业求职季】-听说你想去大厂看学妹,带你看看字节跳动抖音电商后端面试长啥样?

    前言 毕业求职季,你准备好了吗?希望各位小伙伴能够苦练技术,早日达成自己心仪的offer. 下面是博主收集的一些关于面试的比较帮的面试题目,有需要的小伙伴可自行订阅下载. Spring系列面试题129 ...

  5. 2017年11场下半年热门电子商务相关会议电商峰会合集

    如果你对互联网一无所知,如果你对电商了解仅限于淘宝,如果你对电商还有那么一点兴趣. 那么请不要错过这篇文章! 也许从中学不到什么,也许会不明觉厉,也许会觉得不值一提. 但是这篇文章活动家为你总结了20 ...

  6. KDD 2021 | Neural Auction: 电商广告中的端到端机制优化方法

    ▐  导读 拍卖机制设计一直是计算广告领域的核心问题,在本文中我们将机器学习和机制设计方法深度融合,提出一种基于深度神经网络建模的电商广告拍卖机制,并在满足 Value 最大化广告主激励兼容的机制解空 ...

  7. 电商异步消息系统的实践

    声明:本文为<程序员>7月期原创投稿文章,未经许可禁止任何形式的转载. 作者:王晓宇,小米网平台研发部软件研发工程师.2015年入职小米,主要负责电商后端仓储物流相关的业务系统开发.曾在西 ...

  8. 一个页面区分管理者和普通用户如何设计_电商系统:优惠券原型设计说明(二)...

    编辑导读:在整个产品发展的整个周期中,运营活动必不可少,而发放优惠券已成为运营活动的一种基本形式,而关于优惠券设计就尤为重要.本文作者分享了优惠券后台页面的相关设计步骤,推荐给对优惠券感兴趣的童鞋阅读 ...

  9. 【Axure电商原型】电商APP高保真原型+移动端通用版电商app模板+用户中心+会员体系+内容推荐+社区体系+运营推广+订单流程+运营活动+订单管理+售后及服务+秒杀专区+特惠推荐+高保真移动端电商

    作品名称:Axure电商产品移动端交互原型 –   作品类型:模板类   软件版本:Axure 8.0 兼容9.0  备注:非代码真实系统,适用于交互设计师或者产品经理. Axure原型演示及下载地址 ...

最新文章

  1. 通过域名访问自己部署到服务器上的项目
  2. 第一个 Mybatis 程序(CURD操作)
  3. 厉害了!用 JS 实现人脑和计算机交互
  4. REDIS实践之请勿踩多进程共用一个实例连接的坑
  5. 认识学习网络布线与数制转换
  6. Spring:延迟初始化
  7. 一次redis集群连接数占满问题的排查
  8. L2-007 家庭房产 (25分)
  9. (三)洞悉linux下的Netfilteriptables:内核中的rule,match和target
  10. 计算机学数字电子基础知识,什么是数字电路?新手如何快速学习数字电路基础?...
  11. 最详细的Quartus + Modesim完整波形仿真过程
  12. 英语报纸计算机类,报纸和电脑英语作文
  13. 体渲染-------颜色、不透明度调整
  14. 域名购买以及云解析DNS
  15. js解决m3u8视频无法播放问题
  16. css通用命名大全,CSS的常用命名及规范
  17. mysql data too long for column xxx解决方案
  18. Android MVP伴侣,Nucleus框架使用简介
  19. Android 关于模拟点击和Hook框架的杂谈
  20. 51单片机之 LCD1602液晶显示屏

热门文章

  1. 【K210】【MaixPy】三、Maix Dock入门之LCD的使用(播放BadApple)
  2. 数字图像处理(四)——图像编码技术(二)
  3. python算法应用(三)——分级聚类
  4. linux input输入子系统分析《二》:s3c2440的ADC简单驱动实例分析
  5. 信号量、使用信号量来完成读写模型(消费者生产者模型)线程池、读写锁面试题
  6. mysql取消外键限制_mysql怎么取消外键限制(约束)?
  7. 卸载centos7自带mysql_centos7完全卸载mysql
  8. 数据挖掘–聚类思维导图
  9. 【LeetCode】【HOT】39. 组合总和(回溯)
  10. 《深入理解 Spring Cloud 与微服务构建》第十二章 服务注册和发现 Consul