一、数据库的设计
1.1设计数据库的步骤
- 收集信息
- 标识实体
- 标识每个实体需要存储的详细信息
- 标识实体之间的关系
1.2 绘制E-R图
实体-关系模型
- 实体:
实体一般是名词,对应表中的一行数据
- 属性:
实体的特征,属性对应表中的列
- 联系:
联系是两个或多个实体之间的关联
映射基数
- 一对一
- 一对多
- 多对一
- 多对多
实体关系图
- 矩形表示实体集
- 椭圆形表示属性
- 菱形表示联系集
- 直线用来连接属性和实体集,也用来连接实体集和联系集
- 关系数据库模式
1.3 数据规范化
1. 信息重复
2. 更新异常
3. 插入异常
4. 删除异常
规范设计
三打范式内容如下:
- 第一范式:其目标是确保每列的原子性
- 第二范式:在第一范式的基础上更进一层,其目标是确保表中的每列都和主键相关
- 第三范式:在第二范式的基础上更进一层,其目标是确保每列都和主键列直接相关,而不是间接相关
二 、初识MySQL
MySQL的优势
- 运行速度快,Mysql体积小,命令执行的速度快
- 使用成本低,Mysql是开源的,且提供免费版本,对大多数用户来说大大降低了使用成本
- 容易使用,与其他大型数据库的设置和管理相比,其复杂程度较低,易于使用
- 可移植性强,Mysql能够运行于多种系统平台,
- 适用更多用户,MySQL支持最常用的数据管理功能,适用于中小型企业甚至大型网站应用
端口设置
默认启用TCP/ip网络,默认端口位3306
命令行方式操作MySQL数据库
MySQL中数据库的类型
1.系统数据库
information_schema:主要存储系统中的一些数据库对象,如用户表信息,字段信息权限信息,字符集信息和分区信息等,
performance_schema:主要存储数据库服务器性能参数
mysql:主要存储系统的用户权限西悉尼
test:Mysql数据库管理系统自动创建的数据库,任何用户都可以使用
操作数据库
- 创建数据库
create database 数据库名;
- 查看数据库列表
show databases;
- 选择数据库
use 数据库名
- 删除数据库
drop database 数据库名
回顾结构化语言
DML (数据操作语言) | 用来操作数据库中所包含的数据 | insert update delete |
DDL (数据定义语言) | 用于创建和删除数据库对象等操作(库,表,索引) | create 创建 drop 删除 alter 修改 |
DQL (数据查询语言) | 用来对数据库中数据进行查询 | select 查询 |
DCL (数据控制语言) | 用来控制数据库组件的存取许可,存取权限等 | grant 赋予权限 commit 提交 rollback 回滚 |
数据类型
数值类型
- int 标准整数 4字节
- decimal 字符串形式的浮点数 M+2个字节
字符串、日期类型
- char 定长字符串
- varchar 可变字符串
- dateTime : 日期66
- tiemstamp : 精度为1秒 某一时刻
创建表
语法: create table [表名] (
字段1 数据库类型 [字段属性|约束] [约束] [注释]
)
字段的约束及属性
名称 | 关键字 | 说明 |
---|---|---|
非空约束 | not null | 字段不允许为空 |
默认约束 | defaut | 赋予某字段默认值 |
唯一约束 | unique key() | 设置字段的值是唯一的允许为空 但只能有一个空值 |
外键约束 | foreign key() | 用于在两表之间建立关系,需要指定引用主表的哪一字段 |
主键约束 | primary key() | 设置该字段为表的主键 可唯一标识该表记录 |
自动增长 | auto_increment | 设置该列为自增 |
注释
语法: comment '注释内容' comment ='注释内容';
设置字符集编码
charset = 字符集名 ;
MySQL的存储引擎
存储引擎的类型
MySAM 、lnnoDB、Memory 、CSV等9种
MySAM 与 lnnoDB类型的主要区别
名称 | innoDB | MySAM |
---|---|---|
事务处理 | 支持 | 不支持 |
数据行锁定 | 支持 | 不支持 |
外键约束 | 支持 | 不支持 |
全索引 | 不支持 | 支持 |
表空间大小 | 较大,约2倍 | 较小 |
设置表的存储引擎
语法:engine = 存储引擎
3、高级查询(一)
修改表2-2
修改表明
alter table 旧表名 rename[to] 新表名;
添加字段
alter table 表名 add 字段名 数据类型[属性];
修改字段
alter table 表名 change 原字段名 新字段名 数据类型[属性];
删除字段
alter table 表名 drop 字段名;
添加主键
alter table 表名 add constraint 主键名 primary key 表名(主键字段);
添加外键
alter table 表明 add constraint 外键名
foreign key (外键字段);
references 关键表明 (关联字段);
插入多条数据记录
insert into 新表 (字段名列表)
values(值列表1),(值列表2)....(值列表N);
注意:未避免表结构发生变化引发的错误,建议插入数据时写明具体字段名
插入新表
insert into 新表(字段1,字段2)
select 字段1,字段2.....
from 原表 必须先创表
create table 新表
(select 字段1,字段2..... from 原表);
数据更新、删除
语法:
update 表名
set 字段1 =值1,.....字段N=值N
[where 条件];
删除数据记录语法:
delete from 表名 [where 条件];
truncate table 表名;
注意:truncate 语句删除后将重置自增列,表结构及其字段,约束 ,索引保持不变 ,执行速度比delete语句快
DQL语句回顾
select <字段名列表>
from <表名或视图>
[where <查询条件>]
[group by <分组的字段名>]
[having <条件>]
[order by<排序的字段名>[asc 或 desc]]
limit 子句 2-1
[limit[位置偏移量,] 行数]
位置偏移量 = 当前页数-1 * 行数;
使用limit 子句时 注意第一条记录的位置是0!
聚合函数
函数名 | 作用 |
---|---|
AVG() | 返回某字段的平均值 |
COUNT() | 返回某字段的行数 |
MAX() | 返回某字段的最大值 |
MIN() | 返回某字段的最小值 |
SUM() | 返回某字段的和 |
concat(str1) 字符串连接
时间日期函数
NOW() 获取当前日期和时间
datediff(date1,date2) 返回日期参数date1 和date2 之间相隔的天数
adddate(date,n) 计算日期参数date 加上n天后的日期
什么是子查询
子查询是一个嵌套在增删改查语句或其他子查询中的查询
先查询子查询 ,返回所有来自子查询的结果
再执行外围的父查询,返回查询的最终结果
四、高级查询(二)
EXISTS子查询2-1
语法:
select .... from 表名 where exists(子查询)
- 子查询有返回结果:exists 子查询结果为true
- 子查询无返回结果:exists 子查询结果为false ,外层查询不执行
子查询注意事项
- 任何允许使用表达式的地方斗可以使用子查询
- 嵌套在父类查询select语句的子查询可包括
- select 子句
- from 子句
- where 子句
- group by 子句
- having 子句
- 只出现在子查询中而没出啊先在父查询中的列不能包含在输出列中
事务、视图、索引、备份和恢复
什么是事务
事务(transaction)是作为单个逻辑工作单元执行的一系列操作
多个操作作为一个整体向系统提交,要么都执行、要么都不执行
事务是一个不可分割的工作逻辑单元
事务的特性
事务必须具备以下四个属性 ,简称ACID属性
原子性(Atomicity)
事务是一个完整的操作,事务的各步操作是不可分的(原子的)要么都执行 ,要么都不执行
一致性(Consistency)
当事务完成时,数据必须处于一致状态
隔离性(lsolation)
并发事务之间彼此隔离 , 独立 ,它不应以任何方式依赖于或影响其他事务
持久性(Durability)
事务完成后,它对数据库的修改被永久保存
如何创建事务
MySQL 中支持事务的存储 引擎有innodb和bdb
语法:
开始事务:
begin; 或 start transaction
提交事务
commit;
回滚事务
rollback;
自动关闭和开启事务
set autocommit = 0;
值为0:关闭自动提交
值为1:开启自动提交
关闭自动提交后 ,从下一条SQL语句则开启新事务,需使用commit或rollback语句结束该事务
为什么需要视图
不同的人员关注不同的数据
保证信息的安全性
什么是视图3-2
- 视图是一张虚拟表
- 表示一张表的部分数据或多张表的综合数据
- 其结构和数据是建立在对表的查询基础上
- 视图中不存放数据
- 数据存放在视图所引用的原始表中
- 一个原始表,根据不同用户的不同需求,可以创建不同的视图
什么是视图3-3
- 视图的用途
筛选表中的行
防止未经许可的用户访问敏感数据‘
降低数据库的复杂程度
将多个物理数据库抽象为一个逻辑数据库
使用视图注意事项
- 视图中可以使用多个表
- 一个视图可以嵌套另一个视图
- 对视图数据进行添加,更新和删除操作直接影响所引用表中的数据
- 当视图数据来自多个表时,不允许添加和删除数据
使用视图修改会有许多限制,一般在实际开发中视图仅用作查询
什么时索引
索引是一种有效组合数据的方式,为快速找到指定记录
作用:
大大提高数据库的检索速度
改善数据库性能
mysql 索引按存类型分类
b-树索引:innoDB 、MyISAM均支持
哈希索引
常用的所有类型
普通索引
- 基本索引类型
- 允许在定义索引的列中插入重复值和空值
唯一索引
- 索引列数据不重复
- 允许有空值
主键索引
主键列中的每个值是非空,唯一的
一个主键将自动创建主键索引
复合索引
- 将多个列组合作为索引
全文索引
- 支持值的全文查找
- 允许重复值和空值
空间索引
- 对空间数据类型的列建立的索引
如何创建/删除索引2-1
创建索引
create [unique|fulltext|spatial] index index_name
on table_name (column_name[length].....);
删除索引
drop index index_name on table_name;
删除表时,该表的所有索引引同时会被删除
创建索引的指导原则
按照下列标准选择建立索引的列
- 频繁搜索的列
- 经常用作查询选择的列
- 经常排序、分组的列
- 经常用作连接的列(主键/外键)
清风不要使用下面的列创建索引
- 仅包含几个不同值得列
- 表中仅包含几行
使用索引时注意事项
- 查询时减少使用*返回全部列,不要返回不需要得列
- 索引应该尽量小,在字节数小得列上建立索引
- where子句中有多个条件表达式时,包含索引列得表达式应置于其他条件表达式之前
- 避免在order by 子句中使用表达式
查看索引
show index from 表名
使用mysqldump命令备份数据库4-1
mysqldump命令 - mysql 一个常用得备份工具
将create和insert into 语句保存到文本文件
属于DOS命令
mysqldump [options] -u username -h host -p password
dbname [tbname1[,tbname2].....] >filename.sql
六、JDBC
为什么需要JDBC
JDBC是java数据库链接技术的简称,提供连接各种常用数据库的能力
JDBC API
- JDBC API 主要功能:与数据库建立连接,执行sql语句,处理结果
- DriverManager : 依据数据库的不同,管理jdbc驱动
- Connection:负责连接数据库并担任传送数据的任务
- Statement: 由Connection 产生,负责执行sql语句
- Resultset: 负责保存staement 执行后产生的查询结果
jdbc访问数据库的步骤
- 加载jdbc驱动
Class.forName("JDBC驱动类的名称");
- 与数据库建立连接
Connection conn = DriverManger.getConnection(数据库连接字符串,数据库用户名,密码);
- 发送SQL语句,并得到返回的结果
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql 语句);
Class.forName(JDBC驱动类);
- 加载JDBC驱动
- 与数据库建立连接
- 发送SQL语句,并得到返回结果
- 处理返回结果
- 释放资源
JDBC驱动5-4
- 使用纯java方式连接数据库
- 由JDBC驱动直接访问数据库
- 优点: 完全java代码,快速,跨平台
- 缺点:访问不同的数据库需要下载专用的JDBC驱动
Statement常用方法
方法名 | 说明 |
---|---|
ResultSet executeQuery(String sql) | 执行SQL查询并获取到ResultSet对象 |
int executeUpdate(String sql) | 可以执行插入,删除,更新等操作,返回值是执行该操作所影响的行数 |
ResultSet常用方法
方法名 | 说明 |
---|---|
boolean next() | 将游标从当前位置向下移动一行 |
void close() | 关闭ResultSet对象 |
Dao模式
什么是DAO
非常流行的数据访问模式-DAO模式
Data Access Object(数据存取对象)
位于业务逻辑和持久化数据之间
实现对持久化数据的访问
DAO起着转换器的作用,把实体类转换为数据库中的记录
DAO模式的组成
DAO模式的组成部分
DAO接口
DAO实现类
实体类
数据库连接和关闭工具类
优势
隔离了数据访问代码和业务逻辑代码
隔离了不同数据库实现
properties配置文件
java中的配置文件常为properties文件
后缀为.properties
格式是“键 = 值” 格式
使用 “#” 来注释
读取配置文件
java中提供了Properties类来读取配置文件
方法名 | 说明 |
---|---|
String getProperty(String key ) | 用指定的键在此属性列表中搜索属性,通过参数key得到其所对于的值 |
void load(InputStream inStream) | 从输入流中读取属性列表(键和元素对)通过对指定文件进行装载获取该文件中所有键值对 |
使用实体类传递数据、
实体类特征
属性一般使用private修饰
提供public修饰的getter/setter方法
实体类提供无参构造方法,根据业务提供有参构造
实现java.Serializable接口,支持序列化机制
评论 (0)