关系型数据库的特点
关系型数据库是主流的数据库类型
优点
易于维护:都是使用表结构存储数据,格式一致
使用方便:
SQL
语句通用,可用于不同关系型数据库
复杂查询:可以通过
SQL
语句在多个表之间查询出复杂数据
缺点
读写性能差,尤其是还是数据的高效读写
固定的表结构,灵活度少欠
高并发读写时,硬盘
I/O
决定了读写速度
非关系型数据库的特点
保存数据的格式多样
对于海量数据的读写性能高
不支持复杂查询
sql语句
数据库
创建 create database 数据库名;
删除 drop database 数据库名
使用 use 数据库名
表
创建
create table 表名(
字段名 数据类型 [字段特征],
字段名 数据类型 [字段特征],
...
字段名 数据类型 [字段特征]
)
-- 例子
-- 创建数据库gamedb
create database gamedb;
-- 切换数据库
use gamedb;
-- 创建游戏角色表hero
create table hero(
-- 编号 整型 非空 主键 自增
id int not null primary key auto_increment comment '编号',
-- 姓名 字符串 非空 唯一
name varchar(20) not null unique comment '姓名',
-- 定位 字符串 非空
position varchar(20) not null comment '定位',
-- 性别 字符串 非空 默认男
sex char(1) not null default '男' comment '性别',
-- 价格 整型 非空 默认4800
price int not null default '4800' comment '价格',
-- 上架日期
shelf_date date comment '上架日期'
)
-- 创建战斗表battle
create table battle(
hero_id int not null ,
position varchar(20),
-- 外键 hero_id参考hero表中的id字段
foreign key (hero_id) references hero(id)
)
删除 drop table 表名
修改(对数据)
-- 增
insert into 表名 values(字段1,字段2,。。。) where 条件
-- 删
delete from 表名 where 条件
-- 改
update 表名 set 字段1 = '值',字段2 = '值'... where 条件
--查
select from 表名 where 条件
部分拓展
-- 模糊查询
-- 字段 like '%娜%'
-- 带有'娜'字
-- 字段 like '张%'
-- ‘张’字开头
-- 字段 like '%儿'
-- ‘儿’字结尾
-- 字段 like '%瑞_'
-- 倒数第二个字为‘瑞’
-- 字段 like '___'
-- 3个字
update 表名 set 字段 = '值' where 字段 like ‘%文字%’
-- 分页
-- 查询前N条记录
select * from 表名 limit N;
-- 查询从索引N开始的M条记录
select * from 表名 limit N,M;
-- 每页显示size条,第page页
select * from 表名 limit (page-1)*size,size
-- 去重复
select distinct 字段名 from 表名;
-- 排序
select * from 表名 where 条件 order by 排序字段 [ASC/DESC],排序字段 [ASC/DESC]...
实际业务
登录
--接收账号密码查询用户表中是否存在记录
select * from 表 where 账号=? and 密码=?
--如果能查询到数据,说明存在该用户,可以登录;如果查询结果为Null,说明用户名或密码错误
注册
-- 接收账号密码,判断是否存在该账号,不存在则添加到用户表中
select * from 表 where 账号=?
insert into 表 values(null,账号,密码)
充值
-- 登录成功后,修改余额字段
update 表 set 余额=余额+充值金额 where 用户编号=?
JDBC
Java数据库连接
核心接口
- Connection:用于设置连接的数据库的地址、账号、密码
- PreparedStatement:用于预处理、执行sql语句
- ResultSet:用于接收查询后的数据
数据库建表需要注意
- 一对一:创建各自的实体表,在任意一张表中添加另一张表的主键字段,并添加唯一约束
- 一对多/多对一:先创建主表(一),再创建从表(多),在从表中添加主表中的主键字段,外键可选
- 多对多:创建各自的实体表,再创建第三张表:"联系表",在"联系表"中添加两个实体表中的主键字段,外键可选
JDBC
Java
提供了一套规范用于连接各种数据库。不同的数据库厂商根据该规范设计连接驱动。
java.sql
包下一组接口用于操作数据库。
Connection
接口 用于获取连接对象
PreparedStatement
接口
用于发送
sql
语句,处理
sql
语句
ResultSet
接口
用于保存查询后的结果集
加载MySQL驱动
连接
MySQL
数据库字符串
Class.forName("com.mysql.cj.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/数据库名?serverTimezone=Asia/Shanghai";
String username="root";
String password="root";
查询的步骤
1.获取连接对象Connection
2.构造sql语句String
3.预处理sql语句pst=conn.prepareStatement(sql)
4.给sql语句中的?赋值pst.setXXX(?顺序,值)
5.调用executeQuery()得到ResultSet结果集
6.遍历结果集rs.next()后rs.getXXX(字段顺序/字段名)
7.释放资源
增删改的步骤
1.获取连接对象Connection
2.构造sql语句String
3.预处理sql语句pst=conn.prepareStatement(sql)
4.给sql语句中的?赋值pst.setXXX(?顺序,值)
5.调用executeUpdate()得到受影响的行数
6.释放资源
事务
transaction
一组
sql
执行单元,要么全部执行,要么全部不执行
事务的特性
ACID
原子性
Atomicity
事务是最小的执行单元
一致性
Consistency
事务执行前后,数据整体保持一致。
隔离性
Isolation
各个事务之间应当互不干涉
持久性
Durability
事务一旦提交,改变是永久的
事务并发出现的问题
脏读
事务
A
读取到了事务
B
未提交的数据。
不可重复读
事务
A
中前后两次读取到的数据不一致。
事务
A
在读取过程中,事务
B
对数据进行了修改。
幻读
事务
A
在读取过程中,事务
B
向其中添加了数据,导致事务
A
读到了事务
B
中添加的
"
幻影
"
数据。
以上问题可以通过设置事务隔离级别解决。
事务隔离级别
事务相关指令
查看事务自动提交状态
select @@autocommit
修改事务自动提交状态
set @@autocommit=0/1 0
表示不开启动,
1
表示开启
手动开启事务
start transaction;
提交
commit;
回滚
rollback;
查询当前事务隔离级别
select @@transaction_isolation
设置事务隔离级别
set [session|global] transaction isolation level [Read Uncommitted | Read Committed |
Repeatable Read |Serializable]
视图
定义
create view
视图名
as
sql
语句
;
使用
select * from
视图名
;
触发器
定义
create trigger
触发器名
触发时机 触发条件
on
表
for each row
begin
触发器触发时执行的
sql
语句;
end
存储过程
创建
create procedure
存储过程名
(in/out/inout
参数名 数据类型
)
begin
sql
语句
;
end
调用
call
存储过程名