JavaWeb阶段知识树
2020-04-21 09:35:17 20 举报AI智能生成
JavaWeb阶段知识体系结构图,持续添加知识内容。供大家一起学习。Author:Ziph
javaweb
javaweb思维导图
模版推荐
作者其他创作
大纲/内容
MySQL知识树
关于数据的存储方式
瞬时状态数据
变量、对象、集合等稍纵即逝就结束了他们的生命
持久化状态存储
我们知道可以利用流来进行持久化存储到文件中的,这是一个例子
数据库存储
数据库可以按照数据结构来组织、存储、管理数据
瞬时状态存储数据和持久化状态存储数据的缺点
程序停止,数据就Over了
文件存储的数据没有数据类型的区分,也就是没有数据类型的区分我们使用起来很麻烦,有很大局限性
没有访问安全限制
没有备份和恢复机制
数据库的前置知识
数据库概念
数据库是 “按照数据结构来组织、存储、管理数据的仓库”。是一个可以长期存储在计算机内的、有组织的、有共享的、可以统一管理的数据集合
数据库的分类
网状结构数据库
以节点的形式存储数据和访问数据
层次结构数据库
IBM[IMS]。定向有序的树状结构实现存储和访问
关系结构数据库
Oracle、MySQL、DB2、SQL Server,以表格(Table)形式存储,多表之间建立关联关系,通过分类、合并、连接、选取等方式实现访问。
非关系型数据库
MongDB、Redis,使用哈希表,表中以键值(key-value)的方式实现特定的键和一个指针指向的特定数据
ElasteSearch
数据库管理系统
数据库管理系统:指的是一种操作和管理数据库的大型软件,用于建立、使用、维护数据库,对数据库进行统一的管理和控制,保证数据库的安全性和完整性。
用户通过数据库管理系统访问数据库中的数据
常见的数据库管理系统
Oracle:可以运行在UNIX、Windows等主流操作系统,支持所有的工业标准,并获得了最高级别的ISO标准安全性认证
DB2:IBM公司旗下产品,满足中大型公司的需要
SQL Server:微软公司推出的产品
SQLLite:手机端的数据库
MySQL:免费、适合中小型企业
MySQL前置知识
MySQL简介
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发的。属于Oracle旗下的产品。<br>
MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,是最好的应用软件之一。
MySQL配置环境变量
创建MYSQL_HOME:C:\Program Files\MySQL\MySQL Server 5.7
追加Path:%MYSQL_HOME%\bin;
MySQL下载安装及配置
MySQL的访问与下载
官网:https://www.mysql.com
官网下载地址:https://dev.mysql.com/downloads/mysql/
关于MySQL的安装以及彻底卸载MySQL
参考我的文章,在MySQL专栏里有详细记载
配置环境变量
创建MYSQL_HOME:C:\Program Files\MySQL\MySQL Server 5.7<br>追加Path:%MYSQL_HOME%\bin;
如果不明白或者不会也可以去参考我的文章,也是有详细记载的
MySQL目录结构及配置分析
MySQL的目录结构
bin:存储的是命令相关文件<br>
include:存储的是库文件
lib:存储头文件
share:存储关于字符集、语言等信息
MySQL配置文件(my.ini)
default-character-set:客户端默认字符集
character-set-server:服务器端默认字符集
port:客户端和服务端的端口号
default-storage-engine:MySQL的默认存储引擎INNODB
SQL语言前置知识
SQL:结构化查询语言,用于存取数据、更新、查询和管理关系数据库系统的程序设计语言。
经验:通常执行对数据库的"增、删、改 、查",简称C(Create)、R(Retrieve)、U(Update)、D(Delete)
MySQL的应用:对于数据库的操作,需要在连接MySQL的环境下进行指令输入,并在一行指令的末尾使用 ; 结束
客户端工具
Navicat:是一套快速、可靠并且价格便宜的数据库管理工具,专为简化数据库管理及降低系统管理成本而设。
SQLyog:也拥有图形化界面。拥有广泛的预定义工具和查询、友好的视觉界面。类似Excel的查询结果编辑界面
DataGrip(Idea开发工具集成):捷克公司的产品。需要付费。如果买了idea,DataGrip通用
使用客户端工具执行SQL脚本
创建一个companyDB的数据库,然后在对象浏览器区,右键->执行SQL脚本->找到文件,打开->点击执行
关于MySQL默认数据库的详解
information_schema
用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等
mysql
核心数据库,存储配置、存储用户、关键字等重要数据
performance_schema
用于性能分析的数据库
sakila
Sakila样本数据库介绍, 一个模拟DVD租赁信息管理的数据库,提供了一个标准模式,可作为书中例子,教程、文章、样品,等等
sys
Sys库所有的数据源来自:performance_schema。目标是把performance_schema的把复杂度降低,让DBA能更好的阅读这个库里的内容。让DBA更快的了解DB的运行情况。
world
存储各个国家的语言信息的数据库
test
用于存放测试数据的数据库
操作数据库的基础SQL命令
登录命令
mysql -uroot -p
看MySQL中所有数据库
SHOW DATABASES
创建自定义数据库
CREATE DATABASE
删除数据库
DROP DATABASE
查看数据库创建信息
SHOW CREATE DATABASE
修改数据库
ALTER DATABASE
使用数据库
USE
查看当前使用的数据库
SELECT DATABASE();
数据表结构
关系结构数据库是以表格(Table)进行数据存储,表格由行和列组成
经验:执行查询语句返回的结果集是一张虚拟表
数据查询(DQL)<br>
基本查询
语法:SELECT 列名 FROM 表名
查询所有列
SELECT 所有的列名 FROM t_表名;
SELECT * FROM t_表名;
注意:两种方式都可以,第一种方式列名与列名之间用“,”隔开
经验:生产环境下,优先使用列名查询。*的方式虽然看起来便捷,但实际上需要转换成全列名,效率低,可读性差
关于列中数据运算问题
对列中数据进行运算可以使用加、减、乘、除
注意: % 在数据库中,代表的是占位符,而并非取余运算符
列的别名(AS)
SELECT 列名 AS '别名' FROM t_表名;
注意:省略AS也可以查询到结果,但不推荐,作为了解即可,因为我们要遵循语法规范
查询结果去重(distinct)
SELECT DISTINCT 列名 FROM 表名;
排序查询(GROUP BY)
分类
单列排序
多列排序
SELECT 列名 FROM 表名 ORDER BY 排序列名 排序规则
排序规则
ASC:做升序排序
DESC:做降序排序
经验:当进行升序排序时,排序规则可以不显示声明。默认为升序排序规则
条件查询(WHERE)
SELECT 列名 FROM 表名 WHERE 条件
WHERE:在查询结果中,筛选符合条件的查询结果。条件为布尔表达式
判断符号
等值判断:=
注意:与Java不同(==),MySQL中等值判断用 =
不等值判断:>、<、>=、<=、!=、<>
注意:!=和<>是同一作用,意为不等于
逻辑判断(and、or、not)
简单理解:与、或、非
区间判断(between and)
判断两个值的区间边界
注意:between and要遵循 between 小值 and 大值;
NULL值判断(IS NULL、IS NOT NULL)
IS NULL:判断为空
SELECT 列名 FROM 表名 WHERE 条件 IS NULL
IS NOT NULL:判断不为空
SELECT 列名 FROM 表名 WHERE 条件 IS NOT NULL
注意:这里可以使用NOT先进行取反,后判断为空,意为判断该列名不为空
枚举查询(IN (值1,值2,值n…))
查询列名中值1、值2...的信息
SELECT 列名 FROM 表名 WHERE 条件 IN(值1,值2)
模糊查询(_、%)
查询某个表名中的NAME(列名:名字)开头字母为S,名字长度为2的信息(一个下划线代表一个长度)
SELECT NAME FROM 表名 WHERE NAME LIKE 'S_';
一般用在查询某个列名中字符串以某个字符开头后的长度,这里用到了"_"下划线
注意:也可以是某个字符后开头的任意长度,这里就用到了%,例如:LIKE 'S%'
分支结构查询
CASE<br> WHEN 条件1 THEN 结果1<br> WHEN 条件2 THEN 结果2<br> WHEN 条件3 THEN 结果3<br> WHEN 条件4 THEN 结果4<br> ELSE 结果<br>END
注意:通过使用CASE END进行条件判断,每条数据对应生成一个值
经验:类似Java中的分支结构
注意:case分支结构产生一个新的列
时间查询
SELECT 时间函数([参数列表]);
经验:执行时间函数查询,会生成一张虚拟表(一行一列)
时间函数
SYSDATE()
当前系统时间(年、月、日、时、分、秒)
CURDATE()
获得当前日期
CURTIME()
获得当前时间
WEEK(DATE)
获得指定日期是一年中第几周
YEAR(DATE)
获得指定日期的年份
MONTH(DATE)
获得指定日期的月份
DAY(DATE)
获得指定日期的天
HOUR(DATE)
获得指定时间的小时值
MINUTE(DATE)
获得指定时间的分钟值
SECOND(DATE)
获得指定日期的秒值
DATEDIFF(DATE1,DATE2)
获得DATE1和DATE2之间相隔的天数
ADDDATE(DATE,N)
在指定日期加上N天后的日期
字符串查询
SELECT 字符串函数(参数列表);
经验:执行字符串函数,产生一张虚拟表,(一行一列)
字符串函数
CONCAT(str1,str2,str3…)
将多个字符串进行拼接
INSERT(str,pos,len,newStr)
将str中指定pos位置开始len长度的内容替换为newStr
LOWER(str)
将指定字符串转换为小写
UPPER(str)
将指定字符串转换为大写
SUBSTRING(str,pos,len)
将str字符串指定pos位置开始截取len个内容
注意:可能有点sql命令不是这样子的,他其中包含关键字,这是你使用的可视化工具的差异性
关于查询的聚合函数
SELECT 聚合函数(列名) FROM 表名;
经验:聚合函数式对多条数据的单列进行统计,返回统计后的一行结果
聚合函数
COUNT()
求总行数
SUM()
求单列中所有行的总和
AVG()
求单列中所有行的平均值
MAX()
求单列中所有行的最大值
MIN()
求单列中所有行的最小值
注意:聚合函数中,自动忽略null值。不进行统计
分组查询
SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组依据(列名)
GROUP BY
分组依据。如果有WHERE,在WHERE之后生效
注意:分组查询中,select显示的列只能是分组依据的列或者是聚合函数列,不能出现其他列。
分组过滤查询
SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组依据(列名) HAVING 过滤规则
HAVING
过滤规则是对分组后的数据进行过滤
限定查询
SELECT 列名 FROM 表名 LIMIT 起始行,查询行
LIMIT offset_start,row_count
限定查询结果的起始行和总行数
注意:起始行是从0开始,代表了第一行。第二个参数代表的是从指定行开始查询几行
查询范围记录
经验:在分页的应用场景中,起始行是跟随页数变化的,但是一页显示的条数是不变得
关于子查询
子查询(作为条件判断)
将一个查询语句作为条件插入另一个查询语句进行查询
SELECT 列名 FROM 表名 WHERE 条件(子查询结果)
注意:将子查询"一行一列"的结果作为外部查询的条件。做第二次查询
子查询得到的是一行一列的结果才能作为外部条件的等值或不等值判断条件
子查询(作为枚举查询的条件)
SELECT 列名 FROM 表名 WHERE 列名 IN(子查询结果)
经验:将子查询得到的"多行一列"的结果作为外部查询的枚举查询条件,做第二次查询
注意:当子查询结果集为多行单列时,也可以使用ALL匹配所有或者ANY匹配部分
子查询(作为一张表)
SELECT 列名 FROM (子查询结果集) WHERE 条件;
经验:将子查询得到的"多行多列"的结果作为外部查询的一张临时表,做第二次查询
合并查询(了解即可)
语法
SELECT 列名 FROM 表名 1 UNION SELECT 列名 FROM 表名2
SELECT 列名 FROM 表名 1 UNION ALL SELECT 列名 FROM 表名2
注意:合并的两个结果集,列数必须相同,列类型、列名可以不同
关于表连接查询
SELECT 列名 FROM 表1 连接方式 表2 ON 连接条件;
内连接查询(INNER JOIN ON)
多表连接查询
经验:多表查询时,要明确哪一张表和连接的表有关系。
左外连接查询(LEFT JOIN ON)
注意:左外连接,是以左表为主表,依次向右表匹配,匹配到,则返回正确结果
匹配不到,则返回NULL值,填充显示
左外连接:左边有的,右边没有的为null
右外连接查询(RIGHT JOIN ON)
注意:右外连接,是以右表为主表,依次向左匹配,匹配到,返回正确结果
匹配不到,则返回NULL填充
右外连接:右边有的,左边没有的为null
关于SQL语句的编写和执行顺序
SQL语句的编写顺序
SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组 HAVING 过滤条件 ORDER BY 排序列 LIMIT 起始行,总条数
SQL语句执行顺序
执行 FROM : 指定数据来源表
执行WHERE : 对查询的数据做第一次过滤
执行GROUP BY :分组
执行HAVING : 对分组后的数据做第二次过滤
执行SELECT : 查询各个字段的值
执行ORDER BY : 排序
执行LIMIT : 限定查询结果
增、删、改(DML)
新增(INSERT)
INSERT INTO 表名 (列1,列2,列3…) VALUES(值1,值2,值3…)
注意:表名后的列名列表以及VALUES里的值列表要一一对应(个数、顺序、类型)
修改(UPDATE)
UPDATE 表名 SET 列名1=新值1,列名2 = 新值2… WHERE 条件
注意:SET后跟着多个列 = 值,绝大多数情况下,都要加WHERE条件,指定修改的目标,否则为整表更新
删除(DELETE)
DELETE FROM 表名 WHERE 条件
注意:删除时,如若不加WHERE条件,删除的是整张表的数据。结构不变
清空(TRUNCATE)
TRUNCATE TABLE 表名;
注意:TRUNCATE与DELETE不加WHERE删除整张表数据不同:
删除与清空的区别
DELETE仅仅删除数据,结构不变。
TRUNCATE是把整张表销毁,再按照原表的格式、结构创建一张新表
库表操作(DDL)
数据库创建(CREATE)
CREATE DATABASE 库名
注意:在创建有关系关联表时,要先创建主表(主键),再创建从表(外键表)
修改数据库(ALTER)
ALTER DATABASE 库名 操作
注意:修改表中的某列时,需要写全列的名字、数据类型、约束
注意:改变列名时,在给定新列名的同时,要指定列的数据类型和约束
删除数据库(DROP)
DROP DATABASE 库名
关于数据类型
MySQL大致可以分为三类:数值、日期/时间、字符串(字符)类型。对于我们建表,约束列的类型有很大的帮助
数据类型分类
数值类型
INT
整数值
DOUBLE
双精度浮点值
DOUBLE(M,D)
双精度浮点值
DECIMAL(M,D)
小数值
日期类型
DATE
日期值
TIME
时间值
YEAR
年分值
DATETIME
混合日期时间值
字符串类型
CHAR
定义字符串 CHAR(10) 10个字符
VARCHAR
可变长字符串 VARCHAR(10) 10个字符
BLOB(binary large object)
二进制形式的长文本数据
TEXT
长文本
关于约束
实体完整性约束
表中一行数据代表一个实体(entity),实体完整性约束是标识每一行数据不重复、实体唯一。
主键约束
PRIMARY KEY 唯一,标识表中的一行数据,此列的值不可重复,且不能为NULL
唯一约束
UNIQUE 唯一,标识表中的一行数据,不可重复,可以为NULL
自动增长列
AUTO_INCREMENT 自动增长,给主键数值列添加自动增长。从1开始,每次加1。不能单独使用,和主键搭配
域完整性约束
限制列的每一个单元格的数据正确性
非空约束
NOT NULL 非空,约束此列的每一个单元格不允许有NULL
默认值约束
DEFAULT 为列赋予默认值,当新增的数据不指定值时,可以书写DEFAULT,以定义好的默认值进行填充
引用完整性约束
CONSTRAINT 引用名 FOREIGN KEY (列名) REFERENCES 被引用表名(列名)
解释:FOREIGN KEY 引用外部表的某个列的值,新增数据时,约束此列的值必须是引用表中存在的值
注意:两张表存在引用关系时,执行删除操作需要注意,先删除从表(引用表、外键表),再删除主表(被引用表、主键表)
关于事务(TPL)
事务是一个原子操作。是一个最小执行单元。可以由一个或多个SQL语句组成,在同一个事务中,所有的SQL语句都成功执行时,整个事务成功!有一个SQL语句执行失败,整个事务都执行失败!
事务的边界
开始:连接到数据库,执行一条DML语句。 上一个事务结束后,又输入了一条DML语句,即事务的开始
开启事务:START TRANSACTION
结束:<br>
提交
显示提交:COMMIT;
隐式提交:一条DML语句。正常退出(客户端退出链接)
回滚
显示回滚:ROLLBACK;
隐式回滚:非正常退出(断电、死机),执行了创建、删除的语句,但是失败了!会为这个无效的SQL语句执行回滚。
事务的原理
数据库会为每一个客户端都维护一个空间独立的缓存区(回滚段),一个事务中所有的增删改语句的执行结果都会缓存在回滚段中,只有当事务中所有的SQL语句均正常结束(COMMIT),才会将回滚段中的数据同步到数据库。否则无论因为任何原因失败了,则整个事务回滚(ROLLBACK);
事务的特性 <br>
Atomicity(原子性)
表示的是一个事务内的所有操作是一个整体,要么全部成功,要么全部失败。
Consistency(一致性)
表示一个事务内有一个操作失败时,所有的更改过得数据都必须回滚到修改前状态。<br>
Isolation(隔离性)
事务查看数据操作时数据所处的状态,要么是另一个并发事务修改数据之前的状态,要么是另一个并发事务修改它之后的状态。事务不会查看中间状态的数据
Durability(持久性)
事务完成之后,对于数据库的影响是永久性的。
事务的应用
应用环境:基于增删改语句的操作结果(均返回操作后受影响的行数),可通过程序逻辑手动控制事务的提交或回滚
权限管理(DCL)
创建用户
CREATE USER 用户名 IDENTIFIED BY 密码;
授权
GRANT ALL ON 数据库.表名 TO 用户名;
撤销权限
REVOKE ALL ON 数据库.表名 FROM 用户名;
删除用户
DROP USER 用户名;
视图
视图、虚拟表,从一个表中或多个表中查询出来的结果,作用和真实表一样,包含一系列的带有行和列的数据。视图中,可以使用SELECT语句查询数据,也可以使用INSERT、UPDATE、DELETE修改j记录,视图可以使用户操作方便,并保障了数据库系统安全
视图特点
优点
简单化,数据所见即所得
安全性,只能查询或修改视图中所见即所得的数据
逻辑独立性,可以屏蔽真实表结构变化带来的影响
缺点
性能相对较差,简单的查询会稍微复杂
修改不方便,当视图的数据时复杂的聚合视图时,无法修改
视图的创建
CREATE VIEW 视图名 AS 查询数据源表的语句;
视图的修改
方式一:CREATE OR REPLACE VIEW 视图名 AS 查询原表的语句;
方式二:ALTER VIEW 视图名 AS查询源表的语句;
视图的删除
DROP VIEW 视图名
注意:删除视图不会影响原表的数据
视图的注意事项
视图不会独立存储数据,原表发生改变,视图的数据也发生改变。没有优化查询的性能
如果视图包含以下结构中的一种,则视图不可更新
聚合函数的结果
GROUP BY分组后的结果
HAVING筛选过滤后的结果
UNION、UNION ALL联合后的结果
SQL语言分类
数据查询语言DQL (Data Query Language):SELECT、WHERE、ORDER BY 、GROUP BY 、HAVING
数据定义语言DDL (Data Definition Language): CREATE、ALTER、DROP
数据操作语言DML(Data Manipulation Language):INSERT、UPDATE、DELETE
事务处理语言TPL (Transaction Process Language):COMMIT、ROLLBACK
数据控制语言DCL (Data Control Language):GRANT、REVOKE
JDBC知识树
JDBC前置知识
如何操作数据
使用客户端工具访问数据库,需要手工建立链接,输入用户名和密码登录,编写SQL语句,点击执行,查看操作结果(结果集或受影响行数)。
实际开发中,会采用客户端操作数据库吗?
在实际开发过程中,当用户的数据发生改变时,不可能通过客户端操作执行SQL语句,因为操作量过大!无法保证效率和正确性
什么是JDBC
JDBC(Java DataBase Connectivity) Java连接数据库,可以使用Java语言连接数据库完成CRUD操作,并解决了我们以上问题
JDBC核心
Java中定义了访问数据库的接口,可以为多种关系型数据库提供统一的访问方式。
由数据库厂商提供驱动实现类(Driver数据库驱动)
mysql-connector-java-5.1.X 适用于5.X版本
mysql-connector-java-8.0.X 适用于8.X版本<br>
注意:搜索驱动下载即可!(5.1.X适用于MySQL5版本及之前版本;8.0.X适用于其他版本)
JDBC的核心类和接口
java.sql.DriverManager(类)
管理多个数据库驱动类,提供了获取数据库连接的方法
java.sql.Connection(接口)
代表一个数据库连接(当Connection不是NULL时,表示已连接一个数据库)
java.sql.Statement(接口)
发送SQL语句到数据库的工具
java.sql.ResultSet(接口)
保存SQL查询语句的结果数据(结果集)
java.sql.SQLException(类)
处理数据库应用程序时所发生的异常
关于JDBC的环境搭建
在项目下新建 lib 文件夹,用于存放 jar 文件
将MySQL驱动文件mysql-connector-java-5.1.25-bin.jar 复制到项目的lib文件夹中
选中lib文件夹 右键选择 add as library,点击OK
JDBC的开发步骤
注册驱动<br>
使用Class.forName(“com.mysql.jdbc.Driver”); 手动加载字节码文件到JVM中<br>
连接数据库
通过DriverManager.getConnection(url,user,password);获得数据库连接对象
URL:jdbc:mysql://localhost:3306/database(database指定的是你所连接的数据库名字)
user:root(root是数据库连接名)
password:123456(password就显而易见了,密码呗!对不对!)
注意:如果设置字符编码集需要在数据库后加?useUnicode=true&characterEncoding=utf8<br>
URL(Uniform Resource Locator)统一资源定位符:由jdbc协议、mysql协议、IP、端口、SID(程序实例名称)组成
获取发送SQL的对象
通过Connection对象获得Statement对象,用于对数据库进行通用访问的
执行SQL语句
编写SQL语句,并执行,接收执行后的结果
DML语句:增、删、改时,执行的结果是受影响行数(int类型)。
DQL语句:查询时,返回的是数据结果集(ResultSet结果集)
处理结果
接收并处理操作结果
受影响行数:逻辑判断,方法返回
查询结果集:迭代、依次获取
ResultSet(结果集):在执行查询SQL后,存放查询到的结果集数据<br>
接收结果集
遍历ResultSet中的数据
ResultSet以表(Table)结构进行临时结果的存储,需要通过JDBC API将其中的数据进行依次获取
数据行指针(resultSet.next()):初始位置在第一行数据前,每调用一次boolean返回值类型的next()方法,ResultSet中指针向下移动一行,结果为true,表示当前行有数据
resultSet.getXxx(“列名”); 根据列名获得数据
resultSet.getXxx(整数下标); 代表根据列的编号顺序获得!从1开始
释放资源
遵循的是先开后关的原则,释放过程中用到的所有资源对象(调用每个对象的close方法即可释放)
注意:详细代码开发步骤以及案例详解见Blog(点击JDBC知识树即可跳转超链接)
SQL注入问题
什么是SQL注入
当用户输入的数据中有SQL关键字或语法时,并且参与了SQL语句的编译,导致SQL语句编译后条件结果为true,一直得到正确的结果。称为SQL注入
如何避免SQL注入
由于编写的SQL语句,是在用户输入数据后,整合后再编译成SQL语句。所以为了避免SQL注入的问题,使SQL语句在用户输入数据前,SQL语句已经完成编译,成为了完整的SQL语句,再进行填充数据(需要在我们控制台录入后,提前把SQL语句编译成一行长长的字符串,防止注入)
PreparedStatement的应用
PreparedStatement接口继承了Statement接口。执行SQL语句的方法没有区别!
PreparedStatement的作用
预编译SQL语句,效率高!<br>
安全,避免SQL注入
可以动态的填充数据,执行多个同构的SQL语句
注意:PreparedStatement应用时,SQL字符串的参数都由?符号占位,被称为参数标记。在执行该SQL语句前,要为每个?参数赋值
可以动态参数绑定
preparedStatement.setXxx(下标,值); 参数下标是从1开始,为指定占位符下标绑定值
关于PreparedStatement的应用以及SQL注入的解决详情请见Blog!(请见谅,毕竟案例讲解写不到思维导图里,谢谢大家!)
工具类的封装思想
当我们发现很多操作重复出现的代码感觉冗杂时,就可以选择去封装成工具类,在实际的开发中就可以通过调用工具类来实现功能并减少冗杂的代码,实现工具类复用性的价值<br>
重用性方案:可以把获取连接和释放资源封装成一个工具类实现复用性<br>
跨平台方案:我们发现只是单纯的封装了一个获取连接和释放资源是不够的,我们实现跨平台就得用到流来实现持久化存储,这样我们再修改维护的时候不需要修改源代码,只需要修改配置文件即可。减少了耦合度!(这里用到了Properties配置文件)
ORM封装
ORM(Object Relational Mapping):从数据库查询到的结果集(ResultSet)在进行遍历时,逐行遍历,取出的都是零散的数据。在实际应用开发中,我们需要将零散的数据进行封装整理
我们可以把零散的数据,存放在一个Entity对象中,这样可以使用get/set方法来实现对该对象的存储和取出使用,而且还可以为他提供有参构造来实现客户端的传参,传参后可以去使用封装对象来进行功能上的实现<br>
DAO层封装
DAO层(Data Access Object):简称数据访问层。数据访问对象,将所有对同一张表的操作都封装在一个XXXDaoImpl对象中。根据增删改查的不同功能,实现具体的方法(insert,update,delete,select,selectAll)<br>
经验:对于任何一张表中的数据进行操作时,无非就是增、删、改、查。应将对于一张表的所有操作统一封装在一个数据访问对象中。重用
日期的封装
日期分类<br>
java.util.Date<br>
Java语言常规应用层面的日期类型。可以通过字符串创建对应的时间对象
无法直接通过JDBC插入数据库
java.sql.Date
不可以通过字符串创建对应的时间对象。只能通过毫秒值创建对象(1970年1月1日至今的毫秒值)
可以直接通过JDBC插入数据库
关于日期的分类,我们可见两种日期是不可以直接使用的,但是可以通过日期格式化工具(SimpleDateFormat)来实现转换再使用。为了我们代码的复用性,我们也可以把日期的转换封装成为一个工具类DateUtils<br>
连接池的封装
因为我们后续的连接池也是需要加载配置的,我们的配置也是和跨平台方案一样,加载一次即可。所以可以把他们去封装成一个工具类,通过调用工具类来调用实现功能<br>
注意:连接池中获得的Connection是DruidPooledConnection实现类,调用的close()方法不是关闭资源,而是将资源放回池中!
Service层封装<br>
Service层:简称业务层。用户要完成的一个业务功能,是由一个或多个的DAO调用组成。软件、程序提供的一个功能都叫业务<br>
使用封装的Service层可以使DAO数据访问操作复用,业务功能的复用,即:不同的终端访问<br>
ThreadLocal和事务的封装
当我们遇到事务问题的时候,就得用事务来解决他们。这时候ThreadLocal肯定是必不可少的。我们需要通过绑定Connection对象的Thread Local来获取Connection对象,同样我们也可以使用相同的方法来封装复用该事务。既然可以封装ThreadLocal,就也一定可以封装Commit和RollBack,因为他们也是通过Connection对象句点出来的
DML操作的封装
DML操作指的是我们SQL中的增、删、改SQL命令操作,我们在Java和数据库连接的时候,有一个步骤是需要我们编写SQL语句的,而编写好的SQL语句是要执行和处理结果的。我们的增、删、改操作,在代码中多次书写就会发现每次写的都是那一些重复的操作代码,这时候我们就会用到了封装。<br>
DQL操作的封装
DQL操作指的是我们SQL中的查询SQL命令操作,同样,我们Java和数据连接的时候,也是需要查询的,而查询也会编写和处理SQL语句,而这时我们也会选择使用封装的方式来实现项目和公司项目组之间的合作上的复用。而且还减少了我们代码的冗余。更能体现出我们项目架构分包时候单一职能原则!
连接池
JDBC每次连接数据库,都要获得一个连接对象。每次创建一个连接对象,都是一个较大的资源,如果在连接量较大的场景下,会极大的浪费资源。容易内存溢出。<br>
连接池分类
自定义连接池
Java中提供了一个接口DataSource,通过实现该接口,可以创建连接池
Druid(德鲁伊连接池)
Druid 是目前比较流行高性能的,分布式列存储
好处
亚秒级查询
实时数据注入
可扩展的PB级存储
多环境部署<br>
有着丰富的社区<br>
关于Druid的配置
创建database.properties 配置文件
引入druid-1.1.5.jar
注意:关于连接池的使用步骤和案例依然如此,访问我的Blog来解决你的所有疑惑!
事务问题
转账案例思想
关于事务,就是经典转账案例抛出的一个问题解决方式。
转账案例抛出的问题:假设我们在转账的时候,如果转账的过程中,遇到了异常问题导致你的转账中途失败,也就是说你转过去Money,自己的账户减了钱数。而中途失败,收款方收不到你的钱,那钱该何去何从呢?
我们现实生活中,如果失败的话知道是不减少自己的钱的。那是因为我们见不到的后台做了一系列事务操作,遇到问题转账失败使得钱又回到了我们的账户中,此时是不是感觉很神奇呢?
ThreadLocal<br>
线程工具类:在整个线程中,一直到释放资源,用的是同一个Connection连接对象。<br>
在整个线程(单条执行路径中)所持有的Map中,存储一个键(threadlocal)值(connection)对
线程(Thread)对象中持有一个ThreadLocalMap类型的对象(ThreadthreadLocals),threadLocals中保存了以ThreadLocal对象为Key,set进去的值为Value
每个线程均可绑定多个ThreadLocal,一个线程中可存储多个ThreadLocal
注意: ThreadLocal是Thread类的一个内部类,他只是一个局部变量,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。
事务操作
开启事务
我们可以使用Connection对象句点出来的setAutoCommit(false);来关闭自动提交,这时从这一行代码起到我们提交前都是这一个事务的范围,而我们在事务范围内可以进行产生事务问题的解决<br>
事务的提交方式
回滚事务
RollBack:我们遇到异常而终止结束的时候,可以通过RollBack来实现类似撤回的操作,可以把我们账户中的钱重新返回到我们的账户中,可以说这是一种遇到异常错误时的提交方式(虽然撤回这个词不太严谨,但是我感觉这是最通俗易懂的说法了!)
提交事务
Commit:我们在事务范围内,遇到异常需要回滚事务,正常呢,就需要我们手动提交事务了!Commit就是一个我们成功后提交的一种方式!
注意:如果还不明白的话可以参考我的Blog,里面对所有内容有全面的案例详解和事务思想传递
三层架构设计
表示层<br>
命名:xxxVIew<br>
职责:收集用户的数据和需求、展示数据
业务逻辑层
命名:XXXServiceImpl
职责:数据的加工处理、调用Dao组合完成业务实现、控制事务
数据访问层
命名:xxxDaoImpl<br>
职责:向业务层提供数据,将业务层加工处理后的数据同步到数据库
三层架构设计的好处
面向接口编程,易修改、易扩展。耦合度低,Service层和Dao层设计接口,便于更换实现类!
使得后期对产品的维护更简单<br>
划分层次清晰可见,有利于工作的合作完成,提高工作效率
注意:关于三层架构思想和三层架构的架构图解,也放在了我的Blog中,大家可以自行选择参考!
Apache的DbUtils<br>
Commons DbUtils 是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能勾简化JDBC应用程序的开发!同时,不会影响程序的性能(以上的封装操作,该工具为我们封装好了,但是我们要学习和拥有自己的封装思想)<br>
DbUtils简介
DbUtils是Java编程中数据库操作实用小工具,小巧、简单、实用
对于数据表的查询操作,可以吧结果转换为List、Array、Set等集合。便于操作
对于数据表的DML操作,也变得很简单(只需要写SQL语句);
DbUtils主要包含
ResultSetHandler接口:转换类型接口
BeanHandler类:实现类,把一条记录转换成对象<br>
BeanListHandler类:实现类,把多条记录转换成List集合。
ScalarHandler类:实现类,适合获取一行一列的数据。
QueryRunner:执行sql语句的类<br>
增、删、改:update();
查询:query();
DbUtils的使用步骤
导入jar包
mysql连接驱动mysql-connector-java-5.1.25-bin.jar
druid-1.1.5.jar
database.properties配置文件
commons-dbutils-1.6.jar
注意:使用Apache的DBUtils工具是有局限性的,他不允许我们自己去写获取连接对象,只能使用导入jar的连接池来进行使用工具,所以我们以前学过的jar包和连接池配置文件一个都不能少,少了就不能正常使用该工具,这也算是一个缺点吧!(凡事有利也有弊嘛!可以理解!)
关于该工具的使用,还是老话去看我Blog的总结吧!
HTML知识树
HTML的前置知识
HTML概述
HTML全称:Hyper Text Markup Language(超文本标记语言)
HTML是一门用户创建网页文档的标记语言,网页本身是一种文本文件,在文本文件中添加标记符。<br> 浏览器来解析HTML标记的内容(文字的处理,画面排版安排,图片如何显示、音频、视频等等)<br> HTML是用来创建网页的标记语言
HTML的特点
简易性:超文本标记语言的版本升级采用的超集方式。更加方便灵活
可扩展性:超文本标记语言采取的子类元素的方式,为系统扩展带来保证
平台无关性
通用性:HTML是网络的通用语言,一种简单、通用的标记语言。
HTML基本结构
HTML页面包含头部head和主体body
HTML标签通常是成对出现的,有开始标签,有结束标签,称为对标签。没有结束标签的为 空标签
HTML标签通常都有属性,格式:属性名 = “属性值” 属性名 = “属性值”。多个属性用空格间隔
HTML标签不区分大小写,建议小写
HTML文件后缀名为html或htm
HTML基本标签
结构标签
html、head、body、title标签
可以为body标签增加相应的样式,比如:color、bgColor、background等等
注意:颜色可以用两种方式来进行添加
颜色英文名称,比如:red、blue、purple等
RGB模式,比如:#000000、#ffffff等
排版标签
注释标签:<!-- -->
换行标签:<br />
段落标签:<p>文本文字</p>
水平线标签:<hr />
注意:比如像框、线、段落等这样类型的标签,我们是可以为他们赋予宽度、高度、颜色、水平线对齐方式等等样式的
标题标签
<h1></h1>
注意:标签标签是从h1到h6的,也就是说按数字来说只是从1到6。数字越小,标题文字越大!默认加粗、默认字号、默认占据一行
容器标签
块级标签,独占一行,自带换行:<div></div>
行级标签,所有内容都在同一行:<span></span>
列表标签
无序列表:<ul></ul>
有序列表:<ol></ol>
定义列表
定义列表:<dl></dl>
定义标题:<dt></dt>
定义描述:<dd></dd>
注意:列表标签是比如无序列表、有序列表是可以设置默认标识的,而且列表标签之间是可以有嵌套关系的
图片标签
<img />
图片标签是可以对图片附加一些样式的,比如图片地址、高度、宽度、边框、图片文字说明、鼠标悬停显示文字信息等等
链接标签
<a></a>
注意:超链接可以是文本,也可以是图片,可以点击链接标签,进入新的文档,或者是当前文档中的某个部分。我们也是可以对超链接标签设置一些属性的,典型的的就是能够实现原文跳转的锚点了!
表格标签
表格由<table>标签来定义,每个表格均有若干行(由tr标签定义行),每行由若干个单元格组成(由td标签来定义)。每一个数据单元可以包含文本、图片、列表等等
普通表格:<tr>、<td>
表格的表头:<th>
表格的列合并属性:colspan
表格的行合并:rowspan
文本格式化标签
粗体文本:<b>
大字号:<big>
着重文字:<em>
斜体字:<i>
小字号:<small>
定义加重语气:<strong>
下标字:<sub>
上标字:<sup>
插入字:<ins>
删除字:<del>
表单标签
表单可以将页面上录入的信息携带到服务器端。它是一个包含表单元素的区域。表单元素是允许用户在表单中(比如:文本域、下拉列表、单选框、复选框等等)输入信息的元素。表单使用表单标签(<form>)定义。
注意:表单标签可以设置一些输入框<input>、文本域<textarea>、选择列表<select>、下拉选项<option>、按钮<button>等。而我们还可以对这些设置一些属性,比如提交、重置、文本、密码等属性,这里就不一一列出了
注意:关于思维导图只是罗列了一些知识内容的概要框架体系,真正的代码还是老规律去Blog看吧!
CSS知识树
Collect
Get Started
Collect
Get Started
Collect
Get Started
Collect
Get Started
评论
0 条评论
下一页