2018-03-07 10:04:23    281    0    0

业务基本流程
新用户注册,校验用户名是否存在
用户名、密码、确认密码、电话、邮箱、密码提示问题和密码提示答案
然后注册成功,进行登录(这里也可以点击忘记密码进行密码找回)
登录成功后,在我的mmall里面可以修改个人信息

首页可以动态的搜索 i关键字搜索,海尔、美的、华为和iPhone
也会有分类的id查询,看到手机分类点进去,可以按价格动态排序
加入购物车,查看购物车
全选/单选,购物车的价格会实时的计算,并且可以增加和减少数量
去结算,新增收货地址,保存收货地址,地址添加成功,可以对其编辑和删除
提交订单,生成订单号,扫码支付二维码
您的订单支付成功!
查看订单,订单信息,商品清单,点击我的订单,分页

后台
登录,订单管理,查看,立即发货,按订单号查询,分页
品类管理,查看子品类,新增品类,修改名称
商品管理,按商品id查询,修改上下架

数据表结构设计
1. 用户表
主键:id,唯一索引:username

  1. DROP TABLE IF EXISTS `mmall_user`;
  2. CREATE TABLE `mmall_user` (
  3. `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户表id',
  4. `username` varchar(50) NOT NULL COMMENT '用户名',
  5. `password` varchar(50) NOT NULL COMMENT '用户密码,MD5加密',
  6. `email` varchar(50) DEFAULT NULL,
  7. `phone` varchar(20) DEFAULT NULL,
  8. `question` varchar(100) DEFAULT NULL COMMENT '找回密码问题',
  9. `answer` varchar(100) DEFAULT NULL COMMENT '找回密码答案',
  10. `role` int(4) NOT NULL COMMENT '角色1-管理员,0-普通用户',
  11. `create_time` datetime NOT NULL COMMENT '创建时间',
2018-02-13 13:57:06    491    0    0

第5章 初始化和清理
用构造器确保初始化
创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造器,从而保证了初始化的进行。由于构造器的名称必须与类名完全相同,所以每个方法首字母小写的编码风格并不适用于构造器。在Java中,初始化和创建捆绑在一起,两者不能分离。

方法重载
在Java(和C++)里,构造器是强制重载方法名的另一个原因。

区分重载方法
每个重载的方法都必须有一个独一无二的参数类型列表,甚至参数顺序的不同也足以区分两个方法。

以返回值区分重载方法?

  1. void f() {}
  2. int f() { return 1; }
  3. f();

根据方法的返回值来区分重载方法是行不通的。

默认构造器
如果你写的类中没有构造器,则编译器会自动帮你创建一个默认构造器。

  1. class Bird {}
  2. public class DefaultConstructor {
  3. public static void main(String[] args) {
  4. Bird b = new Bird(); // Default!
  5. }
  6. }

但是,如果已经定义了一个构造器(无论是否有参数),编译器就不会帮你自动创建默认构造器。

  1. class Bird2 {
  2. Bird2(int i) {}
  3. Bird2(double d) {}
  4. }
  5. public class NoSynthesis {
  6. public static void main(String[] args) {
  7. //! Bird2 b = new Bird2(); // No default
  8. Bird2 b2 = new Bird2(1);
  9. Bird2 b3 = new Bird2(1.0);
  10. }
  11. }

new Bird2();这样写编译器就会报错:没有找到匹配的构造器。

this关键字

  1. class Banana { void peel(int i) { /* ... */ } }
  2. public class BananaPeel {
  3. public static void main(String
2018-02-11 18:28:02    418    0    0

第1章 网络基础
根据Web浏览器地址栏中指定的URL,Web浏览器从Web服务器端获取文件资源(resource)等信息,从而显示出Web页面。
Web使用一种名为HTTP(HyperText Transfer Protocol,超文本传输协议)的协议作为规范,完成从客户端到服务器端等一系列运作流程。而协议是指规则的约定。可以说,Web是建立在HTTP协议上通信的。
WWW=World Wide Web

TCP/IP协议族
计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则,而我们就把这种规则称为协议(protocol)。

TCP/IP协议族按层次分别分为以下4层:应用层、传输层、网络层和数据链路层。
应用层:
决定了向用户提供应用服务时通信的活动,HTTP也属于应用层。
FTP(File Transfer Protocol,文件传输协议)
DNS(Domain Name System,域名系统)

传输层:
对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。
TCP(Transmission Control Protocol,传输控制协议)
UDP(User Data Protocol,用户数据报协议)

网络层:
用来处理在网络上流动的数据包,数据包是网络传输的最小数据单位。网络层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。

链路层:
用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配卡,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。

TCP/IP通信传输流
图片标题

与HTTP关系密切的协议:IP、TCP和DNS
负责传输的IP协议
按层次分,IP(Internet Proto

2018-02-10 13:58:50    395    0    0

第1章 对象导论
面向对象程序设计(Object-oriented Programming,OOP)
所有编程语言都提供抽象机制,可以认为,所能够解决的问题的复杂性直接取决于抽象的类型和质量。
必须建立起在机器模型(位于解空间内)和实际待解问题的模型(位于问题空间内)之间的关联。
把问题空间中的元素在其解空间中的表示称为对象
纯粹的面向对象语言的5个特性:
1. 一切都是对象
2. 程序是对象的集合,之间通过调用请求发送消息
3. 每个对象都有自己的由其他对象所构成的存储
4. 每个对象都拥有其类型
5. 某一特定类型的所有对象都可以接收同样的消息(多态)
对象具有自己的属性和行为。
在程序执行期间具有不同的状态而其他方面都相似的对象会被分组到对象的类中,这就是关键字class的由来。创建抽象数据类型(类)是面向对象程序设计的基本概念之一,抽象数据类型的运行方式与内置类型几乎完全一致。因为类描述了具有相同特性(数据元素)和行为(功能)的对象集合,所以一个类实际上就是一个数据类型,程序员通过定义类来适应问题,而不再被迫只能使用现有的用来表示机器中的存储单元的数据类型。

每个对象都提供服务
高内聚,低耦合
组合 has a
继承 is a

多态
编译器不可能产生传统意义上的函数调用,一个非面向对象编程的编译器产生的函数调用会引起所谓的前期绑定,这意味着编译器会产生对一个具体函数名字的调用,而运行时把这个调用解析到要被执行的代码的绝对地址。面向对象程序设计语言使用了后期绑定的概念,当向对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查(无法提供此类保证的语言被称为是弱类型的),但是不知道要被执行的确切代码。

程序的可扩展性:

  1. void doSomething(Shape shape) {
  2. shape.erase();
  3. // ...
  4. shape.draw();
  5. }
  6. Circle circle = new Circle();
  7. Triangle triangle = new Triangle();
  8. Line line= new Line();
  9. doSom
2018-01-28 16:02:34    176    0    0

基本概念和背景
一些计算机组成的知识点:
1. 程序必须装入内存后,才能(以进程为单位)被CPU解释、执行
2. CPU能够直接访问的,只有主存、寄存器
3. 访问寄存器需要1个CPU时钟周期,很快
4. 访问主存需要许多时钟周期,或者,需要若干机器周期
5. Cache位于主存、寄存器之间

连续区内存分配
基地址(base)寄存器和界限(limit)寄存器共同划定逻辑地址空间。

逻辑地址空间vs物理地址空间
区别于物理地址空间的各种逻辑地址空间,是OS得以管理内存的必要条件。
逻辑地址:CPU产生的地址,也称为虚地址。
逻辑地址:非物理的各种地址标记包括符号名,包括编译、汇编、连接、装入操作产生的地址。
物理地址:内存单元接收到的地址。也就是说,浮现在地址总线的地址,以二进制形式表达。

存储管理单元(MMU)
CPU内部的硬件装置,其功能是把虚拟地址(逻辑地址)转换成物理地址。
一种简单的MMU策略是,在用户进程把逻辑地址送往地址总线前,MMU把重定位寄存器(relocation register)的值,加到这个逻辑地址。
用户进程只能处理逻辑地址,无法获取真正的物理地址。

交换(Swapping)
进程映像暂时传输到后备存储空间保存(换出,swap out),需要(执行)时再装入内存(换入,swap in)。

存储管理基本思想
y=f(x)
x为逻辑地址,y为物理地址
存储管理算法的评估和比较
1. 硬件支持 Hardware Support
2. 性能 Performance
3. 碎片 Fragmentation
4. 重定位 Relocation
5. 交换 Swapping
6. 内存共享 Memory sharing
7. 内存保护 Memory protection

非连续区内存分配
1. 页式内存管理
注意进程并不要求逻辑地址必须是连续的。
把物理空间等分成长度一致的数据块,称作页帧(frames),操作系统对空闲页帧进行统一管理。
把逻辑空间等分成长度一致的数据块,称作页(pages),并且与页帧长度相等。
通常,页长(也就是页帧长度)是2的幂次,

green    2018-01-04 21:18:46    190    0    0

1. final、finally和finalize的区别
final:
被final修饰的类不能被继承;
被final修饰的方法不能被重写;
被final修饰的变量不能被更改。

finally:
是异常处理的一部分,用于释放资源。一般来说,finally里面的代码一定会执行,除非在finally之前调用System.exit()方法终止JVM的运行。

finalize:
是Object类的一个方法,用于垃圾回收。
引用深入理解JVM一书中的一段话:
即使在可达性分析算法中不可达的对象,也并非是“非死不可”的,这时它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经理两次标记过程:如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机把这两种情况都视为“没有必要执行”。如果这个对象被判定为有必要执行finalize()方法,那么这个对象会被放置在一个叫F-Queue的队列之中,并在稍后由一个由虚拟机自动建立的、低优先级的Finalizer线程去执行它。这里所谓的“执行”是指虚拟机会触发这个方法,但并不承诺会等待它运行结束(防止发生死循环)。finalize()方法是对象逃脱死亡命运的最后一次机会,稍后GC会对F-Queue中的对象进行第二次标记,如果对象在finalize()方法中成功拯救自己——只要重新和引用链上的任何一个对象建立关联即可,那么在第二次标记时它会被移除出“即将回收”的集合,如果对象这个时间点还没有逃脱,那基本上它就真的被回收了。

2. 如果catch里面有return语句,那么finally里面的代码还会执行吗?执行顺序?
finally语句是在try的return语句执行之后,return返回之前执行。

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. /**
  4. * Created by sakura on 2018/1/4.
  5. */
  6. public class
2017-12-20 23:16:51    189    0    0

操作系统(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。

操作系统的特征:
并发、共享、虚拟、异步
并发:宏观上同时,微观上交替(时间片轮转)
并行:真正意义上的同时

操作系统的功能:
进程管理 存储管理 文件管理 设备管理

操作系统所能提供的服务:
1. 命令控制接口:
命令行、GUI、脚本、NUI(语音识别)
2. 系统调用:
创建、打开、读、写、关闭、删除
严格来讲,printf并不算系统调用,只是封装了sys...write()系统调用

操作系统的分类:
单用户操作系统
批处理操作系统
->单道批处理 多道批处理 脱机 联机
分时操作系统(主流)
实时系统
->硬实时 软实时(比较典型的是机顶盒)
网络操作系统
分布式操作系统(对用户透明的)
并行操作系统

操作系统的运行环境:
内核态与用户态(权限不同),内核态又称管态、核心态、系统态、特权模式
内核态:
能够访问所有系统资源,可以执行特权指令,可以直接操作和管理硬件设备
操作系统内核程序运行在内核态下,使用内核栈
用户态:
只能访问属于它的存储空间和普通寄存器,只能执行普通指令
用户程序以及操作系统核外服务程序运行在用户态下,使用用户栈

特权指令:不允许用户程序中直接使用的指令,eg..I/O指令、设置时钟、设置控制寄存器等指令都是特权指令。
非特权指令:用户程序中所使用的指令。

中断
中断是指CPU对系统中发生的异步事件的响应,异步事件是指无一定时序关系的随机发生的事件。
发生中断时正在执行的程序的暂停点称为中断断点
处理器暂停当前程序转而处理中断的过程称为中断响应
中断处理结束之后恢复原来程序的执行被称为中断返回
一个计算机系统提供的中断源的有序集合一般被称为中断字,这是一个逻辑结构,不同的处理器有着很不相同的实现方式。
中断一般可分为硬件中断和软件中断两种。
硬件中断又可分为硬件故障中断、输入输出中断和外部中断。
软件中断(异常)又可分为程序中断

2017-12-18 22:06:33    101    0    0

数据库是一个以某种有组织的方式存储的数据集合。

表(table):某种特定类型数据的结构化清单。表有一些特性,这些特性定义了数据在表中如何存储,如可以存储什么样的数据,数据如何分解,各部分信息如何命名等等,描述表的这组信息就是所谓的模式
模式(schema):关于数据库和表的布局及特性的信息。

表由列组成,列中存储着表中某部分的信息。
列(column):表中的一个字段,所有表都是由一个或多个列组成的。

数据库中每个列都有相应的数据类型,数据类型定义列可以存储的数据种类。
数据类型(datatype):所容许的数据的类型,每个表列都有相应的数据类型,它限制(或容许)列中存储的数据。

表中的数据是按行存储的,所保存的记录存储在自己的行内。
行(row):表中的一个记录。

表中的每一行都应有可以唯一标识自己的一列(或一组列)。
主键(primary key):一列(或一组列),其值能够区分表中的每一个行。
表中的任何列都可以作为主键,只要它满足以下条件:
1. 任意两行都不具有相同的主键值。
2. 每个行都必须具有一个主键值(主键列不允许null值)。
主键通常定义在表的一列上,但这并不是必需的,也可以一起用多个列作为主键。
主键的最好习惯:
1. 不更新主键列中的值。
2. 不重用主键列的值。
3. 不在主键列中使用可能会更改的值。

SQL(Structured Query Language)是一种专门用来与数据库通信的语言。

Mysql最近版本的主要更改:
4——InnoDB引擎,增加事务处理、并、改进全文本搜索等的支持。
4.1——对函数库、子查询、集成帮助等的重要增加。
5——存储过程、触发器、游标、视图等。

SELECT语句:从一个或多个表中检索信息。
使用SELECT检索数据,必须至少给出两条信息——想选择什么,以及从什么地方选择。
举个栗子:
SELECT prod_name FROM products;这条语句就是说从products表中检索一个名为prod_name的列。

需要注意的是SQL语句不区分大小写,但是建议关键字大写,列和表名小写。且在处理SQL语句时,其中所有的空格

2017-12-07 21:59:07    133    0    0

Demo
1. 创建Java Project,项目名称为MybatisLearning
2. 通过File->Project Structure->Modules->Dependencies->绿色的+号导入mybatis-3.4.2.jar和mysql-connector-java-5.0.8-bin.jar这两个包
3. 创建数据库(推荐用MySQLWorkbench)create database mybatis_learning
4. 接着创建表

  1. CREATE TABLE category_ (
  2. id int(11) NOT NULL AUTO_INCREMENT,
  3. name varchar(32) DEFAULT NULL,
  4. PRIMARY KEY (id)
  5. ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

5. 插入数据

  1. INSERT INTO category_ VALUES (null,'category1');
  2. INSERT INTO category_ VALUES (null,'category2');

6. IDEA中创建实体类Category

  1. package com.sakura.pojo;
  2. /**
  3. * Created by sakura on 2017/12/14.
  4. */
  5. public class Category {
  6. private int id;
  7. private String name;
  8. public int getId() {
  9. return id;
  10. }
  11. public void setId(int id) {
  12. this.id = id;
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. }

7. 创建配置文件mybatis-config.xml
在src目录下创建mybatis的主

green    2017-11-15 14:30:45    169    0    0

对于基本类型

  1. int a=3;
  2. int b=3;
  3. /*
  4. 1.处理int a=3;在栈中创建一个变量为a的引用。
  5. 2.查找有没有变量值为3的地址,没找到就开辟一个存放3这个字面值的地址,
  6. 然后把a指向3的地址。
  7. 3.处理int b=3;在创建完b的引用变量后,由于栈中已存在3的字面值,于是
  8. 把b直接指向3,这样就出现了ab均同时指向3的情况。
  9. */

需要注意的是,这种字面值的引用与类对象的引用不同。假定两个类对象的引用同时指向一个对象,如果一个对象引用变量修改了这个对象的内部状态,那么另一个对象引用变量也即刻反映出这个变化。相反,通过字面值的引用来修改其值,不会导致另一个指向此字面值的引用的值也跟着改变的情况。比如,我们在定义完a=b=3后,在令a=4;那么b不会等于4,还是等于3。在编译器内部,遇到a=4;时,它就会重新搜索栈中是否有4的字面值,如果没有,重新开辟地址存放4的值;如果已经有了,则直接把a指向这个地址。因此a值的改变不会影响到b的值。

对于引用类型

  1. public class StringDemo {
  2. public static void main(String[] args) {
  3. String s1 = new String("hello");//创建2个或1个对象
  4. String s2 = "hello";//创建1个或0个对象
  5. System.out.println(s1 == s2);// false
  6. System.out.println(s1.equals(s2));// true
  7. }
  8. }
  9. /*
  10. ==:比较引用类型比较的是地址值是否相同。
  11. equals:比较引用类型默认也是比较地址值是否相同,
  12. 而String类重写了equals()方法,比较的是内容是否相同。
  13. */

图片标题

END