网站制作可以,wordpress小程序商城,鹰潭做网站的,中州建设有限公司网站本文用于检验学习效果#xff0c;忘记知识就去文末的链接复习
1. 网络基础
1.1 计网基础
区分设备#xff1a;IP地址
区分网络#xff1a;网络地址
网络互联#xff1a;路由器
主机上进程间通信#xff1a;端口
http是常用的协议#xff0c;基于TCP协议
TCP VS U…本文用于检验学习效果忘记知识就去文末的链接复习
1. 网络基础
1.1 计网基础
区分设备IP地址
区分网络网络地址
网络互联路由器
主机上进程间通信端口
http是常用的协议基于TCP协议
TCP VS UDP
TCP 有连接握手建立连接 UDP 无连接不建立连接快数据丢失不会重传
1.2 Socket技术
Socket有什么用
可实现 两台计算机上进程 之间的通信通过网络
复习
Java创建Socket对象和Server对象Socket通信过程协议域名端口用Socket传输数据字节字符Socket传输文件字节Socket访问浏览器接收数据是一堆字符有格式
2. 数据库基础
什么是数据库
数据的有序集合。数据放在数据表中便于管理数据。
常见数据库
MySQLMicrosoft SQL ServerOracle
常见数据库管理软件
NavicatDataGrip
常见配置
字符集(支持中文)utf8mb4utf8只有3字节有时会出问题排序规则utf8mb4_general-ci
2.1 安装一个数据库
一般用MySQL学习
本地安装下载安装包在本地安装服务器安装在服务器上安装MySQL宝塔面板等可通过公网IP访问在线购买在阿里云腾讯云上购买云数据库产品
2.2 数据模型
实体-联系模型Entity-Relationship ModelE-R MODEL ER图E-R Diagram
实体
属性
联系
1:1n:1n:m
2.3数据库的规范化
键
主键外键
范式具体定义看书
逐层递进减少数据库间的冗余信息和依赖关系
第一范式1NF每一列都不可拆分 如“信息”这个列太模糊可继续细分 第二范式2NF表中必须有主键其他属性完全依赖主键 如“学号”作为主键 第三范式3NF所有属性不传递依赖于主键 处理分表消除传递依赖 BCNF 每个表只存储一种信息没有任何冗余信息
2.4 SQL语句
增查改删CRUDCreate/Retrive/Update/Delete
SQL数据类型
char(n)可存储固定长度为n的字符串
varchar(n)可存储任意数量字符串
存储数字
smallintintbigintfloatdouble
存储时间
date日期time时间year年份datetime日期时间
2.4.1 数据库定义语言(Data Definition Language,DDL)
--创建数据库
CREATE DATABASE 数据库名
--删除数据库
DROP DATABASE 数据库名
--创建表
CREATE TABLE
--修改表
ALTER TABLE
--删除表
DROP TABLE创建数据库study
CREATE DATABASE study;删除数据库study
DROP DATABASE study;创建一张表
CREATE TABLE students ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, age INT
);查询数据
查看USER表中的tHost,tUSer列
SELECT tHost,tUSer FROM USER;修改数据
alter
如果你有一个名为 students 的表并且你想在这个表中添加一个名为 age 的整数列你可以使用以下命令
ALTER TABLE students
ADD age INT;CONSTRAINT列级约束条件
主键Primary Key外键Foreign Key唯一unique检查check默认default非空/空not null/null
表级约束条件
主键Primary Key外键Foreign Key唯一unique检查check
2.4.2 数据操纵语言(Data Manipulation Language,DML)
--插入数据
INSERT INTO
--修改数据
UPDATE 表名 SET 列名值,... WHERE 条件
--删除数据
DELETE FROM 表名
DELETE FROM 表名 WHERE 条件
2.4.3 数据库查询语言(Data Query Language,DQL)
-- 指定查询某一列数据
SELECT 列名[,列名] FROM 表名
-- 会以别名显示此列
SELECT 列名 别名 FROM 表名
-- 查询所有的列数据
SELECT * FROM 表名
-- 只查询不重复的值
SELECT DISTINCT 列名 FROM 表名
--添加where字句来限定查询目标
SELECT * FROM 表名 WHERE 条件
--将查询结果排序SELECT * FROM 表名 WHERE 条件 ORDER BY 列名 ASC|DESC常用查询条件WHERE中使用
,,,,,!是否在集合中in,not in模糊匹配like,not like多重连接and,or,not
排序默认升序
ASC升序DESC降序
聚集函数
count([distinct]*)统计所有的行数distinct表示去重count([distinct]列名)统计某列的值总和sum([distinct]列名)求一列的和注意必须是数字类型的avg([distinct]列名)求一列的平均值注意必须是数字类型max([distinct]列名)求一列的最大值min([distinct]列名)求一列的最小值
分组/分页查询
分组GROUP BY分页HAVING限制数量LIMIT
--分组
SELECT sum(*) FROM 表名 WHERE 条件 GROUP BY 列名
--分页
SELECT sum(*) FROM 表名 WHERE 条件 GROUP BY 列名 HAVING 约束条件
--限制查询的数量只取前n个结果
SELECT * FROM 表名 LIMIT 数量多表查询
--默认笛卡尔积
SELECT * FROM 表1, 表2
SELECT * FROM 表1, 表2 WHERE 条件
--自身连接要起别名
SELECT * FROM 表名 别名1, 表名 别名2连接
外连接内连接inner join交集左连接left join左边都要有右边缺失值为空右连接right join
嵌套查询
将一个查询的结果作为另一个查询的条件
SELECT * FROM 表名 WHERE 列名 (SELECT 列名 FROM 表名 WHERE 条件)2.4.4 数据库控制语言(Database Control Language,DCL)
--创建用户
CREATE USER 用户名 identified by 密码;
--登录
login -u 用户名 -p
--授权授权后才可看数据库
grant all|权限1,权限2...(列1,...) on 数据库.表 to 用户 [with grant option]--创建视图
CREATE VIEW 视图名称(列名) as 子查询语句 [WITH CHECK OPTION];
--删除视图
drop view apptest-- 创建索引
CREATE INDEX 索引名称 ON 表名 (列名)
-- 查看表中的索引
show INDEX FROM student
--删除索引
drop index 索引名称 on 表名--创建触发器
CREATE TRIGGER 触发器名称 [BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON 表名/视图名 FOR EACH ROW DELETE FROM student WHERE student.sno new.sno
--查看触发器
SHOW TRIGGERS
--删除触发器
DROP TRIGGER 触发器名称--查看数据库引擎
SHOW ENGINES;begin; #开始事务
...
rollback; #回滚事务
savepoint 回滚点; #添加回滚点
rollback to 回滚点; #回滚到指定回滚点
...
commit; #提交事务
-- 一旦提交就无法再进行回滚了视图本质就是一个查询结果
打开视图时可看到期待的查询结果。是个虚表不是真实存在的表
索引快速查询
类似Hash表可快速定位元素的位置
触发器
在某种条件下会自动触发在select/update/delete时会自动执行我们预先设定的内容触发器通常用于检查内容的安全性相比直接添加约束触发器显得更加灵活。触发器所依附的表称为基本表new表/old表
事务
把一系列SQL操作整理起来变成一个整体ACID特性 原子性一致性隔离性持久性
函数存储过程
它们能够捆绑一组SQL语句运行并且可以反复使用大大提高工作效率。
3. java与数据库
3.1 JDBCJava Data Base Connectivity
用java连接数据库操作数据库定义了接口规范接口由数据库实现使用步骤 导入依赖jar包用JDBC连接数据库操作数据库
JDBC中一些类
Driver ManagerConnectionStatement用于执行SQL
操作
DML操作DQL操作
批处理statement.addBatch()
查询结果映射对象
把查询结果传进构造函数反射
SQL注入攻击
用户在输入数据时破坏原有的SQL语句恶意操作数据库 可限制用户输入一些SQL语句关键字但关键字太多这方法不太好 用PrepareStatement执行SQL命令可解决以上问题 需要给出SQL语句格式
管理事务
con.setAutoCommit(); //关闭自动提交后相当于开启事务。
// 这里是SQL语句
con.commit();或 con.rollback();3.2 Lombok
自动生成set/get/构造函数编译时处理代码修改语法树加上函数
使用方法
导入jar包将jar文件拖入idea右键-添加为项目在IDEA中下载插件
标签
java中的goto
lombok注解
减少样板代码使得 Java 类更加清晰和简洁。在类前加注解在 方法/属性 前加注解可定义访问权限 AccessLevel.PUBLICAccessLevel.PRIVATE SetterGetterToString exclude省略一些内容of留下一些内容与exclude相反的callsupertoString中调用父类的toString方法调用get方法获取属性 doNotUseGetters不用get方法直接用属性 onlyExplicitlyIncluded是否包含全部字段ToString.Include指定要包含的字段 rank越大等级越高name别名 EqualsAndHashCodeAllArgsConstructor有所有参数的构造函数 staticName静态函数返回一个对象force给final类型变量一个默认值 NoArgsConstructor无参数的构造函数RequiredArgsConstructor只构造需要构造的属性 final类型变量 Data 包含SetterGetterRequiredArgsConstructorToStringEqualsAndHashCode不建议有继承关系因为equal方法结果可能与预期不符 Value 不会生成setter成员属性都是final的 SneakyThrows自动生成try-catch代码块 Exception.classIOException.class Cleanup自动调用close如IO流用完要closeBuilder快速生成建造者模式 Builder.Default指定默认值Builder.ObtainVia指定默认值的获取方式setterPrefix方法名前加前缀.Default属性默认值.ObtainVia在Builder过程中通过指定方法指定属性值toBuilder把对象变回Builder
getter中懒加载有什么用在编程中lazy 属性或特性通常用于实现懒加载lazy loading模式。
懒加载意味着对象的某些属性或资源的初始化会延迟到它们真正被需要时才进行而不是在对象创建时立即进行。
这种策略对于优化性能非常有用特别是在处理计算密集型操作或需要消耗大量资源的操作时。在 getter 上下文中lazy 属性可以确保当你第一次访问某个属性时其背后的计算或初始化操作才会执行
并且其结果会被缓存起来以便后续访问时直接返回而不需要重新计算或初始化。3.3 Mybatis
JDBC还是不够好用用Mybatis可更方便地操作数据库
知道什么是XML
XML语法跟HTML很像。里面写的是配置
配置
mybatis-config.xmlTestMapper.xmlpojo文件/entity文件中创建java类写selectList不够方便怎么办用接口xxxMapper.java与TestMapper.xml相关联
修改xml切换数据库环境
数据源
别名
增删改查
读取到数据后可映射为实体类或map通过resultMap设定映射规则通过constructor设定要调用的构造函数
自动映射首字母小写后面的驼峰
类中有多个构造方法【容易出问题】
只能有一个构造方法有条件的多了会出问题部分参数被构造方法使用实体类没有被正确构建
按学号查找信息
select * from student where sid #{sid}
插入学生信息
insert student(name,sex) values(#{name}, #{sex})
“一对多”
resultMapcollection
“多对一” -resultMap
association
事务
动态SQL
ifchooose(when, otherwise)trim(where, set)foreach
缓存机制
何时清空缓存
插入操作后会话结束后
缓存分级
优先级二级----一级—数据库cache—主存—硬盘一级缓存对应session二级缓存对应mapper需要启用
解决缓存机制导致的不一致问题
关闭缓存但存取数据时会有额外开销
使用注解开发
在mybatis-config.xml中的 mappers 中注册 单独注册 mapper批量注册 packge select等many/oneConstructorArgs
3.4 JUnit单元测试
测试某个小功能时没必要重新启动整个项目
使用步骤
导入jar包编写测试用例加注解Test 断言Assert. Before前置操作Test执行前会执行这个 有些前置操作只需要一次怎么办juint5 After
JUL日志系统JDK提供的
使用流程 获取日志打印器调用info输出信息
日志级别高到低
SEVERE严重错误WARNING某些警告INFO默认常规消息该等级以下默认不会被打印CONFIGFINEFINERFINEST
我们想开发时输出所有日志上线后正常输出日志
输出所有日志
修改日志级别不使用默认日志处理器使用自定义日志处理器
可以用文件处理器打印日志
可以添加过滤器不让某些日志显示
了解Properties配置文件
常见操作 Properties类properties.loadproperties.store hashtable VS hashmap
可用lombok快速开发日志
Log
Mybatis也有日志系统
启用读取配置
4. Maven管理项目
Maven能管理jar包手动导入太麻烦
在IDEA中
创建maven项目配置maven路径IDEA的设置中设置默认maven配置在C:\Users\用户\AppData\Roaming\JetBrains\IntelliJIdea2023.3\options
如何导入jar包
在官网找到插入依赖的xml插入到pom中
依赖属性
typescope依赖的作用域 compile编译测试运行时有效provided编译测试时有效lombokruntime运行测试时有效test测试时有效JUnit optionalexclusions
从本地找依赖
dependencies dependency groupIdcom.example/groupId artifactIdmy-local-lib/artifactId version1.0/version scopesystem/scope systemPath${project.basedir}/lib/my-local-lib-1.0.jar/systemPath /dependency
/dependencies可选依赖
optionaltrue/optional排除依赖
exclusionsexclusiongroupIdorg.junit.jupiter/groupIdartifactIdjunit-jupiter-engine/artifactId/exclusion
/exclusions依赖的继承关系
父项目中的dependencies会被子项目直接继承父项目中的dependencyManagement在子项目中引入后也可继承不用写版本号子项目间也可互相导入
maven常用命令
clean清除target中的文件validate验证项目的可用性compile编译项目install将当前项目安装到本地maven仓库之后可被其他项目导入verify按顺序执行默认生命周期阶段validatecompilepackagetest执行test目录下的所有测试用例package把项目打包为jar包默认不含依赖 pom中添加插件可将依赖也一并打包 deploy发布命令到本地仓库和远程仓库site生成当前项目的发布站点
参考
https://www.itbaima.cn/document/ggwwj09j2vkfftvd
https://www.bilibili.com/video/BV1CL4y1i7qR