[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bx8wW2iS-06)(https://blog.csdn.net/_/article/details/assets/XuanZiShare__.jpg)]
玄子Share-BCSP助学手册之数据库开发
前言:
此文为玄子,学习 BCSP 一二期后整理的文章,文中对知识点的解释仅为个人理解,源码均可直接复制运行
配套PPT,站点源码,等学习资料请加文章封面联系方式
针对课程的一些调整:
- 如果你当前正在学习课程的并不影响阅读浏览这篇文章,与的绝大部分SQL语法都是相通的,关于SQL语法我均写了详细的介绍
- 一期 与二期这两本书的相似度较高,所以针对数据库编程,只写了二期的
- 这篇文章与之前的以及属于同一系列这本书所学,几乎就是以后工作的日常操作,所以这篇文章,会加入更多关于我对数据库及JDBC的理解,相对前两篇文章,会比较啰嗦,请谅解
- 文章演示的数据库为BCSP配套数据库文章第八章附件有源文件,可直接复制运行
- 文章的部分知识相对课程有增改,以课本为准
- 课程中部分软件涉及版权无法展示安装教程,可加封面联系方式获取软件和安装教程
目录
文章目录
- 玄子Share-BCSP助学手册之数据库开发
- 目录
-
- @[toc]
- 一、课程软件的安装与卸载
-
- 1.1 MySQL 版本选择与安装方式
-
- 1.1.1 MySQL 版本选择
- 1.1.2 MySQL 安装方式
- 1.2 MySQL 压缩包安装教程
-
- 1.2.1 下载链接
- 1.2.2 安装 MySQL
- 1.2.3 添加配置文件
- 1.2.4 配置环境变量
- 1.2.5 安装 MySQL 服务
- 1.2.6 删除配置文件代码
- 1.2.7 验证 MySQL 配置
- 1.2.8 完成下课
- 1.3 MySQL 安装器安装教程
-
- 1.3.1 下载链接
- 1.3.2 安装 MySQL
- 1.3.3 配置环境变量
- 1.3.4 验证 MySQL 配置
- 1.3.5 完成下课
- 1.4 MySQL 卸载教程
-
- 1.4.1 压缩包卸载
- 1.4.2 安装器卸载
- 1.5 MySQL管理工具安装
-
- 1.5.1 下载链接
- 1.5.2 Navicate 安装
- 1.5.3 SqlYog 安装
- 1.5.4 PowerDesigner 安装
- 二、MySQL 数据库设计
-
- 2.1 为什么需要设计数据库
-
- 2.1.1 软件项目开发周期中数据库设计
- 2.1.2 设计数据库的步骤
- 2.2 为什么使用 E-R 图
-
- 2.2.1 E-R 图概念
- 2.3 数据库设计模型转换
-
- 2.3.1 关系型数据库设计分类
- 2.3.2 各模型之间的素对应关系
- 2.3.3 数据模型转换方案
- 2.4 实体关系约束转换
-
- 2.4.1 一对多关系的两个实体
- 2.4.2 一对一关系的两个实体
- 2.4.3 多对多关系的两个实体
- 2.5 PowerDesigner 软件
-
- 2.5.1 绘制数据库模型图
- 2.5.2 生成 SQL 代码
- 2.6 数据库设计范式
-
- 2.6.1 三大数据库设计范式
- 2.7 规范化和性能的关系
-
- 2.7.1 演示案例
- 2.8 用三大范式设计表结构
-
- 2.8.1 实现思路
- 三、MySQL 基础
-
- 3.1 MySQL 简介
-
- 3.1.1 MySQL 发展历史
- 3.1.2 MySQL 的优势
- 3.1.3 MySQL 安装教程
- 3.2 命令行连接 MySQL
-
- 3.2.1 启动服务命令
- 3.2.2 停止服务命令
- 3.2.3 登录数据库命令
- 3.2.4 查看当前版本和用户信息
- 3.3 数据库管理指令
-
- 3.3.1 创建数据库
- 3.3.2 查看数据库列表
- 3.3.3 选择数据库
- 3.3.4 删除数据库
- 3.4 Navicat 数据库管理工具
-
- 3.4.1 安装教程
- 3.4.2 Navicat 连接 MySQL
- 3.4.3 使用 Navicat 创建数据库
- 3.5 结构化查询语言
-
- 3.5.1 DML (数据操作语言)
- 3.5.2 DDL (数据定义语言)
- 3.5.3 DQL (数据查询语言)
- 3.5.4 DCL (数据控制语言)
- 3.6 MySQL 数据类型
-
- 3.6.1 数值类型
- 3.6.2 日期类型
- 3.6.3 字符串
- 3.7 DDL (数据定义语言)
-
- 3.7.1 创建表
- 3.7.2 修改表
- 3.7.3 删除表
- 3.8 MySQL 注释
-
- 3.8.1 单行注释
- 3.8.2 多行注释
- 3.9 MySQL 字段的约束及属性
-
- 3.9.1 主键约束
- 3.9.2 外键约束
- 3.9.3 主键与外键的区别
- 3.9.4 主外键建立后注意事项
- 3.10 MySQL 注释与字符集编码
-
- 3.10.1 注释
- 3.10.2 设置字符集编码
- 3.10.3 演示案例
- 3.11 MySQL 查看表
-
- 3.11.1 查看数据库中的表
- 3.11.2 描述表结构
- 3.12 MySQL 的存储引擎
-
- 3.12.1 存储引擎的类型
- 3.12.2 查看系统所支持的存储引擎类型
- 3.12.3 常用的 MySQL 存储引擎
- 3.12.4 InnoDB 和 MyISAM 存储引擎比较
- 3.12.5 适用场合
- 3.12.6 查看当前存储引擎
- 2.12.7 修改存储引擎
- 3.12.8 设置表的存储引擎
- 3.12.9 数据表的存储文件
- 3.12.10 存储位置
- 3.13 MySQL 系统帮助
-
- 3.13.1 详细帮助
- 四、MySQL 高级(DML 增删改)
-
- 4.1 DML 数据操纵语言
- 4.2 插入数据
-
- 4.2.1 一次向表中插入一条记录
- 4.2.2 一次向表中插入多行数据
- 4.2.3 将查询结果插入到新表
- 4.3 更新数据
-
- 4.3.1 更新数据记录
- 4.4 删除数据
-
- 4.4.1 删除数据记录
- 4.4.2 格式化表记录
- 4.5 比较 DROP、DELETE 与 TRUNCATE 语句
-
- 4.5.1 执行速度
- 4.5.2 使用选择
- 五、MySQL 高级(DQL 查)
-
- 5.1 DQL 数据查询语言
- 5.2 基础查询
-
- 5.2.1 查询全部行和列
- 5.2.2 查询部分列
- 5.2.3 AS 别名
- 5.3 运算符
-
- 5.3.1 算术运算符
- 5.3.2 比较运算符
- 5.3.3 逻辑运算符
- 5.3.4 位运算符
- 5.3.5 运算符优先级
- 5.4 条件查
-
- 5.4.1 精确查询
- 5.4.2 单条件查询
- 5.4.3 多条件查询
- 5.5 排序查
-
- 5.5.1 升序排序
- 5.5.2 降序排序
- 5.5.3 多字段排序
- 5.6 常用函数
-
- 5.6.1 字符串函数
- 5.6.2 时间日期函数
- 5.6.3 聚合函数
- 4.6.4 数学函数
- 5.7 分组查
-
- 5.7.1 GROUP BY
- 5.7.2 HAVING
- 5.8 分页查
-
- 5.8.1 下标 5 开始查询 5 条
- 5.8.2 每页 m 个数据查第 n 页
- 5.9 模糊查
-
- 5.9.1 通配符
- 5.9.2 LIKE
- 5.9.3 BETWEEN
- 5.9.4 IS NULL
- 5.10 子查询
-
- 5.10.1 IN 子查询
- 5.10.2 NOT IN 子查询
- 5.10.3 EXISTS
- 5.10.4 EXISTS 子查询
- 5.10.5 NOT EXIST 子查询
- 5.10.6 子查询小结
- 5.10.7 子查询注意事项
- 5.11 连接查
-
- 5.11.1 JOIN
- 5.11.2 内连接
- 5.11.3 外连接
- 5.12 执行顺序
-
- 5.12.3书写顺序
- 5.12.4 执行顺序
- 六、企业级开发技术
-
- 6.1 存储过程
-
- 6.1.1 什么是存储过程
- 6.1.2 存储过程可以包含
- 6.1.3 存储过程的优缺点
- 6.1.4 创建存储过程
- 6.1.5 定义存储过程的参数
- 6.1.6 调用存储过程
- 6.1.7 查看存储过程状态
- 6.1.8 查看存储创建代码
- 6.1.9 修改存储过程
- 6.1.10 删除存储过程
- 6.1.11 存储过程中的变量
- 6.1.12 存储过程控制语句
- 6.1.13 IF-ELSEIF-ELSE 条件语句
- 6.1.14 CASE 条件语句
- 6.1.15 WHILE 循环语句
- 6.1.16 LOOP 循环语句
- 6.1.17 REPEAT 循环语句
- 6.1.18 迭代语句
- 6.2 事务
-
- 6.2.1 什么是事务
- 6.2.2 事务的特性
- 6.2.3 如何创建事务
- 6.2.4 事务处理
- 6.2.5 自动关闭和开启事务
- 6.2.6 遵循原则
- 6.3 视图
-
- 6.3.1 为什么需要视图
- 6.3.2 什么是视图
- 6.3.3 视图的好处
- 6.3.4 创建 / 查看视图
- 6.3.5 使用视图注意事项
- 6.3.6 演示案例
- 6.4 索引
-
- 6.4.1 什么是索引
- 6.4.2 常用索引类型
- 6.4.3 创建/删除索引
- 6.4.4 创建索引的指导原则
- 6.4.5 使用索引时注意事项
- 6.4.6 查看索引 / 删除索引
- 6.5 数据库的备份与恢复
-
- 6.5.1 为什么进行数据库备份
- 6.5.2 数据的备份与恢复
- 6.5.3 mysqldump 备份数据库
- 6.5.4 Navicat 备份数据库
- 6.5.5 恢复数据库
- 6.5.6 mysql 恢复数据库
- 6.5.7 source 恢复数据库
- 6.5.8 Navicat 恢复数据库
- 七、JDBC 与 DAO 模式
-
- 7.1 JDBC 介绍
-
- 7.1.1 什么是 JDBC
- 7.1.2 JDBC 的工作原理
- 7.1.3 JDBC API
- 7.2 使用 JDBC 连接数据库
-
- 7.2.1 导入 JDBC 驱动 JAR 包
- 7.2.2 纯 Java 驱动方式
- 7.2.3 JDBC编程模板
- 7.2.4 数据库连接字符串
- 7.2.5 Connection 接口
- 7.2.6 连接本地 hospital 数据库
- 7.2.7 常见异常
- 7.3 Statement 操作数据库
-
- 7.3.1 Java 的字符串操作
- 7.3.1 Statement 插入数据
- 7.3.2 Statement 更新数据
- 7.3.3 ResultSet 接口
- 7.3.4 Statement 和 ResultSet 查询数据
- 7.4 PreparedStatement 操作数据库
-
- 7.4.1 SQL 注入攻击
- 7.4.2 PreparedStatement 接口
- 7.4.3 PreparedStatement 操作数据
- 7.4.4 PreparedStatement 的优势
- 7.5 Properties 配置文件
-
- 7.5.1 为什么使用 Properties 类
- 7.5.2 properties配置文件
- 7.5.3 读取配置文件信息
- 7.6 DAO 模式
-
- 7.6.1 什么是 DAO
- 7.6.2 DAO 模式的组成
- 7.6.3 使用实体类传递数据
- 7.6.4 实体类
- 7.6.5 定义实体类
- 7.6.6 使用实体类传递数据
- 7.6.7 实体类的特征
- 7.7 实现 JDBC 封装
-
- 7.7.1 JDBC
- 7.7.2 持久化的实现方式
- 7.7.3 为什么进行 JDBC 封装
- 7.7.4 使用 DAO 模式改造 Hospital
- 7.8 BaseDao基类
-
- 7.8.1 将通用的操作(打开、关闭连接等)封装到基类
- 7.8.2 基类 BaseDao:增、删、改的通用方法
- 7.8.3 实现类实现接口并继承 BaseDao 基类
- 7.9 项目结构图
-
- 7.9.1 项目名
- 7.9.2 enrity(实体类)
- 7.9.3 dao(接口类)
- 7.9.4 service (业务类)
- 7.9.5 Main (运行类)
- 7.9.6 lib(依赖包)
- 7.9.7 database (连接数据库配置文件)
- 7.10 命名规范
- 八、综合项目实训
-
- 8.1 理发店办卡项目
-
- 8.1.1 项目结构图
- 8.1.2 创建数据库sql
- 8.1.3 database.properties
- 8.1.4 dao
- 8.1.5 dao.impl
- 8.1.6 entity
- 8.1.7 service
- 8.1.8 service.impl
- 8.2 学生管理项目
- 8.3 淘宝购物车项目
- 8.4 医院挂号项目
- 8.5 求职招聘项目
- 九、MySQL 优化
-
- 9.1 避免使用 select *
- 9.2 用union all代替union
- 9.3 小表驱动大表
- 9.4 批量操作
- 9.5 多用limit
- 9.6 in中值太多
- 9.7 增量查询
- 9.8 高效的分页
- 9.9 用连接查询代替子查询
- 9.10 join的表不宜过多
- 9.11 join时要注意
- 9.12 控制索引的数量
- 9.13 选择合理的字段类型
- 9.14 提升group by的效率
- 9.15 索引优化
- 十、附件
-
- 10.1 BCSP 配套数据库`hospital`
- 10.2 BCSP 配套数据库`mySchool`
- 8.2 连接数据库配置文件`database.properties`
- 10.3 JDBC 工具类`BaseDao.java`
- 10.4 MySQL 函数
-
- MySQL 字符串函数
- MySQL 数字函数
文章目录
- 玄子Share-BCSP助学手册之数据库开发
- 目录
-
- @[toc]
- 一、课程软件的安装与卸载
-
- 1.1 MySQL 版本选择与安装方式
-
- 1.1.1 MySQL 版本选择
- 1.1.2 MySQL 安装方式
- 1.2 MySQL 压缩包安装教程
-
- 1.2.1 下载链接
- 1.2.2 安装 MySQL
- 1.2.3 添加配置文件
- 1.2.4 配置环境变量
- 1.2.5 安装 MySQL 服务
- 1.2.6 删除配置文件代码
- 1.2.7 验证 MySQL 配置
- 1.2.8 完成下课
- 1.3 MySQL 安装器安装教程
-
- 1.3.1 下载链接
- 1.3.2 安装 MySQL
- 1.3.3 配置环境变量
- 1.3.4 验证 MySQL 配置
- 1.3.5 完成下课
- 1.4 MySQL 卸载教程
-
- 1.4.1 压缩包卸载
- 1.4.2 安装器卸载
- 1.5 MySQL管理工具安装
-
- 1.5.1 下载链接
- 1.5.2 Navicate 安装
- 1.5.3 SqlYog 安装
- 1.5.4 PowerDesigner 安装
- 二、MySQL 数据库设计
-
- 2.1 为什么需要设计数据库
-
- 2.1.1 软件项目开发周期中数据库设计
- 2.1.2 设计数据库的步骤
- 2.2 为什么使用 E-R 图
-
- 2.2.1 E-R 图概念
- 2.3 数据库设计模型转换
-
- 2.3.1 关系型数据库设计分类
- 2.3.2 各模型之间的素对应关系
- 2.3.3 数据模型转换方案
- 2.4 实体关系约束转换
-
- 2.4.1 一对多关系的两个实体
- 2.4.2 一对一关系的两个实体
- 2.4.3 多对多关系的两个实体
- 2.5 PowerDesigner 软件
-
- 2.5.1 绘制数据库模型图
- 2.5.2 生成 SQL 代码
- 2.6 数据库设计范式
-
- 2.6.1 三大数据库设计范式
- 2.7 规范化和性能的关系
-
- 2.7.1 演示案例
- 2.8 用三大范式设计表结构
-
- 2.8.1 实现思路
- 三、MySQL 基础
-
- 3.1 MySQL 简介
-
- 3.1.1 MySQL 发展历史
- 3.1.2 MySQL 的优势
- 3.1.3 MySQL 安装教程
- 3.2 命令行连接 MySQL
-
- 3.2.1 启动服务命令
- 3.2.2 停止服务命令
- 3.2.3 登录数据库命令
- 3.2.4 查看当前版本和用户信息
- 3.3 数据库管理指令
-
- 3.3.1 创建数据库
- 3.3.2 查看数据库列表
- 3.3.3 选择数据库
- 3.3.4 删除数据库
- 3.4 Navicat 数据库管理工具
-
- 3.4.1 安装教程
- 3.4.2 Navicat 连接 MySQL
- 3.4.3 使用 Navicat 创建数据库
- 3.5 结构化查询语言
-
- 3.5.1 DML (数据操作语言)
- 3.5.2 DDL (数据定义语言)
- 3.5.3 DQL (数据查询语言)
- 3.5.4 DCL (数据控制语言)
- 3.6 MySQL 数据类型
-
- 3.6.1 数值类型
- 3.6.2 日期类型
- 3.6.3 字符串
- 3.7 DDL (数据定义语言)
-
- 3.7.1 创建表
- 3.7.2 修改表
- 3.7.3 删除表
- 3.8 MySQL 注释
-
- 3.8.1 单行注释
- 3.8.2 多行注释
- 3.9 MySQL 字段的约束及属性
-
- 3.9.1 主键约束
- 3.9.2 外键约束
- 3.9.3 主键与外键的区别
- 3.9.4 主外键建立后注意事项
- 3.10 MySQL 注释与字符集编码
-
- 3.10.1 注释
- 3.10.2 设置字符集编码
- 3.10.3 演示案例
- 3.11 MySQL 查看表
-
- 3.11.1 查看数据库中的表
- 3.11.2 描述表结构
- 3.12 MySQL 的存储引擎
-
- 3.12.1 存储引擎的类型
- 3.12.2 查看系统所支持的存储引擎类型
- 3.12.3 常用的 MySQL 存储引擎
- 3.12.4 InnoDB 和 MyISAM 存储引擎比较
- 3.12.5 适用场合
- 3.12.6 查看当前存储引擎
- 2.12.7 修改存储引擎
- 3.12.8 设置表的存储引擎
- 3.12.9 数据表的存储文件
- 3.12.10 存储位置
- 3.13 MySQL 系统帮助
-
- 3.13.1 详细帮助
- 四、MySQL 高级(DML 增删改)
-
- 4.1 DML 数据操纵语言
- 4.2 插入数据
-
- 4.2.1 一次向表中插入一条记录
- 4.2.2 一次向表中插入多行数据
- 4.2.3 将查询结果插入到新表
- 4.3 更新数据
-
- 4.3.1 更新数据记录
- 4.4 删除数据
-
- 4.4.1 删除数据记录
- 4.4.2 格式化表记录
- 4.5 比较 DROP、DELETE 与 TRUNCATE 语句
-
- 4.5.1 执行速度
- 4.5.2 使用选择
- 五、MySQL 高级(DQL 查)
-
- 5.1 DQL 数据查询语言
- 5.2 基础查询
-
- 5.2.1 查询全部行和列
- 5.2.2 查询部分列
- 5.2.3 AS 别名
- 5.3 运算符
-
- 5.3.1 算术运算符
- 5.3.2 比较运算符
- 5.3.3 逻辑运算符
- 5.3.4 位运算符
- 5.3.5 运算符优先级
- 5.4 条件查
-
- 5.4.1 精确查询
- 5.4.2 单条件查询
- 5.4.3 多条件查询
- 5.5 排序查
-
- 5.5.1 升序排序
- 5.5.2 降序排序
- 5.5.3 多字段排序
- 5.6 常用函数
-
- 5.6.1 字符串函数
- 5.6.2 时间日期函数
- 5.6.3 聚合函数
- 4.6.4 数学函数
- 5.7 分组查
-
- 5.7.1 GROUP BY
- 5.7.2 HAVING
- 5.8 分页查
-
- 5.8.1 下标 5 开始查询 5 条
- 5.8.2 每页 m 个数据查第 n 页
- 5.9 模糊查
-
- 5.9.1 通配符
- 5.9.2 LIKE
- 5.9.3 BETWEEN
- 5.9.4 IS NULL
- 5.10 子查询
-
- 5.10.1 IN 子查询
- 5.10.2 NOT IN 子查询
- 5.10.3 EXISTS
- 5.10.4 EXISTS 子查询
- 5.10.5 NOT EXIST 子查询
- 5.10.6 子查询小结
- 5.10.7 子查询注意事项
- 5.11 连接查
-
- 5.11.1 JOIN
- 5.11.2 内连接
- 5.11.3 外连接
- 5.12 执行顺序
-
- 5.12.3书写顺序
- 5.12.4 执行顺序
- 六、企业级开发技术
-
- 6.1 存储过程
-
- 6.1.1 什么是存储过程
- 6.1.2 存储过程可以包含
- 6.1.3 存储过程的优缺点
- 6.1.4 创建存储过程
- 6.1.5 定义存储过程的参数
- 6.1.6 调用存储过程
- 6.1.7 查看存储过程状态
- 6.1.8 查看存储创建代码
- 6.1.9 修改存储过程
- 6.1.10 删除存储过程
- 6.1.11 存储过程中的变量
- 6.1.12 存储过程控制语句
- 6.1.13 IF-ELSEIF-ELSE 条件语句
- 6.1.14 CASE 条件语句
- 6.1.15 WHILE 循环语句
- 6.1.16 LOOP 循环语句
- 6.1.17 REPEAT 循环语句
- 6.1.18 迭代语句
- 6.2 事务
-
- 6.2.1 什么是事务
- 6.2.2 事务的特性
- 6.2.3 如何创建事务
- 6.2.4 事务处理
- 6.2.5 自动关闭和开启事务
- 6.2.6 遵循原则
- 6.3 视图
-
- 6.3.1 为什么需要视图
- 6.3.2 什么是视图
- 6.3.3 视图的好处
- 6.3.4 创建 / 查看视图
- 6.3.5 使用视图注意事项
- 6.3.6 演示案例
- 6.4 索引
-
- 6.4.1 什么是索引
- 6.4.2 常用索引类型
- 6.4.3 创建/删除索引
- 6.4.4 创建索引的指导原则
- 6.4.5 使用索引时注意事项
- 6.4.6 查看索引 / 删除索引
- 6.5 数据库的备份与恢复
-
- 6.5.1 为什么进行数据库备份
- 6.5.2 数据的备份与恢复
- 6.5.3 mysqldump 备份数据库
- 6.5.4 Navicat 备份数据库
- 6.5.5 恢复数据库
- 6.5.6 mysql 恢复数据库
- 6.5.7 source 恢复数据库
- 6.5.8 Navicat 恢复数据库
- 七、JDBC 与 DAO 模式
-
- 7.1 JDBC 介绍
-
- 7.1.1 什么是 JDBC
- 7.1.2 JDBC 的工作原理
- 7.1.3 JDBC API
- 7.2 使用 JDBC 连接数据库
-
- 7.2.1 导入 JDBC 驱动 JAR 包
- 7.2.2 纯 Java 驱动方式
- 7.2.3 JDBC编程模板
- 7.2.4 数据库连接字符串
- 7.2.5 Connection 接口
- 7.2.6 连接本地 hospital 数据库
- 7.2.7 常见异常
- 7.3 Statement 操作数据库
-
- 7.3.1 Java 的字符串操作
- 7.3.1 Statement 插入数据
- 7.3.2 Statement 更新数据
- 7.3.3 ResultSet 接口
- 7.3.4 Statement 和 ResultSet 查询数据
- 7.4 PreparedStatement 操作数据库
-
- 7.4.1 SQL 注入攻击
- 7.4.2 PreparedStatement 接口
- 7.4.3 PreparedStatement 操作数据
- 7.4.4 PreparedStatement 的优势
- 7.5 Properties 配置文件
-
- 7.5.1 为什么使用 Properties 类
- 7.5.2 properties配置文件
- 7.5.3 读取配置文件信息
- 7.6 DAO 模式
-
- 7.6.1 什么是 DAO
- 7.6.2 DAO 模式的组成
- 7.6.3 使用实体类传递数据
- 7.6.4 实体类
- 7.6.5 定义实体类
- 7.6.6 使用实体类传递数据
- 7.6.7 实体类的特征
- 7.7 实现 JDBC 封装
-
- 7.7.1 JDBC
- 7.7.2 持久化的实现方式
- 7.7.3 为什么进行 JDBC 封装
- 7.7.4 使用 DAO 模式改造 Hospital
- 7.8 BaseDao基类
-
- 7.8.1 将通用的操作(打开、关闭连接等)封装到基类
- 7.8.2 基类 BaseDao:增、删、改的通用方法
- 7.8.3 实现类实现接口并继承 BaseDao 基类
- 7.9 项目结构图
-
- 7.9.1 项目名
- 7.9.2 enrity(实体类)
- 7.9.3 dao(接口类)
- 7.9.4 service (业务类)
- 7.9.5 Main (运行类)
- 7.9.6 lib(依赖包)
- 7.9.7 database (连接数据库配置文件)
- 7.10 命名规范
- 八、综合项目实训
-
- 8.1 理发店办卡项目
-
- 8.1.1 项目结构图
- 8.1.2 创建数据库sql
- 8.1.3 database.properties
- 8.1.4 dao
- 8.1.5 dao.impl
- 8.1.6 entity
- 8.1.7 service
- 8.1.8 service.impl
- 8.2 学生管理项目
- 8.3 淘宝购物车项目
- 8.4 医院挂号项目
- 8.5 求职招聘项目
- 九、MySQL 优化
-
- 9.1 避免使用 select *
- 9.2 用union all代替union
- 9.3 小表驱动大表
- 9.4 批量操作
- 9.5 多用limit
- 9.6 in中值太多
- 9.7 增量查询
- 9.8 高效的分页
- 9.9 用连接查询代替子查询
- 9.10 join的表不宜过多
- 9.11 join时要注意
- 9.12 控制索引的数量
- 9.13 选择合理的字段类型
- 9.14 提升group by的效率
- 9.15 索引优化
- 十、附件
-
- 10.1 BCSP 配套数据库`hospital`
- 10.2 BCSP 配套数据库`mySchool`
- 8.2 连接数据库配置文件`database.properties`
- 10.3 JDBC 工具类`BaseDao.java`
- 10.4 MySQL 函数
-
- MySQL 字符串函数
- MySQL 数字函数
一、课程软件的安装与卸载
1.1 MySQL 版本选择与安装方式
1.1.1 MySQL 版本选择
按照教材上的要求,统一使用MySQL版本号为的版本
1.1.2 MySQL 安装方式
MySQL 的安装方式有两种
- 安装器直接安装
- 压缩包配置安装
安装器安装,快速便捷,安装过程均为图像操作界面,但缺点是卸载,极其麻烦,不仅要删除MySQL文件,还要删除注册表,等相关信息。如果卸载不干净,影响以后的安装配置等。
压缩包安装,相对比较麻烦,需要解压后,自行配置MySQL服务等,但优点是,卸载非常简单,只需要把解压文件删除即可。
我推荐使用,压缩包解压配置的方式安装MySQL,虽然麻烦了一点,但后期使用MySQL出现问题,需要重新安装MySQL就会很舒服。
两种安装方式我都写有教程,不用纠结使用哪种安装方式,能安装上就行了。
1.2 MySQL 压缩包安装教程
1.2.1 下载链接
官方 https://downloads.mysql.com/archives/community/
度盘 https://bianchenghao.cn/s/1fuGdLIDXx2-2b5mEdqEh3g?pwd=xzsr
1.2.2 安装 MySQL
注意选择版本号为
下载完后我们会得到一个以 MySQL 开头命名的压缩包,我们需要把这个压缩包解压到本地
这里可以把 MySQL 文件名后面的删除掉(度盘下载的压缩包我已经删除过了)
推荐将文件解压到 C 盘的 Program Files 文件下,即解压路径为
1.2.3 添加配置文件
在文件夹内新建一个文本文档,【强制】命名为:
注意开启设置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BGGSYu1O-09)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE947.png)]
如果在度盘下载的压缩包,我在压缩包中已经写入过文件,只需要注意自己的安装路径是否和配置文件内路径一致即可
使用记事本方法打开文件,将下面的配置文件粘贴进去
basedir:就是mysql的安装路径
datadir:只需要把前面的路径替换即可
文本里的代码前面是没有数字的
1.2.4 配置环境变量
- 右键此电脑
- 属性
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zYNgEaGg-10)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE010.png)]
- 高级系统设置
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PlkxL24f-10)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE026.png)]
- 环境变量
- 下方系统变量,找到双击进入
- 新建系统变量,变量值为 mysql 安装目录(实际路径以自己安装时设置为准)
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lsuiIp8g-11)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE206.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DRPb2ri3-11)(https://blog.csdn.net/_/article/details/assets/image-.png)]
- 配置好后,保存退出
- 按下然后通过管理员身份打开
- 输入查看环境是否配置成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6GByu5q6-12)(https://blog.csdn.net/_/article/details/assets/image-.png)]
1.2.5 安装 MySQL 服务
- 按下键盘打开运行输入以管理员身份运行
- cd 到 mysql 文件的 bin 目录中
- 输入命令安装 MySQL 服务
- 继续输入初始化 data 目录
- 输入启动 MySQL 服务
- 成功启动后,输入 登录 MySQL
- 成功登录之后,输入下面代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jkya4ICN-12)(https://blog.csdn.net/_/article/details/assets/image-.png)]
- 这里的就是登录密码,账户名也是或者你可以把密码改成自己喜欢的
- 再输入刷新一下权限
- 最后输入退出 MySQL 即可
1.2.6 删除配置文件代码
退出后回到配置文件中,用注释掉或者直接删除掉最后一行代码然后保存退出
到这里就已经成功下载并配置好了 MySQL
1.2.7 验证 MySQL 配置
-
命令行先输入关闭 MySQL 服务
-
在输入开启 MySQL 服务
-
这里报错的请自己到服务中手动打开 MySQL 服务后重新尝试
-
登录数据库
mysql -u账户名 -p密码
注意密码前后不能有空格
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jHpcOA8F-13)(https://blog.csdn.net/_/article/details/assets/image-.png)]
最后可以输入一个查询版本信息的SQl语句玩一下: 代码后面有分号
1.2.8 完成下课
MySQL 压缩包安装教程
1.3 MySQL 安装器安装教程
1.3.1 下载链接
官方 https://downloads.mysql.com/archives/installer/
度盘 https://bianchenghao.cn/s/1fuGdLIDXx2-2b5mEdqEh3g?pwd=xzsr
1.3.2 安装 MySQL
注意选择版本号为
下载完后我们会得到一个以 MySQL 开头命名的安装器,直接双击运行安装
- 提示是否更新,即可
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vpVNbM-13)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE027.png)]
- 勾选下方自定义安装
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lK74EniP-13)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE154.png)]
- 左边找到箭头添加到右边
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sU5JjuVV-13)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE349.png)]
- 执行安装即可
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uoBYAK3O-14)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE415.png)]
- 这个界面保持默认状态
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ilKW14vg-14)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE532.png)]
- 设置登录密码(默认设置为 )
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oOARyqya-15)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE947.png)]
- 这里的就是服务器名称,下一步
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-60GkTQBK-15)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE658.png)]
- 安装完毕
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KRzR7tVL-15)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE754.png)]
1.3.3 配置环境变量
- 右键此电脑
- 属性
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KyTxI90M-15)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE010.png)]
- 高级系统设置
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VVRMOf14-16)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE026.png)]
- 环境变量
- 下方系统变量,找到双击进入
- 新建系统变量,变量值为 mysql 安装目录(实际路径以自己安装时设置为准)
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0fspwxDq-16)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE206.png)]
- 配置好后,保存退出
- 按下然后通过管理员身份打开
- 输入查看环境是否配置成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nUFVwqB7-17)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE945.png)]
1.3.4 验证 MySQL 配置
- 再次通过按下打开窗口
- 输入账号密码(-u后的为管理员账号,-p后的为之前设置的MySQL登录密码,没有空格直接跟密码)
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lVtUoPTc-17)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE416.png)]
最后可以输入一个查询版本信息的SQl语句玩一下: 代码后面有分号
1.3.5 完成下课
MySQL 安装器安装教程
1.4 MySQL 卸载教程
1.4.1 压缩包卸载
压缩包安装方式安装的MySQL,卸载就直接删除掉解压后的MySQL文件夹即可,然后删除配置的 MySQL 环境变量
1.4.2 安装器卸载
- 按下打开窗口输入打开服务
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AW2C5Dna-17)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE901.png)]
- 找到MySQL停止服务
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I8pGlJuQ-17)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE926.png)]
- 打开控制面板
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SSE6cN9h-18)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE617-74-23.png)]
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rcktxR7D-18)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE629.png)]
- 这里的两个软件都要卸载掉
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m2w8LiTT-18)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE648.png)]
到这里只是卸载了MySQL软件,MySQL还有许多文件并没有删掉,如果不删除干净,会影响后续安装导致安装失败。
- 删除MySQL在电脑硬盘上物理位置上的所有文件
- 内所有文件
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MqIb59cv-19)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE218.png)]
- 内所有文件,该文件是默认隐藏的,设置显示后即可见
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SM5PUKPq-19)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE312.png)]
- 内所有文件
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9UBEKZH0-19)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE346.png)]
到这里也只是删掉了MySQL所有残余文件,还需要删除MySQL的注册表信息
- 按下打开窗口输入打开注册表
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D7FMHaeM-20)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE549.png)]
- 删除以下三项内所有信息(可直接粘贴至地址栏)
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xe9Iiiqn-20)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE609.png)]
- 到此MySQL算是彻底卸载完毕
1.5 MySQL管理工具安装
1.5.1 下载链接
Navicate官网 https://www.navicat.com/en/products
SqlYog官网 https://sqlyog.en.softonic.com/
度盘 https://bianchenghao.cn/s/1fuGdLIDXx2-2b5mEdqEh3g?pwd=xzsr
1.5.2 Navicate 安装
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-koVrGUFS-20)(https://blog.csdn.net/_/article/details/assets/image–44-4.png)]
Navicate 涉及版权无法分享,加封面联系方式获取软件
1.5.3 SqlYog 安装
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zywy07Tj-21)(https://blog.csdn.net/_/article/details/assets/image-.png)]
SqlYog 涉及版权无法分享,加封面联系方式获取软件
1.5.4 PowerDesigner 安装
PowerDesigner 涉及版权无法分享,加封面联系方式获取软件
二、MySQL 数据库设计
2.1 为什么需要设计数据库
良好的数据库设计
- 降低应用程序的开发难度
- 具备高效的查询效率
- 具备良好的扩展性
糟糕的数据库设计
- 出现数据操作异常、修改复杂、数据冗余等问题
- 影响程序的性能,甚至会导致程序崩溃
数据库设计是对数据库中实体以及这些实体之间的关系进行规划和结构化的过程,当数据库比较复杂时,需要设计数据库
2.1.1 软件项目开发周期中数据库设计
- 需求分析阶段:分析客户的业务和数据处理需求
- 概要设计阶段:设计数据库的E-R模型图,确认需求信息的正确和完整
- 详细设计阶段:应用三大范式审核数据库结构
- 代码实现阶段:物理实现数据库,编码实现应用
- 软件测试阶段:……
- 上线部署:……
2.1.2 设计数据库的步骤
收集信息
- 通过对业务人员的访谈等方法,充分了解用户需求,理解数据库需要存储的业务信息(数据)及需要提供的操作
标识实体 (Entity)
- 标识数据库要管理的关键对象或实体,实体一般是名词
标识每个实体的属性(Attribute)
标识实体之间的关系(Relationship)
数据库设计中,不能重复出现含义相同的实体
2.2 为什么使用 E-R 图
2.2.1 E-R 图概念
E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WfN24s22-21)(https://blog.csdn.net/_/article/details/assets/image-.png)]
- E-R图表示映射关系时,也可以通过添加箭头区分一对多和多对一
- 箭头指向映射关系为一的实体
- 在业务人员与开发人员的沟通中,E-R图能够极大的提高彼此之间的沟通效率
2.3 数据库设计模型转换
2.3.1 关系型数据库设计分类
-
概念数据模型设计
-
逻辑数据模型设计
-
物理数据模型设计
2.3.2 各模型之间的素对应关系
2.3.3 数据模型转换方案
基本转换原理
-
将E-R图中每一个实体转换成一个表,实体的属性转换为表的列,实体的标识符转换为表的主键
-
将实体关系转化为表之间的引用完整性约束
- 根据关系的不同类型,通过外键引用主键的方式有所不同
2.4 实体关系约束转换
2.4.1 一对多关系的两个实体
-
一般会各自转换为一张表,且后者对应的表引用前者对应的表
-
一个表中的主键对应另一个表中可重复的字段
-
主键的值是不能重复的,关联的字段是可以重复的
-
存在一个值对应一个值(一对一)或者一个值对应多个值(一对多)
-
2.4.2 一对一关系的两个实体
- 一般是一个主键对应一个不可重复的字段
2.4.3 多对多关系的两个实体
- 除了将多对多关系中的两个实体各自转换为表外,一般还会创建第3个表,称为连接表
- 将多对多关系划分为两个一对多关系,将这两个表主键都插入到第3个表中
2.5 PowerDesigner 软件
- Sybase 公司开发的一款强大的数据库设计软件
- 开发人员经常使用的数据库建模工具
- 能够使用设计好的数据库模型直接生成SQL建表语句
- 极大的提升数据库的开发效率
推荐使用的版本:PowerDesigner 16.5
PowerDesigner 涉及版权无法分享,加封面联系方式获取软件
2.5.1 绘制数据库模型图
- 创建物理数据模型
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3RDCabyC-22)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE814.png)]
- 绘制模型图
- 创建表实体
- 添加属性
- 添加实体之间的映射关系
- 两个实体间连线,箭头指向主表
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L0aMngHd-22)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE646.png)]
2.5.2 生成 SQL 代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WQMQ5iat-22)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE958.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WOf2sAcG-22)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE019.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wL0uYqUy-23)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE132.png)]
生成的 SQL文件可直接拿到 Navicate 运行
PowerDesigner中开发数据库模型图时,需要指定该模型图是为数据库管理系统开发的,因为PowerDesigner支持用数据库模型图生成数据库创建脚本的功能
2.6 数据库设计范式
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则
2.6.1 三大数据库设计范式
-
第一范式
- 第一范式的目标是确保每列保持原子性
- 如果每列都是不可再分的最小数据单(也称为最小的原子单),则满足第一范式(1NF)
-
第二范式
- 第二范式的目标是确保表中的每列都和主键相关
- 要求每个表只描述一件事情
-
第三范式
- 第三范式的目标是确保每列都和主键列直接相关,而不是间接相关
- 如果一个关系满足第二范式,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式(3NF)
2.7 规范化和性能的关系
为满足某种商业目标,数据库性能比规范化数据库更重要
-
通过在给定的表中添加额外的字段,以大量减少需要从中搜索信息所需的时间
-
通过在给定的表中插入计算列(如成绩总分),以方便查询
-
在数据规范化同时,要综合考虑数据库的性能
2.7.1 演示案例
金额 = 单价 * 数量,是冗余的列
为了提高查询统计速度,以空间换取时间
不要轻易违反数据库设计的规范化原则,如果处理不好,可能会适得其反,使应用程序运行速度更慢
2.8 用三大范式设计表结构
2.8.1 实现思路
-
向各表中插入数据,查看表中的每个属性列是否存在重复、插入异常、更新异常和删除异常
-
对照三大范式的定义,解决表中的异常问题
-
第一范式的目标是确保每列都是不可再分的最小数据单,查看每列是否都满足第一范式
-
第二范式的每列与主键相关,不相关的放入别的表中,即要求一个表只描述一件事情
-
第三范式要求表中各列必须和主键直接相关,不能间接相关,查看各表,满足第三范式,对于不满足三大范式的表要进行拆分
三、MySQL 基础
3.1 MySQL 简介
MySQL 是一款流行的开源数据库,也是一个关系型数据库管理系统
在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一
3.1.1 MySQL 发展历史
Oracle 收购 Sun 公司,进入 Oracle MySQL 时代2010 年MySQL 5.5 发布,InnoDB 成为默认的存储引擎2016 年MySQL 发布 8.0.0 版本
为什么没有 MySQL6、MySQL7?
MySQL5.6 可以当成 MySQL6.x
MySQL5.7 可以当成 MySQL7.x
3.1.2 MySQL 的优势
-
运行速度快
-
使用成本低
- 价格:MySQL对多数个人来说是免费的
-
容易使用
- 与其他大型数据库的设置和管理相比,其复杂程度较低,容易学习
-
可移植性强
- 能够工作在众多不同的系统平台上,例如:Windows 、Linux、Unix、MacOS等
-
适用用户广
-
丰富的接口
- 提供了用于C 、C++、Eiffel、Java、Perl、PHP、Python、Rudy和TCL 等语言的API
-
支持查询语言
- MySQL可以利用标准SQL语法和支持ODBC(开放式数据库连接)的应用程序
-
安全性和连接性
-
安全性和连接性; 十分灵活和安全的权限和密码系统,允许主机验证。连接到服务器时,所有的密码均采用加密形式,从而保证了密码安全
-
并且由于MySQL是网络化的,因此可以在因特网网上的任何地方访问,提高数据共享效率
-
3.1.3 MySQL 安装教程
官网 https://downloads.mysql.com/archives/community/
CSDN安装教程 https://blog.csdn.net/_/article/details/
安装教程见第一章、课程软件的安装与卸载
3.2 命令行连接 MySQL
-
首先检查 MySQL 服务是否启动
-
电脑按下打开窗口
3.2.1 启动服务命令
3.2.2 停止服务命令
3.2.3 登录数据库命令
参数说明:
指定客户端所要登录的 MySQL 主机名, 登录本机(localhost 或 127.0.0.1)该参数可以省略
登录的用户名
告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iHalnaYf-23)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE901.png)]
3.2.4 查看当前版本和用户信息
分号为结束符,不可缺
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D13ahSVO-24)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE928.png)]
3.3 数据库管理指令
3.3.1 创建数据库
Query OK:SQL语句执行成功
1 row affected:操作影响的行数
(0.00 sec):操作执行时间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nuQ2pNPs-24)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE046.png)]
3.3.2 查看数据库列表
student:用户数据库
其他的是系统数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ARXmDuEx-24)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE258.png)]
3.3.3 选择数据库
使用数据表前,必须先选择该数据库!
数据库不存在,报错
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XrsimpSZ-24)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE925.png)]
3.3.4 删除数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B4fKjD7o-25)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE227.png)]
3.4 Navicat 数据库管理工具
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cuodmnhH-25)(https://blog.csdn.net/_/article/details/assets/image–44-4.png)]
Navicat Premium是一款功能强大的、可支持多连接的数据库管理工具
允许在单一程序中同时连接多达7种数据库
-
MySQL
-
MariaDB
-
MongoDB
-
SQL Server
-
SQLite
-
Oracle
-
PostgreSQL
3.4.1 安装教程
官网 https://www.navicat.com/en/products
推荐使用:Navicat Premium 16 最新版
Navicate 涉及版权无法分享,加封面联系方式获取软件
3.4.2 Navicat 连接 MySQL
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pj0DjFUJ-26)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE815-28-4.png)]
3.4.3 使用 Navicat 创建数据库
- 通过操作向导创建数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7XjhpjEs-26)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE159-28-6.png)]
- 字符集要选择 SQL 预览可以查看建表语句
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PdAVy0rE-26)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE210-28-7.png)]
- 通过SQL语句创建数据库
3.5 结构化查询语言
3.5.1 DML (数据操作语言)
操作数据库中所包含的数据
- INSERT UPDATE DELETE
3.5.2 DDL (数据定义语言)
创建和删除数据库对象等操作
- CREATE DROP ALTER
3.5.3 DQL (数据查询语言)
对数据库中的数据进行查询
- SELECT
3.5.4 DCL (数据控制语言)
控制数据库组件的存取许可、存取权限等
- GRANT COMMIT ROLLBACK
3.6 MySQL 数据类型
MySQL 中定义数据字段的类型对你数据库的优化是非常重要的
MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型
3.6.1 数值类型
TINYINT非常小的数据有符值:-27~27-1
无符号值:0~28-11字节SMALLINT较小的数据有符值:-215~215-1
无符号值:0~216-12字节MEDIUMINT中等大小的数据有符值:-223~223-1
无符号值:0~224-13字节
INT标准整数有符值:-231~231-1
无符号值:0~232-14字节BIGINT较大的整数有符值:-263~263-1
无符号值:0~264-18字节FLOAT单精度浮点数±1.e-384字节
DOUBLE双精度浮点数±2.72014e-3088字节DECIMAL字符串形式的浮点数Decimal(M,D)M+2个字节
UNSIGNED 属性:标识为无符号数,非负数
ZEROFILL 属性:宽度(位数)不足以0填充
若某数值字段指定了 ZEROFILL 属性,将自动添加 UNSIGNED 属性
数值位数小于宽度,以0填充
数值位数大于宽度,显示实际位数
3.6.2 日期类型
DATETIMEYYYY-MM-DD hh:mm:ss1000-01-01 00:00:00 到 9999-12-31 23:59:59混合日期和时间值
TIMESTAMPYYYY-MM-DD hh:mm:ss‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-19 03:14:07’ UTC
结束时间是第
秒,北京时间
2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07混合日期和时间值,时间戳
若某日期字段默认值为系统当前日期,可指定为类型
3.6.3 字符串
CHAR[(M)]0-255 bytes定长字符串
VARCHAR[(M)]0-65535 bytes变长字符串TINYBLOB0-255 bytes不超过 255 个字符的二进制字符串TINYTEXT0-255 bytes短文本字符串BLOB0-65 535 bytes二进制形式的长文本数据
TEXT0-65 535 bytes长文本数据MEDIUMBLOB0-16 777 215 bytes二进制形式的中等长度文本数据MEDIUMTEXT0-16 777 215 bytes中等长度文本数据LONGBLOB0-4 294 967 295 bytes二进制形式的极大文本数据LONGTEXT0-4 294 967 295 bytes极大文本数据
char(m) 和 varchar(m) 中括号中 m 代表字符的个数,并不代表字节个数
比如 CHAR(30) 就可以存储 30 个字符
CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换
BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值
BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择
3.7 DDL (数据定义语言)
3.7.1 创建表
IF NOT EXISTS 判断表是否存在,存在就不重复建表了
多字段使用逗号分隔,保留字用撇号括起来
演示案例
- 如果你不想字段为可以设置字段的属性为,在操作数据库时如果输入该字段的数据为,就会报错
- AUTO_INCREMENT 定义列为自增的属性,一般用于主键,数值会自动加1
- PRIMARY KEY 关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔
- ENGINE 设置存储引擎,CHARSET 设置编码
3.7.2 修改表
- 修改表名
- 添加字段
- 修改字段
- 删除表中的字段
- 添加主键约束
- 添加外键约束
MySQL中,存储类型的表不支持外键。因此,可以通过建立逻辑关联的方式保证数据的完整性和一致性
3.7.3 删除表
在删除表之前,先使用语句验证表是否存在,执行 DROP TABLE 的表是空表,则可以直接删除
如果表中已存储了业务数据,则需和数据库管理员联系,先对数据库数据进行备份并确认,再执行删除表及数据的操作
3.8 MySQL 注释
3.8.1 单行注释
3.8.2 多行注释
3.9 MySQL 字段的约束及属性
3.9.1 主键约束
主键:使用数据库表中某一字段或某几个字段唯一标识所有记录
- 单字段主键
- 多字段联合主键
3.9.2 外键约束
其他约束的设置方式同理
3.9.3 主键与外键的区别
3.9.4 主外键建立后注意事项
- 当主表中没有对应的记录时,不能将记录添加到子表
- 不能更改主表中的值而导致子表中的记录孤立
- 子表存在与主表对应的记录,不能从主表中删除该行
- 删除主表前,先删子表
3.10 MySQL 注释与字符集编码
3.10.1 注释
-
COMMENT关键字
-
在表结构中可以看到,与代码注释不同、
3.10.2 设置字符集编码
-
默认情况下,MySQL所有数据库、表、字段等使用 MySQL 默认字符集
-
为了存储独特的数据,可在创建表时指定字符集
3.10.3 演示案例
3.11 MySQL 查看表
3.11.1 查看数据库中的表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qJXYQ1Rd-26)(https://blog.csdn.net/_/article/details/assets/image-.png)]
3.11.2 描述表结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uVITntrR-27)(https://blog.csdn.net/_/article/details/assets/image-.png)]
为了避免窗口出现中文乱码,可执行
3.12 MySQL 的存储引擎
存储引擎,是存储数据的核心组件,指定了表的存储类型和存储形式
3.12.1 存储引擎的类型
- InnoDB
- MyISAM
- Memory
- CSV
- 等9种
3.12.2 查看系统所支持的存储引擎类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pcg13h6A-27)(https://blog.csdn.net/_/article/details/assets/image-.png)]
3.12.3 常用的 MySQL 存储引擎
InnoDB 存储引擎
- 支持具有提交、回滚和崩溃恢复能力的事务控制
MyISAM 存储引擎
- 不支持事务,也不支持外键约束,访问速度比较快
3.12.4 InnoDB 和 MyISAM 存储引擎比较
3.12.5 适用场合
- 使用 MyISAM:不需事务,空间小,以查询访问为主
- 使用InnoDB:多删除、更新操作,安全性高,事务处理及并发控制
3.12.6 查看当前存储引擎
MySQL 5.7 版本默认的存储引擎是InnoDB
- 查看当前默认存储引擎
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YoeUH1S3-28)(https://blog.csdn.net/_/article/details/assets/image-.png)]
2.12.7 修改存储引擎
- 修改配置文件
修改配置文件后,需要重启MySQL服务设置才会生效
3.12.8 设置表的存储引擎
数据表默认使用当前 MySQL 默认的存储引擎
创建表时,可以设置表的存储引擎类型
演示案例
3.12.9 数据表的存储文件
MyISAM 类型表文件
-
表结构定义文件
-
数据文件
-
索引文件
InnoDB 类型表文件
-
表结构定义文件
-
文件
3.12.10 存储位置
因操作系统而异,可查
3.13 MySQL 系统帮助
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d4iem2aE-28)(https://blog.csdn.net/_/article/details/assets/image-.png)]
3.13.1 详细帮助
四、MySQL 高级(DML 增删改)
4.1 DML 数据操纵语言
DML(Data Manipulation Language)DML对数据库中表记录的执行操作
-
插入(INSERT)
-
插入单行数据
-
插入多行数据
-
将查询结果插入到新表
-
-
更新(UPDATE)
-
删除(DELETE)
软件开发人员日常使用最频繁的操作,必备技能!!!
4.2 插入数据
4.2.1 一次向表中插入一条记录
字段名是可选的,如省略,则依次插入所有字段
多个列表和多个值之间使用逗号分隔
值列表和字段名列表一 一对应
如果插入表中的部分字段数据,则字段名列表必填
每个数据值的数据类型、精度和小数位数必须与相应的列匹配
不能为标识列指定值(主键)
如果在设计表的时候就指定了某列不允许为空,则必须插入数据
如果字段具有默认值,可以使用关键字来代替插入的数值
4.2.2 一次向表中插入多行数据
为避免表结构发生变化引发的错误,建议插入数据时写明具体字段名!
4.2.3 将查询结果插入到新表
如果新表已存在,将会报错!
4.3 更新数据
4.3.1 更新数据记录
4.4 删除数据
4.4.1 删除数据记录
DELETE条件删除语句中,如果未指定WHERE条件语句,则将删除表中的所有数据
4.4.2 格式化表记录
使用 TRUNCATE 语句删除表中记录后,将重置自增列,表结构及其字段、约束、索引保持不变,执行速度比 DELETE 语句快
4.5 比较 DROP、DELETE 与 TRUNCATE 语句
4.5.1 执行速度
一般来说,DROP>TRUNCATE>DELETE
4.5.2 使用选择
- 使用 DROP、TRUNCATE 语句时,要慎重
- 如果使用 DELETE 语句删除表中部分数据要带上 WHERE 子句,且要注意表空间要足够大
- 如果要删除表,使用 DROP 语句
- 如果要保留表但删除表中所有数据,如果与事务无关可以使用 TRUNCATE 语句
- 如果与事务有关,则使用 DELETE 语句
五、MySQL 高级(DQL 查)
5.1 DQL 数据查询语言
Data Query Language,用于查询数据库的表中数据,是数据库中最为核心的语言,使用频率最高
5.2 基础查询
5.2.1 查询全部行和列
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UdtvUOyE-28)(https://blog.csdn.net/_/article/details/assets/image-.png)]
5.2.2 查询部分列
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b3OV0442-28)(https://blog.csdn.net/_/article/details/assets/image-.png)]
有的时候我们不想让用户看到所有的信息,比如用户密码这类的隐私信息,我们就可以通过写具体的字段,就只查询部分信息
在开发中,推荐使用以查询部分列的方式代替查询全部列,可提高执行效率并养成良好编码习惯
5.2.3 AS 别名
- 使用 AS 关键字,可以为表、字段、查询结果指定别名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EvdMoJwV-29)(https://blog.csdn.net/_/article/details/assets/image-049461.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7O4wSRJb-29)(https://blog.csdn.net/_/article/details/assets/image-.png)]
- 使用空格,简便的方法
为某个表命名了别名后,在 SELECT 语句中出现该表的字段需要指定表名时,就必须统一使用该表的别名;否则将产生语法错误
5.3 运算符
运算符是一种符号,用来进行列间或变量之间的比较和数学运算
MySQL 常的运算符
- 算术运算符
- 比较运算符
- 逻辑运算符
- 位运算符
5.3.1 算术运算符
在除法运算和模运算中,如果除数为0,将是非法除数,返回结果为 NULL
5.3.2 比较运算符
5.3.3 逻辑运算符
逻辑运算符用来判断表达式的真假。如果表达式是真,结果返回 1。如果表达式是假,结果返回 0
5.3.4 位运算符
位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数
5.3.5 运算符优先级
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SMdejDbc-30)(https://blog.csdn.net/_/article/details/assets/-043227-.png)]
5.4 条件查
如果我们查询时,并不想显示所有的用户信息,只要查出满足指定条件的部分用户,或者精确到某一个用户的信息,就需要使用到 WHERE 关键字对 sql 语句增加查询条件
5.4.1 精确查询
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UQ6PUGPO-30)(https://blog.csdn.net/_/article/details/assets/image-.png)]
这里我们就把患者 ID 作为查询条件,查询出患者 ID 为 1 的患者信息
5.4.2 单条件查询
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gRiDtYN2-30)(https://blog.csdn.net/_/article/details/assets/image-.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tB2tUCmz-30)(https://blog.csdn.net/_/article/details/assets/image-.png)]
5.4.3 多条件查询
-
如果查询条件中包含的条件不止一个,则条件根据逻辑关系的不同可以分为条件和条件两种
-
条件表示要求同时满足两个以上的条件,使用 AND 关键字可以构造条件。
-
条件表示几个条件中只需满足其中一个的条件,使用 OR 关键字可以构造条件
-
AND
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MZDv01Kn-31)(https://blog.csdn.net/_/article/details/assets/image-.png)]
- OR
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3BI7X4PP-31)(https://blog.csdn.net/_/article/details/assets/image-059106.png)]
姓名 和 住址 这两个条件满足一个即可
5.5 排序查
5.5.1 升序排序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yaZxJlvk-31)(https://blog.csdn.net/_/article/details/assets/image-.png)]
这里我们使用 ORDER BY 关键字,对病人的出生年月进行排序,默认是从小到大,也就是
5.5.2 降序排序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gkm1A37U-32)(https://blog.csdn.net/_/article/details/assets/image-.png)]
使用降序排列只需要 在最后加上一个关键字即可
升序排序后面其实也有一个关键字不过默认就是升序排列,所以加不加都可以
5.5.3 多字段排序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-js0iKDAT-32)(https://blog.csdn.net/_/article/details/assets/image-.png)]
如果想要对多个字段进行排序,可直接使用分隔。然后写第二个需要排序的字段和排序方式即可
5.6 常用函数
MySQL 中将一些常用的数据处理操作封装起来,作为函数提供给程序员使用,可以提高程序员开发效率
MySQ L支持的常用函数
-
字符串函数
-
时间日期函数
-
聚合函数
-
数学函数
5.6.1 字符串函数
5.6.2 时间日期函数
NOW()获取当前日期和时间SELECT NOW(); 返回:2020-08-03 16:55:00WEEK(date)返回日期date为一年中的第几周SELECT WEEK(NOW()); 返回:31YEAR(date)返回日期date的年份SELECT YEAR(NOW()); 返回:2020HOUR(time)返回时间time的小时值SELECT HOUR(NOW()); 返回:16MINUTE(time)返回时间time的分钟值SELECT MINUTE(NOW()); 返回:56DATEDIFF(date1,date2)返回日期参数date1和date2之间相隔的天数SELECT DATEDIFF(NOW(), ‘2019-8-8’); 返回:361ADDDATE(date,n)计算日期参数date加上n天后的日期SELECT ADDDATE(NOW(), 5); 返回:2020-08-07 16:57:28UNIX_TIMESTAMP(date)将日期转换成时间戳SELECT UNIX_TIMESTAMP(‘2020-9-1’); 返回:DATE_ADD(d,INTERVAL expr type)计算起始日期 d 加上一个时间段后的日期SELECT DATE_ADD(‘2017-06-15’, INTERVAL 10 DAY); 返回:2017-06-25
type 参数可以是下列值:MICROSECOND,SECOND,MINUTE,HOUR,DAY,WEEK,MONTH,QUARTER,YEAR,SECOND_MICROSECOND,MINUTE_MICROSECOND,MINUTE_SECOND,HOUR_MICROSECOND,HOUR_SECOND,HOUR_MINUTE,DAY_MICROSECOND,DAY_SECOND,DAY_MINUTE,DAY_HOUR,YEAR_MONTH
5.6.3 聚合函数
4.6.4 数学函数
MySQL 中还有许多专业领域或不常用的函数,想具体了解见文章附件:
5.7 分组查
5.7.1 GROUP BY
如果我们想要对,查询结果分组,比如按照,考试的科目ID 进行分组。就要使用GROUP BY 关键字对 进行分组,首先我们可以看到成绩表中有四个字段分别是,,,。其中有三个编号我们就可以对其分组查询查出这三个编号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-62NzzS0C-32)(https://blog.csdn.net/_/article/details/assets/image-.png)]
- 分组考试成绩表中的科目编号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rmQ5x4I8-33)(https://blog.csdn.net/_/article/details/assets/image-.png)]
这样分组就只能看到成绩表中的科目 ID,并不能查询其他字段,所以我们通常搭配使用
- 分组科目编号,查询对应科目考试成绩的平均分
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AUf2api0-33)(https://blog.csdn.net/_/article/details/assets/image-.png)]
5.7.2 HAVING
我们在使用 GROUP BY 分组后还想要进一步筛选查询结果,就需要使用 HAVING 关键字进一步筛选,这里并不能使用 WHERE
- 分组考试成绩表中的科目编号,后再次筛选
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IukpSkZZ-33)(https://blog.csdn.net/_/article/details/assets/image-.png)]
5.8 分页查
5.8.1 下标 5 开始查询 5 条
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bxmzQDH0-34)(https://blog.csdn.net/_/article/details/assets/image-.png)]
使用LIMIT子句时,第1条记录的位置是0!
LIMIT 子句经常和 ORDER BY 子句一起使用,即先对查询结果进行排序,再根据 LIMIT 子句的参数返回指定的数据
5.8.2 每页 m 个数据查第 n 页
5.9 模糊查
5.9.1 通配符
模糊查询一般使用关键字 LIKE 主要用于匹配列中的数据
5.9.2 LIKE
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MnMPri1A-34)(https://blog.csdn.net/_/article/details/assets/image-.png)]
匹配的字符串必须加单引号或者双引号
默认情况下,LIKE 关键字匹配字符串时候不区分大小写,可以在 LIKE 关键字后添加 BINARY 关键字来区分大小写。
如果查询内容中有通配符字符,就需要加转义字符
5.9.3 BETWEEN
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-odBvhhxR-34)(https://blog.csdn.net/_/article/details/assets/image-.png)]
NOT 可选参数,表示取反
查询指定范围内所有值,包括起始值和最终值
5.9.4 IS NULL
IS NULL关键字判断该列的值是否为空值,空值不是空字符串
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZaEwyE-34)(https://blog.csdn.net/_/article/details/assets/image-.png)]
NOT 可选参数,表示取反
5.10 子查询
子查询是一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ygalQA56-35)(https://blog.csdn.net/_/article/details/assets/image-.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tm1tfpTE-35)(https://blog.csdn.net/_/article/details/assets/image-.png)]
先执行子查询,返回所有来自子查询的结果
再执行外围的父查询,返回查询的最终结果
将子查询和比较运算符联合使用
必须保证子查询返回的值不能多于一个
5.10.1 IN 子查询
- 如果子查询的结果为多个值,就会导致代码报错
- 解决方案就是使用 IN 关键字,将 = 替换成 IN
5.10.2 NOT IN 子查询
-
与 一样,查询结果有多条使用
-
获取的值是不包含在查询结果里面的值
5.10.3 EXISTS
5.10.4 EXISTS 子查询
- 子查询有返回结果: EXISTS 子查询结果为 TRUE
- 子查询无返回结果: EXISTS 子查询结果为 FALSE,外层查询不执行
5.10.5 NOT EXIST 子查询
- 与 EXISTS 子查询相反
- 子查询有返回结果: NOT EXIST子查询结果为 FALSE
- 子查询无返回结果: NOT EXIST子查询结果为 TRUE,外层查询执行
5.10.6 子查询小结
当一个查询是另一个查询的条件时,称之为子查询
-
任何允许使用表达式的地方都可以使用子查询
-
嵌套在父查询SELECT语句的子查询,可包括
-
SELECT 子句
-
FROM 子句
-
WHERE 子句
-
GROUP BY 子句
-
HAVING 子句
-
5.10.7 子查询注意事项
通常,将子查询放在比较条件的右边以增加可读性
子查询可以返回单行或多行数据,此时要选择合适的关键字
-
子查询的返回是单行数据时,比较条件中可以使用比较运算符
-
子查询的返回是多行数据时,比较条件中需要使用IN或 NOT IN 关键字
-
如果判断子查询是否有数据返回时,需要使用 EXISTS 或 NOT EXISTS 关键字
只出现在子查询中、而没有出现在父查询中的列不能包含在输出列中
5.11 连接查
5.11.1 JOIN
JOIN 按照功能大致分为如下三类
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录
5.11.2 内连接
最典型、最常用的连接查询,根据两张表中共同的列进行匹配,两个表存在主外键关系时,通常会使用内连接查询
INNER JOIN用来连接两个表
INNER可以省略
ON用来设置两个表之间的关联条件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oo1Hamso-36)(https://blog.csdn.net/_/article/details/assets/image-.png)]
5.11.3 外连接
特点
- 外连接可以分为主表和从表
- 主表的数据会被完全显示出来
- 从表中只显示满足连接条件的数据
- 外连接结果一般会比主表和从表中数据量最小的表中的数据多
- 左外连
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vwpOSS2t-36)(https://blog.csdn.net/_/article/details/assets/image-.png)]
- 右外连
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jqxe0fq6-36)(https://blog.csdn.net/_/article/details/assets/image-.png)]
5.12 执行顺序
5.12.3书写顺序
select->distinct->from->join->on->where->group by->having->order by->limit
5.12.4 执行顺序
from->on->join->where->group by(开始使用select中的别名,后面的语句中都可以使用别名)->sum、count、max、avg->having->select->distinct->order by->limit
六、企业级开发技术
6.1 存储过程
关于存储过程我只能说请看下图,这是阿里巴巴发布的在 MySQL 第七条中强制指出禁止使用存储过程
所以对于存储过程不必深究,做到会写能看懂即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fuFR4d6Z-37)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE802.png)]
6.1.1 什么是存储过程
Stored Procedure
- 是一组为了完成特定功能的 SQL 语句集合
- 经编译后保存在数据库中
- 通过指定存储过程的名字并给出参数的值
- MySQL5.0 版本开始支持存储过程,使数据库引擎更加灵活和强大
6.1.2 存储过程可以包含
- 可带参数,也可返回结果
- 可包含数据操纵语句、变量、逻辑控制语句等
6.1.3 存储过程的优缺点
优点
- 减少网络流量
- 提升执行速度
- 减少数据库连接次数
- 安全性高
- 复用性高
缺点
- 可移植性差
SQL 最大的缺点还是 SQL 语言本身的局限性 SQL 本身是一种结构化查询语言,我们不应该用存储过程处理复杂的业务逻辑让 SQL 回归它的功用。复杂的业务逻辑,还是交给代码去处理吧
6.1.4 创建存储过程
说明LANGUAGE SQL表示存储过程语言,默认SQL{CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}表示存储过程要做的工作类别默认值为CONTAINS SQLSQL SECURITY { DEFINER | INVOKER }指定存储过程的执行权限默认值是DEFINERDEFINDER:使用创建者的权限INVOKER:用执行者的权限COMMENT ‘string’存储过程的注释信息
如果省略 SQL SECURITY 特性,则使用 DEFINER 属性指定调用者,且调用者必须具有 EXECUTE 权限,必须在 mysql.user 表中如果将 SQL SECURITY 特性指定为 INVOKER,则 DEFINER 属性无效
6.1.5 定义存储过程的参数
IN:指输入参数
- 该参数的值必须在调用存储过程时指定
- 存储过程中可以使用该参数,但它不能被返回
OUT:指输出参数
- 该参数可以在存储过程中发生改变,并可以返回
INOUT:指输入输出参数
- 该参数的值在调用存储过程时指定
- 在存储过程中可以被改变和返回
如果需要定义多个参数,需要使用进行分隔
6.1.6 调用存储过程
存储过程调用类似于Java中的方法调用
6.1.7 查看存储过程状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NFJ5lJ7B-37)(https://blog.csdn.net/_/article/details/assets/image-.png)]
6.1.8 查看存储创建代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0tccXxow-37)(https://blog.csdn.net/_/article/details/assets/image-.png)]
6.1.9 修改存储过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tC2qX6Is-38)(https://blog.csdn.net/_/article/details/assets/image-.png)]
6.1.10 删除存储过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RvTj3iv0-38)(https://blog.csdn.net/_/article/details/assets/image-.png)]
6.1.11 存储过程中的变量
与Java语言类似,定义存储过程时可以使用变量
给变量进行赋值
定义存储过程时,所有局部变量的声明一定要放在存储过程体的开始;否则,会提示语法错误
系统变量
- 指 MySQL 全局变量,以开头,形式为
用户自定义变量
- 局部变量
- 一般用于SQL的语句块中,如:存储过程中的BEGIN和END语句块
- 作用域仅限于定义该变量的语句块内
- 生命周期也仅限于该存储过程的调用期间
- 在存储过程执行到END时,局部变量就会被释放
- 会话变量
- 是服务器为每个客户端连接维护的变量,与MySQL客户端是绑定的
- 也称作用户变量
- 可以暂存值,并传递给同一连接中其他SQL语句进行使用
- 当MySQL客户端连接退出时,用户变量就会被释放
- 用户变量创建时,一般以开头,形式为
演示案例
- 根据病人名称和检查项目ID输出最后一次检查时间
- 调用存储过程
6.1.12 存储过程控制语句
与Java语言的流程控制语句类似,MySQL提供的控制语句
- 条件语句
- IF-ELSEIF-ELSE 条件语句
- CASE 条件语句
- 循环语句
- WHILE 循环
- LOOP 循环
- REPEAT循环
- 迭代语句
6.1.13 IF-ELSEIF-ELSE 条件语句
根据病人的家庭收入,返还补贴不同比例的医疗费用
- 家庭年收入在5000以下的返还当年总医疗费用的20%
- 家庭年收入在10000以下的返还当年总医疗费用的15%
- 家庭年收入在30000以下的返还总医疗费用的5%
- 30000以上或未登记的不享受医疗费用返还
- 输入病人编号和年份,计算该患者当年的应返还的医疗费用
6.1.14 CASE 条件语句
使用CASE语句实现返还补贴不同比例的医疗费用
在某种情况下(例如,做等值判断),使用第二种写法更加简洁但是,因为CASE后面有列名,功能上会有一些限制
6.1.15 WHILE 循环语句
- 首先判断条件是否成立。如果成立,则执行循环体
- label为标号,用于区分不同的循环,可省略
- 用在begin、repeat、while 或者loop 语句前
假设有测试表test,有Id字段、Val字段
- 根据输入的行数要求,批量插入测试数据
6.1.16 LOOP 循环语句
不需判断初始条件,直接执行循环体
遇到 LEAVE 语句,退出循环
批量插3个新的检查项目,检查项目名称为胃镜、肠镜和支气管纤维镜,各项检查的价格均为70
6.1.17 REPEAT 循环语句
- 先执行循环操作再判断循环条件
- 与 LOOP 循环语句相比较相同点
- 不需要初始条件直接进入循环体
- 不同点:REPEAT 语句可以设置退出条件
使用REPEAT循环语句编码实现,根据输入的行数要求,向测试表test中批量插入测试数据
6.1.18 迭代语句
- 从当前代码处返回到程序块开始位置,重新执行
- ITERATE关键字可以嵌入到LOOP、WHILE和REPEAT程序块中
输入需增加数据行数,随机产生的测试数据必须大于0.5
6.2 事务
6.2.1 什么是事务
TRANSACTION
- 是将一系列数据操作捆绑成为一个整体进行统一管理机制
- 多个操作作为一个整体向系统提交,要么都执行、要么都不执行
- 是一个不可分割的工作逻辑单
6.2.2 事务的特性
事务必须具备的属性,简称 ACID 属性
Atomicity事务是一个完整的操作,事务的各步操作是不可分的(原子的),要么都执行,要么都不执行一致性:
Consistency当事务完成时,数据必须处于一致状态隔离性:
Isolation并发事务之间彼此隔离、独立,不应以任何方式依赖于或影响其他事务持久性:
Durability事务完成后,它对数据库的修改被永久保持
6.2.3 如何创建事务
MySQL中支持事务的存储引擎
-
InnoDB支持事务操作
-
通过 UNDO 日志和 REDO 日志实现对事务的支持
-
UNDO 日志
- 复制事务执行前的数据,用于在事务发生异常时回滚数据
-
REDO 日志
- 记录在事务执行中,每条对数据进行更新的操作
- 当事务提交时,该内容将被刷新到磁盘
-
-
MyISAM不支持事务操作
实现事务的方式
- SQL语句
- 设置自动提交关闭或开启
在执行命令SET autocommit=0,禁止当前会话的自动提交后,后面的SQL语句将作为事务中的语句一同提交
6.2.4 事务处理
开始事务
提交事务
回滚(撤销)事务
使用事务实现小王和小张之间的转账操作
小王和小张的总账户余额和转账前保持一致,数据库中数据从一个一致性状态更新到另一个一致性状态
6.2.5 自动关闭和开启事务
-
默认情况下,每条单独的SQL语句视为一个事务
-
关闭默认提交状态后,可手动开启、关闭事务
关闭/开启自动提交
- 状态值为0:关闭自动提交
- 值为1:开启自动提交
关闭自动提交后,从下一条SQL语句开始将会开启新事务,需使用COMMIT或ROLLBACK语句结束该事务
6.2.6 遵循原则
事务尽可能简短
- 事务启动至结束后在数据库管理系统中保留大量资源,以保证事务的原子性、一致性、隔离性和持久性
- 如果在多用户系统中,较大的事务将会占用系统的大量资源,使得系统不堪重负,会影响软件的运行性能,甚至导致系统崩溃
事务中访问的数据量尽量最少
- 当并发执行事务处理时,事务操作的数据量越少,事务之间对操作数据的争夺就越少
查询数据时尽量不要使用事务
- 对数据进行浏览查询操作并不会更新数据库的数据时,尽量不使用事务查询数据,避免占用过量的系统资源
在事务处理过程中尽量不要出现等待用户输入的操作
- 处理事务的过程中,如果需要等待用户输入数据,那么事务会长时间占用资源,有可能造成系统阻塞
6.3 视图
6.3.1 为什么需要视图
不同的人员关注不同的数据
保证信息的安全性
6.3.2 什么是视图
视图是一张虚拟表
- 表示一张表的部分数据或多张表的综合数据
- 其结构和数据是建立在对表的查询基础上
视图中不存放数据
- 数据存放在视图所引用的原始表中
一个原始表,根据不同用户的不同需求,可以创建不同的视图
- 筛选表中的行
- 防止未经许可的用户访问敏感数据
- 降低数据库的复杂程度
- 将多个物理数据表抽象为一个逻辑数据表
6.3.3 视图的好处
开发人员
- 限制数据检索更容易
- 维护应用程序更方便
最终用户
- 结果更容易理解
- 获得数据更容易
6.3.4 创建 / 查看视图
使用SQL语句创建视图
使用SQL语句删除视图
使用SQL语句查看视图
6.3.5 使用视图注意事项
-
视图中可以使用多个表
-
一个视图可以嵌套另一个视图,但最好不要超过3层
-
对视图数据进行添加、更新和删除操作会直接影响所引用表中的数据
-
当视图数据来自多个表时,不允许添加和删除数据
查看所有视图
使用视图修改数据会有许多限制,一般在实际开发中视图仅用作查询
6.3.6 演示案例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tFrhcoZS-38)(https://blog.csdn.net/_/article/details/assets/image-.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kLvask2L-39)(https://blog.csdn.net/_/article/details/assets/image-.png)]
6.4 索引
6.4.1 什么是索引
是对数据库表中一列或多列值进行排列的一种结构
-
作用
-
大大提高数据库的检索速度
-
改善数据库性能
-
-
MySQL索引按存储类型分类
-
B-树索引(BTREE)
- InnoDB、MyISAM均支持
-
哈希索引(HASH)
-
-
数据存储在数据表中,而索引是创建在数据库表对象上
-
由表中的一个字段或多个字段生成的键组成
- 通过索引,可以极大的提升数据查询效率,改善数据库的性能
Indexes Use Key Values to Locate Data
(根据索引键查找定位数据行)
6.4.2 常用索引类型
普通索引
- 基本索引类型
- 允许在定义索引的列中插入重复值和空值
唯一索引
- 索引列数据不重复
- 允许有空值
主键索引
- 主键列中的每个值是非空、唯一的
- 一个主键将自动创建主键索引
复合索引
- 将多个列组合作为索引
全文索引
- 支持值的全文查找
- 允许重复值和空值
6.4.3 创建/删除索引
创建索引
如果创建索引是未指定创建索引的类型,则创建的索引为普通索引通过CREATE INDEX语句无法创建主键索引,主键索引的创建语句
删除索引
删除表时,该表的所有索引同时会被删除
6.4.4 创建索引的指导原则
按照下列标准选择建立索引的列
- 频繁搜索的列
- 经常用作查询选择的列
- 经常排序、分组的列经常用作连接的列(主键/外键)
不要使用下面的列创建索引
- 仅包含几个不同值的列
- 表中仅包含几行
6.4.5 使用索引时注意事项
-
查询时减少使用返回表的全部列,不要返回不需要的列
-
索引应该尽量小,在字节数小的列上建立索引
-
WHERE 子句中有多个条件表达式时,包含索引列的表达式应置于其他条件表达式之前
-
避免在 ORDER BY 子句中使用表达式
-
根据业务数据发生频率,定期重新生成或重新组织索引,进行碎片整理
6.4.6 查看索引 / 删除索引
查看已创建的索引信息
删除索引
删除表时,该表的所有索引将同时被删
除删除表中的列时,如果要删除的列为索引的组成部分,则该列也会从索引中删除
如果组成索引的所有列都被删除,则整个索引将被删除
6.5 数据库的备份与恢复
6.5.1 为什么进行数据库备份
可能导致数据丢失的意外状况
- 数据库故障
- 突然断电
- 病毒入侵
- 人为误操作
- 程序错误
- 运算错误
- 磁盘故障
- 灾难(如火灾、地震)和盗窃
6.5.2 数据的备份与恢复
数据备份
- 是容灾的基础
- 指为防止系统出现操作失误或系统故障导致数据丢失,而将全部或部分数据集合从应用主机的硬盘或阵列复制到其他的存储介质的过程
- MySQL数据备份的常用方法
- mysqldump 备份数据库
- Navicat 备份数据库
数据恢复
- 是指通过技术手段,将保存在硬盘等存储介质上的丢失的数据进行抢救和恢复的技术
6.5.3 mysqldump 备份数据库
mysqldump 命令——MySQL的客户端常用逻辑备份工具
- 将 CREATE 和 INSERT INTO 语句保存到文本文件
- 属于 DOS 命令
- [options] 的选项参数
- –u username: 表示用户名
- –h host: 表示登录的主机名称,如本机为主机可省略
- –p password: 表示登录密码
- database
- 需备份的数据库名
- [table1,[table2]…]
- 需备份的表名若省略,备份所有表
- [path]/filename.sql
- 备份文件名称
mysqldump是DOS系统下的命令
在使用时,无须进入mysql命令行;否则,将无法执行
示例
以root账户登录到MySQL服务器,使用mysqldump命令备份hospital数据库,将SQL脚本保存到e:hospital.sql中
导出的SQL脚本中两种注释
- 以开头:关于SQL语句的注释信息
- 以开头, 结尾:是关于MySQL服务器相关的注释
为保证账户密码安全,命令中可不写密码
但是,参数必须有,回车后根据提示写密码
常用参数选项
备份文件包含的主要信息
- 备份后文件包含信息MySQL服务器及mysqldump工具的版本号
- 备份账户的名称
- 主机信息
- 备份的数据库名称
- SQL语句注释和服务器相关注释
- CREATE和INSERT语句
6.5.4 Navicat 备份数据库
Navicat也可以用于导出数据库的备份脚本
- 右键点选数据库->转储SQL文件->结构和数据…
- 选择导出文件的保存路径和文件名后,便可导出数据库脚本
6.5.5 恢复数据库
在需要恢复数据库数据时,对导出的SQL备份脚本执行导入操作
- 使用mysql命令
- 使用source命令
- 使用Navicat导入数据
6.5.6 mysql 恢复数据库
mysql为DOS命令
在执行该语句之前,必须在MySQL服务器中创建新数据库
因为导出的备份文件中只包含表的备份,而不包含创建的库的语句
因此执行导入操作时必须指定数据库名,且该数据库必须存在
6.5.7 source 恢复数据库
除了在命令行中导入数据以外,还可以在数据库已连接状态下导入数据
登录MySQL服务后使用
执行该命令前,先创建并选择恢复后的目标数据库
6.5.8 Navicat 恢复数据库
Navicat中导入数据的操作步骤
- 右键单击要导入数据的数据库
- 右键单击快捷菜单项
- 在导入窗口,选择要运行的SQL文件
- 按钮开始导入数据
七、JDBC 与 DAO 模式
7.1 JDBC 介绍
7.1.1 什么是 JDBC
JDBC(Java Database Conectivity)
Java数据库连接技术的简称,提供连接各种常用数据库的能力
7.1.2 JDBC 的工作原理
JDBC API
内容:供程序员调用的接口与类,集成在java.sql和javax.sql包中,如
- DriverManager类
- Connection接口
- Statement接口
- ResultSet接口
DriverManager
- 作用:管理各种不同的JDBC驱动
JDBC 驱动
- 提供者:数据库厂商
- 作用:负责连接各种不同的数据库
7.1.3 JDBC API
JDBC API 主要功能
-
与数据库建立连接、执行SQL 语句、处理结果
-
DriverManager :依据数据库的不同,管理JDBC驱动
-
Connection :负责连接数据库并担任传送数据的任务
-
Statement :由 Connection 产生、负责执行SQL语句
-
esultSet:负责保存Statement执行后的查询结果
7.2 使用 JDBC 连接数据库
7.2.1 导入 JDBC 驱动 JAR 包
数据库版本:MySQL5.7
MySQL官网下载对应的JDBC驱动JAR包
- mysql-connector-java-8.0.19.jar
驱动类
- com.mysql.cj.jdbc.Driver
7.2.2 纯 Java 驱动方式
使用纯Java方式连接数据库
-
由JDBC驱动直接访问数据库
-
优点:完全Java代码,快速、跨平台
-
缺点:访问不同的数据库需要下载专用的JDBC驱动
-
JDBC驱动由数据库厂商提供
7.2.3 JDBC编程模板
7.2.4 数据库连接字符串
- 数据库:表示JDBC连接的目标数据库
- ip: 表示JDBC所连接的目标数据库地址,如果是本地数据库,可为localhost,即本地主机名
- 端口:连接数据库的端口号
- 数据库名称:是目标数据库的名称
- 连接参数:连接数据库时的参数配置
连接本地MySQL中hospital数据库
7.2.5 Connection 接口
Connection是数据库连接对象的类型
7.2.6 连接本地 hospital 数据库
7.2.7 常见异常
使用JDBC连接数据库时,经常出现的错误
- JDBC驱动类的名称书写错误,导致ClassNotFoundException异常
- 数据连接字符串、数据库用户名、密码错误,导致SQLException异常
- 数据库操作结束后,没有关闭数据库连接,导致仍旧占有系统资源
- 关闭数据库连接语句没有放到finally语句块中,导致语句可能没有被执行
7.3 Statement 操作数据库
Java执行数据库操作的一个重要接口,在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句
- Statement对象:执行不带参数的简单SQL语句
- PreparedStatement对象:执行带或不带In参数的预编译SQL语句
使用 executeQuery() 和 executeUpdate() 方法都需要啊传入 SQL 语句,因此,需要在 Java 中通过字符串拼接获得 SQL 字符串
7.3.1 Java 的字符串操作
String类
- 字符串常量一旦声明则不可改变
- String类对象可以改变,但改变的是其内存地址的指向
- 使用“+”作为数据的连接操作
- 不适用频繁修改的字符串操作
StringBuffer类
- StringBuffer类对象能够被多次修改,且不产生新的未使用对象
- 使用append()方法进行数据连接
- 适用于字符串修改操作
- 是线程安全的,支持并发操作,适合多线程
如果使用StringBuffer 生成了 String 类型字符串,可以通过 toString( ) 方法将其转换为一个 String 对象
- 需要拼接的字符串
- 使用+拼接字符串
- 使用StringBuffer拼接字符串
- SQL语句中,字符和是等效的
- 但在Java代码中拼接字符串时使用字符会使代码更加清晰
- 也不容易出错引号、逗号或括号等符号必须成对出现
- 可在控制台输出拼接后的字符串,检查SQL语句是否正确
7.3.1 Statement 插入数据
使用Statement接口执行插入数据的操作的方法
- executeUpdate()方法
- execute()方法
如果希望得到插入成功的数据行数,可以使用executeUpdate()方法;否则,使用execute()方法
实现步骤
- 声明Statement变量
- 创建Statement对象
- 构造SQL语句
- 执行数据插入操作
- 关闭Statement对象
- 关闭顺序是后创建的对象要先关闭释放资源
演示案例
使用JDBC,向hospital数据库病人表中添加一个新的病人记录关键代码
为了避免可能出现的乱码问题,可将指定数据库连接的编码集为UTF8,多个参数间使用字符&进行分隔
7.3.2 Statement 更新数据
- 使用executeUpdate()方法或execute()方法实现更新数据的操作
- 使用Statement接口更新数据库中的数据的步骤与插入数据类似
实现步骤
- 声明Statement变量
- 创建Statement对象
- 构造SQL语句
- 执行数据更新操作
- 关闭Statement对象
需关注拼接的SQL字符串,以避免出错
演示案例
使用JDBC,将hospital数据库中patientID为13的病人电话更新为
7.3.3 ResultSet 接口
保存和处理Statement执行后所产生的查询结果
- 由查询结果组成的一个二维表
- 每行代表一条记录
- 每列代表一个字段
说明
boolean next()将游标从当前位置向下移动一行void close()关闭ResultSet 对象
int getInt(int colIndex)以int形式获取结果集当前行指定列号值
int getInt(String colLabel)以int形式获取结果集当前行指定列名值float getFloat(int colIndex)以float形式获取结果集当前行指定列号值float getFloat(String colLabel)以float形式获取结果集当前行指定列名值String getString(int colIndex)以String形式获取结果集当前行指定列号值String getString(String colLabel)以String形式获取结果集当前行指定列名值
- 要从中获取数据的列号或列名可作为方法的参数
- 根据值的类型选择对应的方法
ResultSet 接口 getXxx() 方法
- 获取当前行中某列的值
- 要从中获取数据的列号或列名可作为方法的参数
- 根据值的类型选择对应的方法
假设结果集的第一列为patientID,存储类型为int类型,能够获得该列值的两种方法
- 列号从1开始计数,与数组下标从0开始计数不同
- 采用列名来标识列可读性强,且不容易出错
7.3.4 Statement 和 ResultSet 查询数据
使用 JDBC 从 hospital 数据库中查询前3个病人的编号、姓名、性别、住址信息并输出到控制台上
7.4 PreparedStatement 操作数据库
7.4.1 SQL 注入攻击
通过提交一段SQL代码,执行超出用户访问权限的数据操作称为SQL注入(SQL Injection),SQL注入攻击是应用安全领域的一种常见攻击方式,会造成的数据库安全风险包括:刷库、拖库和撞库等,主要是没有对用户输入数据的合法性进行判断,导致应用程序存在安全隐患
使用JDBC实现医院管理系统用户登录验证功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-80RXlP0a-39)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE438.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OTwEFgfg-40)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE502.png)]
修改查询结构
7.4.2 PreparedStatement 接口
使用PreparedStatement 接口
- 继承自 Statement接口
- 与Statement对象相比,使用更加灵活,更有效率
PreparedStatement接口 (预编译的 SQL 语句)
-
提高代码可读性和可维护性
-
提高安全性
-
提高SQL语句执行的性能
作 用boolean execute()执行SQL语句,可以是任何SQL语句。如果结果是Result对象,则返回true。如果结果是更新计数或没有结果,则返回falseResultSet executeQuery()执行SQL查询,返回该查询生成的ResultSet对象int executeUpdate()执行SQL语句,该语句必须是一个DML语句,比如:INSERT、UPDATE或DELETE语句;或者是无返回内容的SQL语句,比如DDL语句。返回值是执行该操作所影响的行数void setXxx(int index,xxx x)方法名Xxx和第二个参数的xxx均表示(如int,float,double等)基本数据类型,且两个类型需一致,参数列表中的x表示方法的形式参数。把指定数据类型(xxx)的值x设置给index位置的参数。根据参数类型的不同,常见方法有:setInt(int index,int x) 、setFloat(int index,float x)、setDouble(int index,double x)等void setObject(int index,Object x)除基本数据类型外,参数类型也可以是Object,可以将Object对象x设置给index位置的参数
7.4.3 PreparedStatement 操作数据
创建PreparedStatement对象
- 使用Connection接口prepareStatement(String sql)方法创建PreparedStatement对象
- 需要提前设置该对象将要执行的SQL语句
- SQL语句可具有一个或多个输入参数
设置输入参数的值
- 调用setXxx()方法完成参数赋值
执行SQL语句
- 调用PreparedStatement接口
- executeQuery()
- executeUpdate()
- execute()
- 方法执行SQL语句
验证用户输入的身份证号和密码
- 如果通过验证,则输出“欢迎[姓名]登录系统!”的信息;
- 否则输出“密码错误!”
7.4.4 PreparedStatement 的优势
实际开发中,推荐使用PreparedStatement接口执行数据库操作
- PreparedStatement与Statement接口相比,具有的优势
- 可读性和可维护性高
- SQL语句执行性能高
- 安全性更高
7.5 Properties 配置文件
7.5.1 为什么使用 Properties 类
使用JDBC技术访问数据库数据的关键代码
让用户脱离程序本身修改相关的变量设置——使用配置文件
7.5.2 properties配置文件
Java的配置文件常为properties文件
- 后缀为.properties
- 以“键=值”格式储存数据
- 使用“#”添加注释
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hH3NjFkM-40)(https://blog.csdn.net/_/article/details/assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE942.png)]
通常,为数据库访问添加的配置文件是database.properties
7.5.3 读取配置文件信息
使用java.util包下的Properties类读取配置文件
描述String getProperty(String key)用指定的键在此属性列表中搜索属性,通过参数key得到其所对应的值Object setProperty(String key, String value)通过调用基类Hashtable的put()方法设置键-值对void load(InputStream inStream)从输入流中读取属性列表 (键和素对),通过对指定文件进行装载获取该文件中所有键-值对void clear()清除所装载的键-值对,该方法由基类Hashtable提供
使用Properties配置文件的方式改造医院管理系统
7.6 DAO 模式
7.6.1 什么是 DAO
非常流行的数据访问模式——DAO模式
- Data Access Object(数据存取对象)
- 位于业务逻辑和持久化数据之间
- 实现对持久化数据的访问
DAO起着转换器的作用,把实体类转换为数据库中的记录
7.6.2 DAO 模式的组成
组成部分
- DAO接口
- DAO实现类
- 实体类
- 数据库连接和关闭工具类
优势
- 隔离了数据访问代码和业务逻辑代码
- 隔离了不同数据库实现
7.6.3 使用实体类传递数据
数据访问代码和业务逻辑代码之间通过实体类来传输数据