数据库的作用
- 数据库提供结构化数据的持久化存储
- 索引保证数据查询的速度
- 事务的原子性保证数据不丢失
数据库基本概念
- Schema:数据表
- 数据库的类型与SQL语句
- int/bigint
- varchar(length)/TEXT
- timestamp
- 行与列
- 外键
- JDBC:Java Database Connection
- 本质:你给我一个连接字符串,我就能读取你的数据库信息
- 使用JDBC存取数据
- 一般有:连接串、用户名、密码
DDL
1. create table
2. drop table
3. alter table
基本SQL
1. insert into
2. delete from
3. update
4. select
一些注意事项
- SQL语句不区分大小写
- 命名风格是下划线命名
- 数据库的字符串是单引号
- 数据库的注释是 —
- 分号分割多个SQL语句
增删改查的基本概念
- 数据库的查询时间包括:指令的执行时间,磁盘IO时间,网络IO时间
- 数据库操作的经典时间为:1ms(一般会比这个长,不会比这个短)
INSERT INTO user (name, password, tel, avatar, create_at, update_at)
VALUES ('xxx', '123456', '1388888888', 'http://image.png', now(), now());
ALTER TABLE user ADD status tinyint NOT null DEFAULT 1;
UPDATE user SET status = 0, update_at = now() WHERE id = 1;
Select
- select *
- select count(*) count(1)
- select max/min/avg
- select limit 分页
select * from user limit 1(从第几个开始找), 4(最多返回几个元素 )
- select order by 排序
- select is null/is not null
- select where id in (select id from …) 子查询
JDBC & SQL注入
1. 使用JDBC访问数据库
- statement(SQL语句)
- prepareStatement - 防止SQL注入的
-
2. SQL注入
SQL没有验证传入的参数,导致攻击者精心设计的参数拼装出的SQL达到了他的目的
- 防范:不直接使用statement,而是使用prepareStatement预先编译statement
用Docker安装数据库
- 解决宿主机兼容问题
- 统一、方便、卸载无残留
- 数据默认只在容器中有效,不是持久化的
- 除非启动容器的时候使用
-v
参数-v /path/dir:/var/lib/postgresql/data
- 除非启动容器的时候使用
表的设计原则
- 每个实体对应一张表(比如:用户、商品)
- 每个实体都有一个主键ID
- 按照业务需要建索引
- 每个关系用一张表联系
- 关系型数据库