这里是对我对谷粒商城项目学习的一些记录,方便日后查阅。

涉及到的软件及技术:

1、Spring-SpringBoot:

springboot是一个微服务框架。

参考 参考
2、Dubbo-SpringCloud:

做分布式请求的处理,远程服务调用的分布式框架。 
Dubbo使用Zookeeper作为服务发现和治理的组件,所以需要搭建Zookeeper集群作为依赖。

参考 参考参考
3、Maven

Maven是一个项目管理工具,
它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),
一个依赖管理系统(Dependency Management System),
和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

4、git : 把代码上传到远端仓库,可以多人多机器协同操作。
5、MySQL: 用于存放数据的数据库。
6、MyBatis与JDBC区别

JDBC是Java提供的一个操作数据库的API;Java程序都是通过JDBC连接数据库的,通过SQL对数据库编程,
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。
MyBatis可以使用简单的XML或注解用于配置和原始映射,
将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
MyBatis是对JDBC的封装。

7、Redis:用于缓存,处理抢购等高并发情形。什么是Redis Redis是什么
Jedis是一个基于java语言的redis客户端集成了redis的命令操作,提供了连接池管理。jedis

Redis 在 Java Web 主要有两个应用场景:在极短时间内进行成千上万次的读写操作。
1、存储 缓存 用的数据;
2、需要高速读/写的场合使用它快速读/写;

8、Elastic Search: 搜索引擎,搜索界面,用于商城中的搜索用途。

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。
Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。
Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

9、FastDFS:分布式文件存储服务器,储存一些图片,商城中的sku对应的图片存储
10、ActiveMQ:消息中间件,分布式业务系统的服务之间的消息传递,处理服务并发。
参考资料
11、nginxnginx入门

负载均衡,web服务器--与fastDFS分配域名
Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强。

12、Apache:阿帕奇服务器做压力测试,测并发
13、SSO:Single Sign On单点登录,支付宝淘宝共享一个单点登录服务器
14、前端:Vue.js、JS、jQuery、html、Thymeleaf、nodejs
15、运维(云容器):docker + kubernetes
16、IDEA:java语言开发的集成环境 — 快、提示范围广

1、新建工程
1、首先是在github上新建一个仓库,然后project from version control下载到自己本地仓库。
2、上传GitHub需要注意:
	1、配置文件.iml,.xml文件不能上传git。
	2、以后所有上传的项目,都只上传 src文件集以及pom.xml文件,
		不要带有自己的  .idea配置文件或者target运行文件之类的(就算是测试文件也一样,从开始就养成习惯)
	3、所有上传的文件都要标明注释(就算是测试文件也一样,从开始就养成习惯)
