02 MySQL数据库、SQL、数据库设计、事务、JDBC
1. MySQL 数据库
1.1 MySQL 的安装:
包含两种安装方式,解压包安装、压缩包安装。
通过解压包安装:
下载压缩包后进行解压、添加 my.ini 初始化配置文件、添加环境变量;
添加 mysqld 服务、启动该服务。
期间遇到的一些问题和解决方案:
- 找不到dll文件,导致安装失败。是因为c++资源库里少了一个资源文件,可以通过安装对应c++资源库或dll修复解决;
- 初始化配置文件里utf8 写成 utf-8,会报错找不到对应字符集;
- 初始化配置文件里一些参数值随着版本升级不再适用,可直接删除;
- 无法正常启动 mysqld服务,可能是因为环境变量的路径添加错误。在任务管理器-服务里,找到mysql服务详情的路径信息进行检查,该路径默认使用注册表里的路径,如果与实际sqld.exe文件位置不一致,更改注册表里的地址;
【data】目录下的三个自带数据库:
- mysql: 存放最为核心的一些信息,比如权限、安全等
- performance_schema:存储性能相关信息
- sys:存储系统相关信息
一般客户端不对这三个进行改动
1.2 MySQL数据模型
MySQL是一种关系型数据库,关系型数据库是由多张能相互连接的二维表组成的数据库;
简单来说,通过表来存储数据的数据库,就称为 关系型数据库。(不通过表的,非关系型数据库);
其实 一个数据库在电脑上对应的就是data目录下的一个文件夹
2. SQL简介
Structured Query Language,结构化查询语言,定义操作所有关系型数据库的统一标准
对于同一个需求,每一种数据库操作的方式可能会存在一些不一样的地方,称之为“方言”
- where 和 having 的区别
- 执行时机不一样,where 是分组之前进行限定,不满足 where 条件,则不参与分组,而 having 是分组之后堆结果进行过滤
- 可判断的条件不一样:where 不能对聚合函数进行判断,having 可以
3. 数据库设计
-
一对多 表关系(一个部门对应多个员工)
实现方式:在 多 的一方建立外键,指向 一 的一方 -
多对多 表关系(一个商品对应多个订单,一个订单包含多个商品)
实现方式:建立第三张表,中间表,中间表至少包含 两个外键,分别关联两方主键
(通常也会加一些业务字段进去) -
一对一 表关系(用户 和 用户详情)
一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能 ——> 用户表+用户详情表
实现方式:在任意一方加入外键,关联另一方主键,并且设置外键为唯一(UNIQUE)
4. 事务
4.1 简介
数据库的事务(transaction)是一种机制、一个操作序列,包含了一组数据库操作命令
事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败
事务是一个不可分割的工作逻辑单元
开启事务
BEGIN/START
提交事务
COMMIT
4.2 事务四大特征
Atomicity:原子性,事务时不可分割的最小操作单位,要么同时成功,要么同时失败
Consistency:一致性,事务完成时,必须使所有的数据都保持一致状态
Isolation:隔离性,多个事务之间,操作的可见性
Durability:持久性,事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
5. JDBC
5.1 简介
JDBC,Java DataBase Connectivity,Java数据库连接,就是使用 Java语言操作关系型数据库的一套API
IDEA添加对应jar包:
官网下载jar包,放入项目目录下,右键-添加至lib,才能被项目内代码识别。
使用Java操作数据库步骤:
5.2 JDBC API详解
5.2.1 DriverManager类
驱动管理类作用:
- 注册驱动
Class.forName("com.mysql.jdbd.Driver")
MySQL 5之后的驱动包,可以省略注册驱动的步骤
自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类
- 获取数据库连接
static Connection getConnection(String url, String user, String password)
url语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...
url示例:jdbc:mysql://127.0.0.1:3306/db1
配置 useSSL=false参数,禁用安全连接,解决警告提示(jdbc:mysql://127.0.0.1:3306/db1?useSSL=false)
5.2.2 Connection
数据库连接类作用:
- 获取执行sql对象
普通执行sql对象
Statement createStatement()
预编译sql的执行sql对象:防止sql注入
PreparedStatement prepareStatement(sql)
执行存储过程的对象
CallableStatement prepareCall(sql)
- 事务管理
5.2.3 Statement
作用:
- 执行sql语句
5.2.4 ResultSet
结果集对象作用:
- 封装了DQL查询语句的结果
Result stmt.executeQuery(sql) # 执行DQL语句,返回ResultSet对象
- 获取查询结果
boolean next() # 将光标从当前位置向前移动一行;判断当前行是否为有效行
xxx getXxx(参数) # 获取参数; 参数类型:int列的编号(从1开始)、String列的名称
5.2.5 PreparedStatement
作用:
- 预编译sql语句并执行:预防sql注入问题
sql注入:是指通过操作输入来修改事先定义好的sql语句,用以达到执行代码对服务器进行攻击的方法
5.3 数据库连接池
5.3.1 简介
- 数据库连接池是个容器,负责分配、管理数据库连接
- 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
- 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
- 好处:
资源重用;
提升系统响应速度;
避免数据库连接遗漏;