cool037

导航

JavaWeb

调整代码排版 ctrl+alt+shift+L

web前端

Web标准

  1. HTML:网页的结构
  2. CSS:网页的表现
  3. JavaScript:网页的行为(交互效果)

HTML(HyperText Marekup Language)

  • 超文本:超越了文本的限制,可以展示文本、图片、音频和视频等
  • 由标签构成的语言。标签都是预定义好的

CSS(Cascading Style Sheet)

层叠样式表

  • 选择器,优先级从低往高
    1. 元素选择器
    2. id选择器
    3. 类选择器

表单

  • action:表单提交的url,往何处提交数据.如果个指定,默认提交到当前贝面
  • method:表单的提交方式.
    1. get:在url后面拼接表单数据,比如: ?username=Tom&age=12 , url长度有限制﹒默认值
    2. post:在消息体(请求体)中传递的,参数大小无限制的.
      表单项必须有name属性才可以提交

表单项

  • <input>:通过type属性克制输入形式
  • <select>: 定义下拉列表,
  • <textarea>:文本域

JavaScript

<script>
<\script>

var 作用域比较大,是全局变量;可以重复声明
let 只在所在的代码块有效,不能重复声明
const 定义常量,不能被改变

BOM(Browser Oblect Model) 浏览器对象模型

  1. Window:浏览器窗口对象
  2. Navigator
  3. Screen
  4. History
  5. Location:地址栏对象

DOM(Document Object Model):文档对象模型

  1. Document:整个文档对象
  2. Element:元素对象
  3. Attribute:属性对象
  4. Text:文本对象
  5. Comment:注释对象

事件监听

Vue:是一套前端框架,可以免除原生JS的DOM操作,简化书写

基于MVVM思想,实现数据的双向绑定,将编程的关注点放在数据上

Maven

是一个项目管理和构建工具

  • ...设置依赖作用范围。

三层架构

  1. controller:控制层,接受前端发送的请求,对请求进行处理,并响应数据
  2. service:业务逻辑层,处理具体的业务逻辑
  3. Dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增、删、改、查

分层解耦

高内聚低耦合

  1. 控制反转:Inversion of Control(IOC)。对象的创建控制权由程序自身转移到外部容器。@Component(衍生注解 @Controller, @Service, @Respository)
  2. 依赖注入:Dependency Injection(DI)。容器为应用程序提供运行时,所依赖的资源。 @Autowired(默认按照类型自动装配)
  3. Bean对象:IOC容器中创建、管理的对象。
    当有多个相同类型的Bean的时候,可以通过 1.@Primary(设置优先级) 2.@Autowired+@Qualifier 3.@Resource(默认按照名称注解)
  • @Resource 与 @Autowired区别
    @Autowired是spring框架提供的注解,而@Resource是JDK提供的注解。
    @Autowired默认是按照类型注入,而@Resource默认是按照名称注入。

数据库MySQL

命令

  1. 启动mysql:net start mysql
  2. 登录 mysql -u用户名 -p密码 [-hIP地址 -P端口号] 默认ip本机127.0.1.1 默认端口号3306
  3. 直接 exit

数据库管理系统:database management system(DBMS)

数据模型

  1. 关系型数据库:建立在关系模型基础上,由多张相互连接的二维表组成的数据库

SQL

  1. 通用语法
  • 可以单行或者多行,以分号结尾。
  • 可以用空行/缩进增强可读性
  • 不区分大小写
  • 注释:-- 注释内容或者 # 注释内容。多行注释/注释内容/
  1. DDL(数据库操作)
  • 查询所有数据库 show databases;
  • 查询当前数据库 select database();
  • 创建数据库 create database [if not exists] 数据库名;
  • 使用数据库 use 数据库名
  • 删除数据库 drop database [if exists] 数据库名;
    上述database可以替换成schema
  • 约束
  1. 数据类型
    数值类型、字符串类型、日期类型
  2. 修改表
    添加 add;
    修改字段类型 modify
    修改字段名和字段类型 change
    删除字段 drop table [if exits] 表名
    修改表名 rename table xx to xx

DML

  1. insert语法
    指定字段添加数据:insert into表名(字段名1,字段名2)values(值1,值2);
    全部字段添加数据:insert into表名values(值1,值2,..);
    批量添加数据(指定字段):insert into表名(字段名1,字段名2)values(值1,值2),(值1,值2);
    批量添加数据(全部字段):insert into表名values(值1,值2,..),(值1,值2,...);
  2. update语法
    update 表名 set 字段名1=值1,字段名2=值2,...[where 条件] 如果没有条件,就会修改整个表
  3. delete语法
    delet from 表名 [where 条件]

