最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA。
    有点挑战,做完了,会有很大进步。

上一篇,我们明确了我们的“规范和约定”。

从本篇开始,写具体的方案和架构。

本篇,重点阐述通用接口定义。

   既然做了分表,那么针对单表的CRUD等很多代码,都是一样的,类似的,因此,定义通用的接口和实现。
就可以配置模版,自动化生成代码啦,后面再详细介绍代码自动化生成。

BaseMapper通用的sql接口定义
 
   

  1. import java.util.List;
  2.  
  3. public interface BaseMapper<ID, Entity,Bean> {
  4. //read
  5. Entity get(ID id);
  6.  
  7. List<Entity> listByIdList(List<String> idList);
  8.  
  9. List<Entity> list(Bean bean);
  10. List<Entity> listAll();
  11.  
  12. //write
  13. int add(Entity entity);
  14.  
  15. int update(Entity entity);
  16. int updateByMemberId(Entity entity);
  17.  
  18. int remove(ID id);
  19.  
  20. int removeByIdList(List<ID> idList);
  21.  
  22. }

BrandMapper具体的Mybatis接口定义,继承BaseMapper,再添加自己特殊的sql映射接口定义

  1. @Mapper
  2. public interface BrandMapper extends BaseMapper<String, Brand,BrandBean> {
  3. //---------------------read-------------------------
  4.  
  5. List<Brand> listByShopIdList(List<String> shopIdList);
  6.  
  7. //---------------------write-------------------------
  8.  
  9. }

BrandMapper.xml 品牌表的Mybatis sql语句

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.webservice.mapper.BrandMapper">
  4. <sql id="columns">
  5. id,name,logo,createTime,updateTime,isDelete
  6. </sql>
  7.  
  8. <select id="get" resultType="Brand">
  9. select
  10. <include refid="columns" />
  11. from brand
  12. where id =
  13. #{id}
  14. </select>
  15.  
  16. <select id="list" resultType="Brand">
  17. select
  18. <include refid="columns" />
  19. from brand where
  20. isDelete=0
  21. <if test="name != null and name !=''">
  22. and name like '%${name}%'
  23. </if>
  24. order by createTime desc
  25. </select>
  26.  
  27. <select id="listAll" resultType="Brand">
  28. select
  29. <include refid="columns" />
  30. from brand where
  31. isDelete=0 order by createTime desc
  32. </select>
  33.  
  34. <select id="listByShopIdList" parameterType="String" resultType="Brand">
  35. select
  36. <include refid="columns" />
  37. from brand where merchantId in
  38. <foreach collection="list" index="index" item="item" open="("
  39. separator="," close=")">
  40. #{item}
  41. </foreach>
  42. </select>
  43.  
  44. <select id="listByIdList" parameterType="String" resultType="Brand">
  45. select
  46. <include refid="columns" />
  47. from brand where id in
  48. <foreach collection="list" index="index" item="item" open="("
  49. separator="," close=")">
  50. #{item}
  51. </foreach>
  52. </select>
  53.  
  54. <insert id="add" parameterType="Brand">
  55. insert into brand
  56. <trim prefix="(" suffix=")" suffixOverrides=",">
  57. <if test="id != null">
  58. id,
  59. </if>
  60. <if test="name != null">
  61. name,
  62. </if>
  63. <if test="logo != null">
  64. logo,
  65. </if>
  66. createTime,
  67. updateTime
  68. </trim>
  69. <trim prefix="values(" suffix=")" suffixOverrides=",">
  70. <if test="id != null">
  71. #{id},
  72. </if>
  73. <if test="name != null">
  74. #{name},
  75. </if>
  76. <if test="logo != null">
  77. #{logo},
  78. </if>
  79. now(),
  80. now()
  81. </trim>
  82.  
  83. </insert>
  84.  
  85. <update id="update" parameterType="Brand">
  86. update brand
  87. <set>
  88. <if test="name != null">
  89. name = #{name},
  90. </if>
  91. <if test="logo != null">
  92. logo = #{logo},
  93. </if>
  94. updateTime=now()
  95. </set>
  96. where id=#{id}
  97. </update>
  98.  
  99. <update id="remove" parameterType="String">
  100. update brand set isDelete
  101. =
  102. 1,updateTime=now() where id=#{id}
  103. </update>
  104.  
  105. <update id="removeByIdList" parameterType="String">
  106. update brand
  107. set isDelete = 1,updateTime = now()
  108. where
  109. id in
  110. <foreach item="item" index="index" collection="list" open="("
  111. separator="," close=")">
  112. #{item}
  113. </foreach>
  114. </update>
  115.  
  116. </mapper>