3、如果不想看到这些乱七八糟的文件,可以在setting--->File Types设置ignore文件类型
2、project与module
对于大一点的项目都是多项目的分布式部署
Module是项目的子模块,可以独立运行的工程,当一个多项目组成的系统时,就是一个project爸爸多个module儿子
Project下本身可以不拥有代码,而是作为一种顶级的管理目录,所有的代码都放到各个module之中。
-----Spring Initalizr是springboot工程的模板。
-----外部依赖SQL选择MySQL、MyBatis、JDBC,   Web选择Web
新建完子模块module之后,Project工程下的src就没什么用了,可以删掉。
3、IDEA的快捷键
更全的参见博客:[IntelliJ IDEA常用快捷键](https://my.oschina.net/dyyweb/blog/494504)
1、常用快捷键:
		智能补全  引包 alt+Enter 
		由方法自动生成返回值变量 ctrl+alt+v 
		跳到方法的实现类 ctrl+alt+b 
		查看方法参数 ctrl+p  
		查看方法文档  ctrl+q   
		复制行 ctrl+D 
		删除行 ctrl+Y 
		跳转到上一个/下一个位置   ctrl+alt+左右
		大小写切换  ctrl+shift+u
2、Debug: 
		F8 执行下一行  (相当于eclipse的 F6)
		F7 跳入内部    (相当于eclipse的 F5)
		F9 继续执行   (相当于eclipse的 F8)
		热部署 ctrl+shift+F9 (仅debug模式)
3、搜索:
		全文搜索文本  ctrl+shift+f 
		全文替换文本  ctrl+shift+r
		搜索类     ctrl+n
		任何地方搜索  双击shift
4、快速录入 !!: 
		查看快速录入列表 ctrl+j 
		foreach     iter
		普通for循环  fori
		循环数组   itar
		迭代器遍历 itco

		psvm  主函数
		pfs    常量

		生成代码块: try/ if / for/ while/ synchronized
		ctrl+alt+t 
4、数据库表数据结构
所使用的的数据库方便起见,只存放了手机的一些表结构,具体作用等用到再进行表述。
oms_cart_item, 
oms_company_address, 
oms_order, 
oms_order_item, 
payment_info, 
pms_base_attr_info, ---------存储商品的平台属性信息,包括手机的尺寸、内存等,属性:id、name、cata3_id = 61.
pms_base_attr_value, --------存储商品的平台属性值,与attr_info表对应,attr_id连接attr_info表。
pms_base_catalog1, ----------存储商品的一级分类,属性由id和name组成。手机的对应id是2.
pms_base_catalog2, ----------存储商品的二级分类,属性:id、name、cata1_id。手机通信id为13,cata1_id为2即手机。
pms_base_catalog3, ----------存储商品的三级分类,属性:id、name、cata2_id。手机id为61,cata2_id为13即手机通信。
pms_base_sale_attr, ---------存储商品的平台销售属性,是平台统一的----颜色、尺寸、版本、容量
pms_brand, ------------------存储手机的品牌信息。
pms_comment, 
pms_comment_replay, 
product开头的表对应spu信息:
pms_product_image, ---------存储spu的图片信息,通过product_id与product_info表连接,存储图片的id、name和url。
pms_product_info, ----------存储spu的信息,通过cata3_id=61与三级分类那张表连接。存储spu的id和name。
pms_product_sale_attr, -----存放spu的销售属性,包含spu销售属性的id、product_id对应product_info表、以及连接的平台销售属性的id和对应的平台销售属性值。
pms_product_sale_attr_value, --对应spu的销售属性值,在给定的四个平台销售属性中选取,这个是对上张表存放的spu销售属性进行自主的赋值。
pms_product_vertify_record, 

pms_sku_attr_value, ----sku的属性值信息,sku_id连接sku_info表,后面两个连接平台属性值表-base_attr_value表
pms_sku_image, ---------存放sku的图片信息,通过sku_id连接sku_info表,包括img的名字、url以及对应spu_image_id.
pms_sku_info, --------------存放sku的信息,从spu中添加sku信息,里面有sku的id、价格、name、描述、重量、默认图片url。同时还通过product_id连接spu信息表,cata3_id连接三级分类表。
pms_sku_sale_attr_value, --sku的销售属性值,sku_id对应sku_info表,平台属性id,一个sku对应几个设置好的spu的属性值,sale_attr_value_id对应对应spu的销售属性值id,与spu的销售属性值表连接
ums_member, 
ums_member_level, 
ums_member_receive_address, 
wms_ware_info, 
wms_ware_order_task, 
wms_ware_order_task_detail, 
wms_ware_sku

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5、Gmall-User

这张结构图是在做完分布式架构的图,可能不太完整,因为bean类直接放在了api工程下面。
在这里插入图片描述

通用Mapper 通用Mapper
通用mapper 可以极大的方便开发人员进行ORM,提供极其方便的单表增删改查。
什么是通用mapper,一句话简单说,它就是个辅助mybatis极简单表开发的组件。
它不是为了替代mybatis,而是让mybatis的开发更方便。

为什么要使用通用Mapper?

原生Mybatis的痛点:
1、mapper.xml文件里有大量的sql,当数据库表字段变动,配置文件就要修改
2、需要自己实现sql分页,select * from table where . . . limit 1,3
	自己手写分页,除了传参page、pageSize,还需要返回条目总数count。
3、数据库可移植性差:如果项目更换数据库,比如oracle-->mysql,mapper.xml中的sql要重新写,
	因为Oracle的PLSQL 和mysql 支持的函数是不同的。
4、生成的代码量过大。
5、批量操作,批量插入,批量更新,需要自写。

举个例子:
UserMapper.java内容:

package com.atguigu.gmall.user.mapper;

import com.atguigu.gmall.bean.UmsMember;
import tk.mybatis.mapper.common.Mapper;
//Mapper也是引用tk.mybatis.mapper.common.Mapper包中的
import java.util.List;

//通用Mapper
public interface UserMapper extends Mapper<UmsMember> {
    List<UmsMember> selectAllUser();
}

UserMapper.xml文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.gmall.user.mapper.UserMapper">

    <select id="selectAllUser" resultType="com.atguigu.gmall.bean.UmsMember">
        select t.* from ums_member t
    </select>

</mapper>
-------------配置通用Mapper可以将单表的增删改查操作省去。
实际上,通用Mapper<?>已经提供常用的 单表CRUD方法的实现。
如果还有其他特殊CRUD需求(如多表连接查询),只需自己在xxxxMapper.java接口添加方法,
对应在xxxxMapper.xml写sql就行了。

配套配置:

1、配置通用mapper的主键和主键返回策略--------在bean文件中进行修改,等后面做分布式架构会再修改
		@Id
		@GeneratedValue(strategy = GenerationType.IDENTITY)

2、配置启动类扫描器MapperScan,使用通用mapper的tk……..MapperScan
		tk.mybatis.spring.annotation.MapperScan
		
启动类代码如下:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan;

@SpringBootApplication
@MapperScan(basePackages = "com.atguigu.gmall.user.mapper")
public class GmallUserApplication {

    public static void main(String[] args) {
        SpringApplication.run(GmallUserApplication.class, args);
    }

}
配置数据源–MySQL与代码进行连接

在application.properties中添加配置:

# 服务端口
server.port=8080

# jdbc
spring.datasource.password=82465
spring.datasource.username=root
spring.datasource.url=jdbc:mysql://localhost:3306/gmall_study?serverTimezone=UTC&characterEncoding=UTF-8

# mybtais配置
mybatis.mapper-locations=classpath:mapper/*Mapper.xml     -------人名字就叫前面这些,不是注释*/
mybatis.configuration.map-underscore-to-camel-case=true

# 解决问题:java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
mapper.identity=MYSQL

#修改日志级别------debug: 有的没的都打印
logging.level.root = info
pom.xml pom依赖
pom.xml是maven项目中的一个很重要的文件,很多依赖都在这个文件中配置。
pom.xml依赖的配置主要分为:
     两大依赖:1.模块依赖;2.框架依赖
     三个部分:1.对于项目本身模块的依赖;2:对于自己公司的封装包的依赖;3:对于第三方包的依赖。

在gmall-user项目的pom.xml文件中添加配置:
-----------------------不过后面会统一继承自父项目,会再更改。

<!-- 通用mapper -->
<dependency>
   <groupId>tk.mybatis</groupId>
   <artifactId>mapper-spring-boot-starter</artifactId>
   <version>1.2.3</version>
   <exclusions>
      <exclusion>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-jdbc</artifactId>
      </exclusion>
   </exclusions>
</dependency>
gmall-user类一些功能的实现:
这种代码结构是我们需要学习的:
gmall-user这个module下面文件结构:
		1、bean:存放一些基本的实体类
		2、Contoller:控制类
		3、Mapper:是一些通用Mapper
		4、service:包含服务类UserService,及实现类的文件夹impl
		5、启动类:GmallUserApplication.java
说明
controllerUserManageControllerweb
serviceUserManageService接口
service.implUserManageServiceImpl实现类
beanUserInfo实体bean
mapperUserInfoMappermapper接口

UserMapper–UmsMemberReceiveAddressMapper :

//通用Mapper-----这里是配置一些通用Mapper表示UserMapper继承自Mapper
public interface UserMapper extends Mapper<UmsMember> {
    List<UmsMember> selectAllUser();-----这个是实现对UmsMember的一个单表查询。
    
    ----对应的生成UserMapper.xml文件内容:
    <mapper namespace="com.atguigu.gmall.user.mapper.UserMapper">
    	<select id="selectAllUser" resultType="com.atguigu.gmall.bean.UmsMember">
        	select t.* from ums_member t
    	</select>
	</mapper>
	
}

public interface UmsMemberReceiveAddressMapper extends Mapper<UmsMemberReceiveAddress> {
}

UserService:

--在这里是定义一个UserService的接口,下面定义几个方法。方法在impl中进行实现
public interface UserService {
    List<UmsMember> getAllUser();
    List<UmsMemberReceiveAddress> getReceiveAddressByMemberId(String memberId);
}

UserMapperImpl:

@Service
public class UserServiceImpl implements UserService {

    @Autowired ----自动注入
    UserMapper userMapper;

    @Autowired
    UmsMemberReceiveAddressMapper umsMemberReceiveAddressMapper;

    @Override
    public List<UmsMember> getAllUser() {

        //测试通用Mapper ---- 通过通用Mapper实现单表的查询
        List<UmsMember> userMemberList = userMapper.selectAll();//userMapper.selectAllUser();
        return userMemberList;
    }

    @Override--方法重写---通过memberId得到收件地址列表
    public List<UmsMemberReceiveAddress> getReceiveAddressByMemberId(String memberId) {

        // 封装的参数对象
        --实例化对象,将对象的memberId设置为给定的,然后通用Mapperselect选中的address。
        UmsMemberReceiveAddress umsMemberReceiveAddress = new UmsMemberReceiveAddress();
        umsMemberReceiveAddress.setMemberId(memberId);
        List<UmsMemberReceiveAddress> umsMemberReceiveAddresses = umsMemberReceiveAddressMapper.select(umsMemberReceiveAddress);

//        Example example = new Example(UmsMemberReceiveAddress.class);
//        example.createCriteria().andEqualTo("memberId",memberId);
//        List<UmsMemberReceiveAddress> umsMemberReceiveAddresses = umsMemberReceiveAddressMapper.selectByExample(example);
//        //example与update一起用,更新的时候用,查询的时候不能用

        return umsMemberReceiveAddresses;
    }
}

UserController:----与前端进行交互
-----------RequestMapping、RequestBody、ResponseBody
-----------SpringMVC常见注解

@Controller
--@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。
分发处理器将会扫描使用了该注解的类的方法。通俗来说,被Controller标记的类就是一个控制器,这个类中的方法,就是相应的动作。
public class UserController {

    @Autowired------自动注入userService
    UserService userService;

    @RequestMapping("getReceiveAddressByMemberId")
    ----@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
    @ResponseBody
---@Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用,
通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。
作用:该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
    public List<UmsMemberReceiveAddress> getReceiveAddressByMemberId(String memberId){
        List<UmsMemberReceiveAddress> umsMemberReceiveAddresses = userService.getReceiveAddressByMemberId(memberId);
        return umsMemberReceiveAddresses;
    }

    @RequestMapping("getAllUser")
    @ResponseBody
    public List<UmsMember> getAllUser(){
        List<UmsMember> umsMembers = userService.getAllUser();
        return umsMembers;
    }

    @RequestMapping("index")
    @ResponseBody
    public String index(){
        return "hello user";
    }
}

extends 与 implements 关键字的不同:

1、在类的声明中,通过关键字extends来创建一个类的子类。 
	一个类通过关键字implements声明自己使用一个或者多个接口。 
	extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; 
	implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用 
	
2、extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承
	JAVA中不支持多重继承,但是可以用接口 来实现,这样就要用到implements,继承只能继承一个类,
	但implements可以实现多个接口,用逗号分开就行了 比如 :
		class A extends B implements C,D,E

接口实现的注意点:  
	a.实现一个接口就是要实现该接口的所有的方法(抽象类除外)。 
	b.接口中的方法都是抽象的。  
	c.多个无关的类可以实现同一个接口,一个类可以实现多个无关的接口。


与Extends的不同 :
	extends, 可以实现父类,也可以调用父类初始化 this.parent()。而且会覆盖父类定义的变量或者函数。
	这样的好处是:架构师定义好接口,让工程师实现就可以了。整个项目开发效率和开发成本大大降低。   
	implements,实现父类,子类不可以覆盖父类的方法或者变量。即使子类定义与父类相同的变量或者函数,也会被父类取代掉。  
	
 这两种实现的具体使用,是要看项目的实际情况,需要实现,不可以修改implements,只定义接口需要具体实现,或者可以被修改扩展性好,用extends。

SpringMVC常见注解:

1、@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法。
	通俗来说,被Controller标记的类就是一个控制器,这个类中的方法,就是相应的动作。
2、@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。
	用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
3、@Service("userService")注解是告诉spring,当Spring要创建UserServiceImpl的的实例时,
	bean的名字必须叫做"userService",这样当Action需要使用UserServiceImpl的的实例时,就可以由Spring创建好的"userService",然后注入给Action。
4、@Repository(value="userDao")注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。
	当Service需要使用Spring创建的名字叫“userDao”的UserDaoImpl实例时,就可以使用@Resource(name = "userDao")注解告诉Spring,
	Spring把创建好的userDao注入给Service即可。
5、@Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作,我们也要清楚,@Autowired是根据类型进行自动装配的。
6、@Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用,
	通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,
	而是直接写入HTTP 响应正文中。
7、@RequestBody 注解则是将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。

有点多了,分布式架构的一些内容放在下一篇博客里面进行记录。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