DQL

  1. select 字段列表
    查询多个字段:select字段1,字段2,字段3from表名;
    查询所有字段(通配符):select*from表名;
    设置别名:select字段1[as别名1],字段2[as别名2]from表名; (as可以省略)
    去除重复记录:select distinct字段列表from表名;

  2. from 表名列表

  3. where 条件列表

  4. group by 分组字段列表

  5. having 分组后条件列表

  6. order by 排序字段列表

  7. limit 分页参数

多表设计

  1. 一对多:只需要在多的一方关联一的主键

    这是物理外键。
    缺点:影响增删改的效率(需要检查外键关系);仅适用于单节点数据库,不适用分布式、集群场景;容易引发数据库的死锁问题
  2. 一对一:在任意一方加入外键,关联另一方的主键,并且设置外键为唯一的(UNIQUE)
  3. 多对多:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

内连接

  1. 隐式内连接: selcet 字段列表 from 表1,表2 where 条件 ...;
  2. 显式内连接: select 字段列表 from 表1 [inner] join 表2 on 连接条件;

事务

事务是一个不可分割的工作单位,会把所有的操作作为一个整体一起向系统提交或撤销操作请求。操作要么同时成功,要么同时失败
事务控制:

  1. 开启事务 start transaction; /begin
  2. 提交事务 commit
  3. 回滚事务 rollback

数据库四大特性(ACID)

  1. 原子性
  2. 一致性
  3. 隔离性
  4. 持久性

Mybatis

  1. 配置文件 包括驱动类名称、数据库连接的url、用户名、密码
@Mapper
public interface UserMapper{
@Select("select * from user**")
publicList<User> list();
}

JDBC

是sun公司提供的一套操作关系型数据库的API(规范),各个数据库厂商负责提供实现(驱动)

数据库连接池

是个容器,负责分配、管理数据库连接。
标准接口:DataSource。 获取连接 getConnection()

数据封装

  1. 实体类属性名和数据库表查询返回的字段名一致时,mybatis会自动封装
  2. 如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装
  • 解决方法:
    1. 给字段起别名,让别名和实体类属性一致
    2. 通过@Results,@Result注解手动映射封装
@Results({
@Result(column="", property=""),  column是字段名,property是实体类属性
@Result(column="", property="")
})
  1. 开启mybatis的驼峰命名自动映射开关 a_column-->aColumn
mybatis.configuration.map-underscore-to-camel-case=true

lombok

增删改查

  1. 根据主键删除 #{}
@Delete("delete from emp where id=#{id}")
public void delete(Integer id);

#{}在预编译时占位符会被?代替,这种方式不仅性能好,安全性也高,通过预编译的SQL可以防止SQL注入. delete from emp where id=?。要注意在字符串中是不能使用#{}的,这时候要使用concat()函数
${}拼接SQL,直接将参数拼接再SQL语句中,存在SQL注入问题。一般对表名、列名进行动态设置时使用。 delete from emp where id=1

  1. 新增:可以用实体对象进行封装,values是使用属性名而不是字段名
  2. 新增(主键返回)
    在数据添加成功后,需要获取插入数据库数据的主键
    加入注解 @Options(keyProperty="id",useGeneratedKeys=True)
  3. 更新(一般根据主键修改)
  4. 条件查询

XML映射文件

动态SQL

<where> </where>标签可以判断条件是否成立, 成立时加上where,还可以动态去除多余的and 和or;
<set> </set>替换set关键词,可以去掉字段后面多余的逗号

  1. <if>
    用于判断条件是否成立,使用test属性急性条件判断,如果条件为true,就拼接SQL
    <if> </if>
  2. <foreach>
    collection:遍历的集合
    item: 遍历出来的元素
    separator: 分隔符
    open: 遍历开始前拼接的SQL片段
    close: 遍历结束后拼接的SQL片段
  3. <sql> <include> 增加代码的复用性
    <include>中有refid属性来引用唯一命名

