day01 MySQL基础
数据库
batabase 用于存储和管理数据的仓库
数据库的特点:
1. 持久化存储数据的。其实数据库就是一个文件系统
2. 方便存储和管理数据
3. 使用了统一的方式操作数据库 -- SQL
SQL
结构化查询语言, 操作所有关系型数据库规则
分类: DDL DML DQL DCL
DDL [关键字:create, drop,alter 等]
操作数据库:CRUD
create database 数据库名称;
show databases;
show create database 数据库名称;
alter database 数据库名称 character set 字符集名称;
drop database 数据库名称;
select database();
use 数据库名称;
操作表
create table 表名(列名1 数据类型1,......列名n 数据类型n);
create table 表名 like 被复制的表名;
show tables;
desc 表名;
alter table 表名 rename to 新的表名;
alter table 表名 character set 字符集名称;
alter table 表名 add 列名 数据类型;
alter table 表名 change 列名 新列别 新数据类型;
alter table 表名 modify 列名 新数据类型;
alter table 表名 drop 列名;
drop table 表名;
DML [关键字:insert, delete, update 等]
insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
insert into 表名 values(值1,值2,...值n);
delete from 表名 where 条件;
DQL
语法
select 字段列表 from 表名列表 where 条件列表
group by 分组字段 having 分组之后的条件
order by 排序 limit 分页限定
SELECT DISTINCT 字段名 FROM 表名;
SELECT 字段名 FROM 表名 WHERE 字段 in (数据1, 数据2...);
BETWEEN 值1 AND 值2;
IFNULL(expr1,expr2)
如果 expr1 不是 NULL,IFNULL() 返回 expr1,否则它返回 expr2。
IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境
操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
day02 MySQL约束
DQL
1. 排序查询 2. 聚合函数 3. 分组查询 4. 分页查询
排序查询
order by 子句
ASC:升序,默认的。 DESC:降序。
如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。
聚合函数:将一列数据作为一个整体,进行纵向的计算。
聚合函数的计算,排除null值。
解决方案:
1. 选择不包含非空的列进行计算
2. IFNULL函数
分组查询
group by 分组字段 / 聚合函数;
where 和 having 的区别
1. where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
2. where 后不可以跟聚合函数,having可以进行聚合函数的判断。
分页查询
1. 语法:limit 开始的索引,每页查询的条数;
2. 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
limit x , y
x 是前边已经有多少条了
y 是本页显示多少条
约束
对表中的数据进行限定,保证数据的正确性、有效性和完整性。
1. 主键约束:primary key
2. 非空约束:not null
3. 唯一约束:unique
4. 外键约束:foreign key
非空约束
创建表完后,添加非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
删除name的非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
唯一约束
在表创建完后,添加唯一约束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
删除唯一约束
ALTER TABLE stu DROP INDEX phone_number;
主键约束
创建完表后,添加主键
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
删除主键
ALTER TABLE stu DROP PRIMARY KEY;
外键约束
创建表之后,添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
自动增长(数值类型)
添加自动增长
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
删除自动增长
ALTER TABLE stu MODIFY id INT;
级联操作
在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE ;
分类:
1. 级联更新:ON UPDATE CASCADE
2. 级联删除:ON DELETE CASCADE
表与表之间的关系
一对多 主外键的关系
多对多 中间表,两个一对多
一对一
1) 特殊一对多,从表中的外键设置为唯一
2) 从表中的主键又是外键
数据规范化
三大范式
第一范式每一列不可再拆分,称为原子性。
第二范式
特点: 在第一范式的基础上所有列完全依赖于主键列。
1) 一张表只描述一件事情。
2) 表中的每一列都完全依赖于主键。
第三范式
2NF的基础上, 任何非主列不得传递依赖于主键。
如果一个字段设置了非空与唯一约束,该字段与主键的区别?
1) 主键数在一个表中,只能有一个。不能出现多个主键。主键可以单列,也可以是多列。
2) 自增长只能用在主键上
day03 MySQL多表 事务
MYSQL中可以有两种方式进行事务的操作:
1) 手动提交事务
2) 自动提交事务
手动提交事务的SQL语句
开启事务 start transaction;
提交事务 commit;
回滚事务 rollback;
回滚点
设置回滚点 savepoint 名字
回到回滚点 rollback to 名字
自动提交事务
MySQL默认每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕自动提交事务,MySQL默认开始自动提交事务
查询隔离级别 select @@tx_isolation;
设置隔离级 set global transaction isolation level 级别字符串;
事务的隔离级别
事务的四大特性ACID
原子性 一致性 隔离性 持久性
MySQL数据库有四种隔离级别
1 读未提交 read uncommitted
2 读已提交 read committed
Oracle和SQL Server
3 可重复读 repeatable read
MySQL
4 串行化 serializable
隔离级别越高,性能越差,安全性越高。
day04 _JDBC
JDBC
JDBC规范定义接口,具体的实现由各大数据库厂商来实现。
使用JDBC的好处:
1) 程序员如果要开发访问数据库的程序,只需要会调用JDBC接口中的方法即可,不用关注类是如何实现的。
2) 使用同一套Java代码,进行少量的修改就可以访问其他JDBC支持的数据库
加载和注册驱动的方法
Class.forName(数据库驱动实现类)
加载和注册数据库驱动,
数据库驱动由mysql厂商"com.mysql.jdbc.Driver"
com.mysql.jdbc.Driver 类 内有静态代码块
DriverManager.registerDriver(new Driver())----> 注册数据库驱动
DriverManager作用:
1) 管理和注册驱动
2) 创建数据库的连接
Connection作用:
具体的实现类由数据库的厂商实现,代表一个连接对象。
Statement作用:
代表一条语句对象,用于发送SQL语句给服务器,用于执行静态 SQL 语句并返回它所生成结果的对象。
ResultSet接口:
作用:封装数据库查询的结果集,对结果集进行遍历,取出每一条记录。
ResultSet接口中的方法
boolean next()
1) 游标向下移动1行
2) 返回boolean类型,如果还有下一条记录,返回true,否则返回false
数据类型 getXxx()
1) 通过字段名,参数是String类型。返回不同的类型
2) 通过列号,参数是整数,从1开始。返回不同的类型
DBC访问数据库的步骤
1) 注册和加载驱动(可以省略)
2) 获取连接
3) 创建SQL,和执行SQL对象
4) 执行SQL获取结果
5) 处理结果
6) 释放资源
SQL注入问题
原因: 使用 Statement时 字符串拼接....
PreparedSatement的好处
1. 会先将SQL语句发送给数据库预编译。PreparedStatement会引用着预编译后的结果。可以多次传入不同的参数给PreparedStatement对象并执行。减少SQL编译次数,提高效率。
2. 安全性更高,没有SQL注入的隐患。
3. 提高了程序的可读性
给占位符?赋值:
* 方法: setXxx(参数1,参数2)
* 参数1:?的位置编号 从1 开始
* 参数2:?的值
JDBC事务的处理
Connection接口中与事务有关的方法
void setAutoCommit(boolean autoCommit)
参数是true或false
如果设置为false,表示关闭自动提交,相当于开启事务
day05 数据库连接池 Spring JDBC
数据库连接池
数据库厂商来实现
获取连接:getConnection()
归还连接:Connection.close() 如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接,而是归还连接。
一般我们不去实现它,有数据库厂商来实现
1. C3P0:数据库连接池技术
2. Druid:数据库连接池实现技术,由阿里巴巴提供的
C3P0:数据库连接池技术
1. 导入jar包
(两个) c3p0-0.9.5.2.jar 和 mchange-commons-java-0.2.12.jar
导入数据库驱动jar包
2. 定义配置文件
c3p0.properties 或者 c3p0-config.xml
路径:直接将文件放在src目录下即可。
3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
4. 获取连接: getConnection
* 代码:
//1.创建数据库连接池对象
DataSource ds = new ComboPooledDataSource();
//2. 获取连接对象
Connection conn = ds.getConnection();
Druid:数据库连接池实现技术,由阿里巴巴提供的
步骤:
1. 导入jar包 druid-1.0.9.jar
2. 定义配置文件:
是properties形式的
可以叫任意名称,可以放在任意目录下
3. 加载配置文件。Properties
4. 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory
5. 获取连接:getConnection()
Spring JDBC
Spring框架对JDBC的简单封装
|
|