一、JavaWeb介绍
1.1 什么是JavaWeb
-
Web:全球广域网
-
JavaWeb:用Java技术来解决相关web互联网领域的技术栈
-
网页:展示数据
-
数据库:存储和管理数据
-
JavaWeb程序:逻辑处理
1.2 课程安排
- 数据库
- MySQL
- JDBC:一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库。
- MyBatis:对JDBC操作简化的框架
- 前端
- HTML+CSS
- JavaScript
- AJax + Vue + ElementUI
- Web核心
- Tomcat + HTTP + Servlet
- Request + Response
- JSP
- Cookie + Session
- Filter + Listener
二、数据库
2.1 数据库相关概念
- 数据库:存储数据的仓库
- 数据库管理系统:管理数据库的大型软件
- SQL:结构化查询语言
- 常见的关系型数据库管理系统
- Oracle
- MySQL
- SQL Server
- PostgreSQL
- DB2
- SQLite
- MariaDB
2.2 MySQL数据库
- 绿色安装
- 新建配置文件my.ini
- 初始化MySQL:mysqld --initialize-insecure
- 注册MySQL服务:mysqld -install
- 启动MySQL服务:net start mysql
- 修改默认账户密码
- 登录MySQL:mysql -u用户名 -p密码 -h要连接的ip -P端口号(默认3306)
- 卸载MySQL
- MySQL数据模型
- 关系型数据库
- 关系型数据库是建立在关系模型基础上的数据库,简单说,关系型数据库是由多张能互相连接的二维表组成的数据库
- 优点
- 都是使用表结构,格式一致,易于维护
- 使用通用的SQL语言操作,使用方便,可用于复杂查询
- 数据存储在磁盘中,安全
2.3 SQL
2.3.1 SQL简介
- Structured Query Language
- 结构化查询语言,一门操作关系型数据库的编程语言
- 定义操作所有关系型数据的统一标准
- 对于同一个需求,每一种数据库操作的方式可能会存在一些不一样的地方,我们称之为”方言“
2.3.2 SQL通用语法
- SQL语句可以当行或多行书写,以分号结尾。
- MYSQL数据库的SQL语句不区分大小写,关键字建议使用大写
- 注释
- 单行注释:–注释内容 #注释内容
- 多行注释:/**/
2.3.3 SQL分类
- DDL数据定义语言:用来定义数据库对象:数据库,表,列
- DML数据操作语言:用来对数据库中的表的数据进行增删改
- DQL数据查询语言:用来查询数据库中表的记录
- DCL数据控制语言:用来定义数据库的访问权限和安全级别,以及创建用户
2.3.4 DDL
-
操作数据库
-
查询:SHOW DATABASES 数据库名称;
-
创建数据库:CREATE DATABASE IF NOT EXISTS 数据库名称;
-
删除数据库:DROP DATABASE IF EXISTS 数据库名称;
-
查看当前使用的数据库:SELECT DATABASE();
-
使用数据库:USE 数据库名称;
-
-
操作表
- 查询当前数据库下所有表名称:SHOW TABLES;
- 查询表结构:DESC 表名称;
- 创建表:CREATE TABLE 表名(字段名1 数据类型1,字段名2 数据类型2);
- 删除表:DROP TABLE IF EXISITS 表名;
- 修改表名:ALERT TABLE 表名 RENAME TO 新表名;
- 添加一列:ALERT TABLE 表名 ADD 列名 数据类型;
- 修改数据类型:ALERT TABLE 表名 MODIFY 列名 新数据类型;
- 修改列名和新数据类型:ALERT TABLE 表名 CHANGE 列名 新列名 新数据类型;
- 删除列:ALERT TABLE 表名 DROP 列名;
2.3.5 DML
- 添加
- 给指定列添加数据:INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…);
- 给全部列添加数据:INSERT INTO 表名 VALUES(值1,值2,…);
- 批量添加数据:INSERT INTO 表名 VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
- 修改
- 修改表数据:UPDATE 表名 SET 列名1=值1,列名2=值2,… WHERE 条件
- 删除
- DELETE FROM 表名 WHERE 条件;
2.3.6 DQL
- SELECT 字段列表
- FROM 表名列名
- WHERE 条件列表
- GROUP BY 分组字段
- HAVING 分组后条件
- ORDER BY 排序字段
- LIMIT 分页限定
- 基础查询
- 查询多个字段:SELECT 字段列表 FROM 表名;
- 去除重复记录:SELECT DISTINCT 字段列表 FROM 表名
- 起别名:AS
- 条件查询
- SELECT 字段列表 FROM 表名 WHERE 条件列表;
- 排序查询
- SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1 排序方式1,排序字段名2 排序方式2;
- 排序方式:AES升序(默认),DESC降序
- 分组查询
- 聚合函数:将一列数据作为一个整体,进行纵向计算
- count,max,min,sum,avg
- SELECT 聚合函数名(列名) FROM 表名;
- SELECT 字段列表 FROM 表名 WHERE 分组前限定条件 GROUO BY 分组字段名 HAVING 分组后条件过滤
- 分页查询
- SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询条目数;
2.4 约束
2.4.1 约束的概念和分类
-
约束概念
- 约束是作用于表中列上的规则,用于限制加入表的数据
- 约束的存在保证了数据库中数据的正确性、有效性和完整性
-
约束的分类
-
非空约束:保证列中所有数据不能有null值:NOT NULL
-
唯一约束:保证列中所有数据各不相同:UNIQUE
-
主键约束:主键是一行数据的唯一标识,要求非空且唯一:PRIMARY KEY
-
默认约束:保存数据时,未指定值则采用默认值:DEFAULT
-
检查约束:保证列中的值满足某一条件:CHECK
-
外键约束:外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性:FOREIGN KEY
-
2.4.2 案例
CREATE TABLE emp (
id INT PRIMARY KEY auto_increment, --员工id,主键且自增长
ename VARCHAR() NOT NULL UNIQUE, --员工姓名,非空并且唯一
joindate DATE NOT NULL, --入职日期,非空
salary DOUBLE(7,2) NOT NULL, --工资,非空
bonus DOUBLE(7,2) DEFAULT 0, --奖金,如果没有奖金默认为0
)
2.4.3 外键约束
- 概念
- 外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性
- 语法
- 建表时添加约束:CREATE TABLE 表名(列名,数据类型,CONSTRAINT 外键名称 FOREIGN KEY(外键列名) REFERENCES 主表(主表列名));
- 建表后添加约束:ALERT TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY 外键字段名称 REFERENCES 主表名称 主表列名称;
- 删除外键:ALERT TAVLE 表名 DROP FOREIGN KEY 外键名称;
2.5 数据库设计
2.5.1 数据库设计简介
-
软件的研发步骤
- 需求分析
- 设计
- 编码
- 测序
- 安装部署
-
数据库设计概念
- 数据库设计就是根据业务系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。
- 建立数据库中的表结构以及表与表之间的关联关系的过程。
- 有哪些表?表里有哪些字段?表和表之间有什么关系?
-
数据库设计的步骤
- 需求分析:数据是什么?数据有哪些属性?数据与属性的特点是什么?
- 逻辑分析:通过E-R图对数据库进行逻辑建模,不需要考虑我们所选用的数据库管理系统
- 物理设计:根据数据库自身的特点把逻辑设计转化为物理设计
- 维护设计:对新的需求进行建表;表优化
2.5.2 表关系之一对多、多对一
- 如:部门—员工
- 在多的一方建立外键,指向一的一方的主键
2.5.3 表关系之多对多
- 如:商品—订单
- 建立第三章中间表,中间表至少包含两个外键,分别关联两方主键
2.5.4 表关系之一对一
- 如:用户—用户详情
- 一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能
- 在任意一方加入外键,关联另一方主键,并且设置外键为唯一
2.5.5 数据库设计案例
分析实体
分析对应关系
2.6 多表查询
- 连接查询
- 内连接:查询A B交集数据:SELECT 字段列表 FROM 表1,表2 WHERE 条件
- 外连接
- 左外连接:查询A表所有数据和交集部分数据:SELECT 字段列表 FROM 表1 LEFT OUTER JOIN 表2 ON 条件
- 右外连接:查询B表所有数据和交集部分数据:SELECT 字段列表 FROM 表1 RIGHT OUTER JOIN 表2 ON 条件
- 子查询:查询中嵌套查询,称嵌套查询为子查询
- 单行单列:SELECT 字段列表 FROM 表 WHERE 字段名 条件 子查询;
- 多行单列:SELECT 字段列表 FROM 表 WHERE 字段名 in 子查询;
- 多行多列:SELECT 字段列表 FROM 子查询 WHERE 条件;
2.7 事务
2.7.1 事务简介
- 数据库的事务是一种机制、一个序列操作,包含了一组数据库操作命令
- 事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败
- 事务是一个不可分割的工作逻辑单元
2.7.2 事务操作
- 开启事务
- START TRANSACTION;
- BEGIN;
- 提交事务:COMMIT;
- 回滚事务:ROLLBACK;
2.7.3 事务四大特征
- 原子性(Atomicity):事务是不可分割的最小操作单位,要么同时成功,要么同时失败
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态
- 隔离性(Isolation):多个事物之间,操作的可见性
- 持久性(Durability):事务一旦提交或回滚,他对数据库中的数据的改变就是永久的
三、JDBC
3.1 JDBC简介
- JDBC概念:Java DataBase Connectivity,Java数据库连接,使用Java语言操作关系型数据库的一套API
- JDBC本质
- 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包
- 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
- JDBC好处:
- 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
- 可以随时替换底层数据库,访问数据库的Java代码基本不变
3.2 JDBC快速入门
- 创建工程,导入驱动jar包
- 注册驱动:Class.forName(“com.mysql.jdbc.Driver”);
- 获取连接:Connection conn = DriverManager.getConnection(url,username,password);
- 定义SQL语句:String sql = “update…”;
- 获取执行SQL对象:Statement stmt = conn.createStatement();
- 执行SQL:stmt.executeUpdate(sql);
- 处理返回结果
- 释放资源
3.3 JDBC API详解
-
DriveManager
- 注册驱动
- 获取数据库连接
-
Connection
- 创建执行SQL的对象
- 普通执行SQL对象:Statement createStatement()
- 预编译SQL的执行SQL对象,防止SQL注入:PreparedStatement prepareStatement(sql)
- 执行存储过程的对象:CallableStatement prepareCall(sql)
- 事务管理
- 开启事务:setAutoCommit(boolean autoCommit):true为自动提交事务,false为手动提交事务
- 提交事务:commit()
- 回滚事务:rollback()
- 创建执行SQL的对象
-
Statement:执行SQL语句
- int executeUpdate(sql):执行DML、DDL语句
- ResultSet executeQuery(sql):执行DQL语句
-
ResultSet:结果集对象,封装了DQL查询语句的结果
- 获取查询结果:boolean next();true,有效行;false,无效行;
- getXXX():获取数据
-
PreparedStatement:预编译SQL语句并执行,预防SQL注入问题
- SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
- 过程
- 创建SQL语句:String sql = "select * from user where username = ? and password = ? "
- 获取PreapreStatement对象:PreapreStatement pstmt = conn.prepareStatement
- 设置参数值:setXXX
- 执行SQL:executeUpdate();executeQuery(),不需要再传递sql
- PreparedStatement好处
- 预编译SQL,性能更高
- 防止SQL注入,将敏感字符进行转义
3.4 数据库连接池
3.4.1 数据库连接池简介
- 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
- 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
- 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
- 好处:
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