案例

  1. 新建一个工程,所需要的依赖有:Spring Web, MySQL Driver, Lombok, MyBatis Framework
  2. Resource中的`application.properties进行数据库连接、开启mybatis日志输出、开启驼峰映射
配置文件application.properties中引入mybatis的配置信息,准备对应的实体类
- application.properties
~~~properties
#数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/tlias
spring.datasource.username=xxx
spring.datasource.password=xxx
#开启mybatis的日志输出
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

#开启数据库表字段 到 实体类属性的驼峰映射
mybatis.configuration.map-underscore-to-camel-case=true

  1. 定义实体类
  2. 准备对应的Mapper: 用于定义对实体类的各种数据库操作方法。其中mapper注解是告诉mybatis或者springboot这个接口是Mapper,要生成对应的代理实现类,并且将该对象交给IOC容器管理
  3. 准备业务层Service的接口定义和实现类定义
  4. 准备控制层Controller: 用于处理HTTP请求,并且返回的是JSON或XML等数据,而不是视图页面

开发规范-Restful

表述性状态转换,是一种软件架构风格。
URL定位资源,HTTP动词描述操作。描述模块的功能通常使用复数

  • Get 查询id为xxx的用户
  • POST 新增用户
  • PUT 修改用户
  • DELETE 删除id为xxx的用户

注意问题

  1. @Slf4j 等价于 private static Logger logger = LoggerFactory.getLogger(DeptController.class),只用在类名上加入这个注解就相当于记录日志了
  2. @RestController 会在返回数据的时候把数据转为json
  3. @RequestMapping用来抽取共同路径,一个完整的请求路径,应该是类上的@RequestMapping的value属性 + 方法上的@RequestMapping的value属性
  4. @RequestParam(defaultValue="1") 设置请求参数默认值

分页插件PageHelper

引入依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.2</version>
</dependency>

使用:

  • PageHelper.startPage(pageNum, pageSize);
  • List list = empMapper.list();
  • Page page = (Page) list;

UUID

通用唯一识别码

阿里云OSS(Object Storage Service)

  • @PathVariable: 从 URL 路径中提取参数,并将其绑定到方法的参数上
  • @RequestBody: 将 HTTP 请求体中的 JSON 或 XML 数据自动转换为 Java 对象,并绑定到方法参数上。

配置文件

  1. application.properties:键值对=
  2. application.yml/yaml:有缩进:
  3. XML
  4. java系统属性和命令行参数
    优先级 命令行参数>系统属性>propoties>yml>yaml

yml数据格式(主流)

  1. 对象/Map集合
user
  name: zhangsan
  age: 18
  password: 123456
  1. 数组/List/Set集合:
hobby:
 - jave
 - game
 - sport
@Data //生成get set方法
@Component  //交给IOC容器管理
@ConfigurationProperties(prefix = "aliyun.oss") //属性自动注入加上前缀
public class AliOSSProperties {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
}
  • @ConfigurationPropertied 和@Value 都是用来注入外部配置的属性的
    @Value 只能一个一个的进行外部属性的注入
    @ConfigurationPropertied 可以批量的将外部的属性配置注入到bean对象的属性中

登录认证功能:通过账号和密码查询

登录校验:

  1. 会话技术:
  • 会话:一次会话中可以包含多次请求
  • 会话跟踪:识别多次请求是不是来自同一浏览器,以便在同一次会话的多次请求共享数据
  • 会话跟踪方案
    1. 客户端会话跟踪技术 Cookie, 是HTTP协议中的请求头、响应头。 优点:HTTP协议中支持的技术 ;缺点:移动端APP无法使用Cookie;不安全,用户可以自己禁用Cookie;Cookie不能跨域(跨域区分的三个维度:协议、IP/域名、端口)
    2. 服务端会话跟踪技术 Session 优点:存储在服务器,安全 缺点:服务器集群环境下无法直接使用Session;Cookie的缺点;
    3. 令牌技术(主流技术) 优点:支持PC端、移动端;解决集群环境下的认证问题;减轻服务器端存储压力 缺点:需要自己实现
  1. JWT令牌(JSON Web Token) 基于JSON数据格式安全传输信息
    1. Header(头) 记录令牌类型、签名算法等。使用Base64编码
    2. Payload (有效载荷) 携带一些自定义信息、默认信息等
    3. Signature (签名) 防止Token被篡改、确保安全性。将Header和Payload加入指定密钥,通过指定签名算法计算而来
  2. 过滤器Filter @WebFilter(urlPatterns="/*"),@ServletComponentScan
  3. 拦截器Interceptor
  4. 全局异常处理器 @RestControllerAdvice @ExceptionHandler

事务管理

  1. @Transactional 默认RuntimeException异常的时候才回滚,rollbackFor用来控制出现何种异常类型的时候回滚事务。
    将当前方法交给spring进行事务管理,方法执行前开启事务,执行完毕提交事务,出现异常回滚事务。 一般在业务层的方法上、类上
  2. 事务传播行为propagation。默认REQUIRED是加入事务,会受其他事务的影响;指定参数propagation = Propagation.REQUIRES_NEW的时候才会新建事务,不受其他事务的影响,比如下订单前要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录成功。

AOP

  • Aspect Oriented Programming(面向切面编程、面向方面编程),其实说白了,面向切面编程就是面向特定方法编程。

  • @Component @Aspect

  • 通知类型

  • PointCut 抽取公共的切点表达式

  • 通知顺序

  1. 同一个类中,按照方法名字排序
@Around 最外层(最先进来,最后出去)

@Before 在 @Around 的中间

@AfterReturning 在最后成功返回时

@AfterThrowing 是抛异常时执行

@After 是无论成功失败都会执行(finally)
  1. 不同类中,按照类名字母顺序排序。可以用@Order(数字) 来定义顺序,越小越早执行
  • 切入点表达式
  1. execution
  2. execution
  3. @annotation,用于匹配标识有特定注解的方法

posted on 2025-04-13 20:54  海然  阅读(5)  评论(0)    收藏  举报