更多接口的定义和实现,后面再介绍。

一个电商项目的Web服务化改造4:方案和架构,通用接口的定义和实现的更多相关文章

  1. 一个电商项目的Web服务化改造

    一个电商项目的Web服务化改造 项目,早期是随便瞎做的,没啥架构,连基本的设计也没. 有需求,实现需求,再反复修改. 大致就是这么做的. 最近,项目要重新架构,和某boss协商的结果是,采用阿里开源的 ...

  2. 一个电商项目的Web服务化改造6:单元测试4步走,构造数据、执行操作、断言、回滚

      最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA.     有点挑战,做完了,会有很大进步. 单元测试,在很早之前的文章已经介绍过.     可以在这里看到相关的 ...

  3. 一个电商项目的Web服务化改造3:改进方案の规范和约定、单表、单一职责

         最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA.      有点挑战,做完了,会有很大进步. 上一篇,我们描述了原有项目中的问题.  或者说是,本篇的基本 ...

  4. 一个电商项目的Web服务化改造5:面向服务的分层架构设计(有图有真相)

    最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA.     有点挑战,做完了,会有很大进步. 本篇,以我亲自画的3个图,阐述一下架构设计.   一.分层架构-总体图 ...

  5. 一个电商项目的Web服务化改造2:现有项目的5个问题

         最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA.      有点挑战,做完了,会有很大进步, 1.现有项目的问题   1.1代码风格不统一     不同的 ...

  6. 一个电商项目的Web服务化改造7:Dubbo服务的调用,4个项目

    使用dubbo服务的过程,很简单,和之前学习的WebService完全一样,和本地接口调用也基本一致. dubbo和WebService的区别:我认为dubbo就是封装了WebService,然后提供 ...

  7. 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文

    阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...

  8. 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车

     阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...

  9. 如何一步一步用DDD设计一个电商网站(七)—— 实现售价上下文

    阅读目录 前言 明确业务细节 建模 实现 结语 一.前言 上一篇我们已经确立的购买上下文和销售上下文的交互方式,传送门在此:http://www.cnblogs.com/Zachary-Fan/p/D ...

随机推荐

  1. leetcode笔记:Jump Game

    一. 题目描写叙述 Given an array of non-negative integers, you are initially positioned at the first index o ...

  2. linux 网络编程-基础篇01

    #Socket简介 是一个编程接口是一种特殊的文件描述符(everything in Unix is a file)并不仅限于TCPIP协议面向连接(Transmission Control Prot ...

  3. Bing Maps进阶系列七:Bing Maps功能导航菜单华丽的变身

    Bing Maps进阶系列七:Bing Maps功能导航菜单华丽的变身 Bing Maps Silverlight Control所提供的功能导航是非常强大的,在设计上对扩展的支持非常好,提供了许多用 ...

  4. Silverlight,Windows 8应用开发实例教程系列汇总

    Kevin Fan分享开发经验,记录开发点滴 Silverlight,Windows 8应用开发实例教程系列汇总 2012-06-18 01:05 by jv9, 2145 阅读, 3 评论, 收藏, ...

  5. 【Codevs3567】宫廷守卫

    Position: http://codevs.cn/problem/3567/ Description 从前有一个王国,这个王国的城堡是一个矩形,被分为M×N个方格.一些方格是墙,而另一些是空地.这 ...

  6. 【POJ 2503】 Babelfish

    [题目链接] http://poj.org/problem?id=2503 [算法] 字符串哈希 [代码] #include <algorithm> #include <bitset ...

  7. setings.py配置文件详解

    BASE_DIR指的是项目的根目录.SECRET_KEY是安全码. # SECURITY WARNING: don't run with debug turned on in production! ...

  8. E20170626-hm

    authenticate   vt. 认证,证明是真实的.可靠的或有效的; 鉴定,使生效; author   n. 作者; 著作家; 创造者; 发起人;

  9. 【Kafka】《Kafka权威指南》——从Kafka读取数据

    应用程序使用 KafkaConsumer向 Kafka 订阅主题,并从订阅的主题上接收消息 . 从 Kafka 读取数据不同于从其他悄息系统读取数据,它涉及一些独特的概念和想法.如果不先理解 这些概念 ...

  10. 题解报告:hdu 3790 最短路径问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起 ...