数据库-MySQL
目次数据库的介绍:
1.数据库的分类:
1.1关系型数据库(RDBMS):
1.2非关系型数据库:
1.3两数据库的区别:
2.数据库的操作
2.1显示当前的数据库
2.2创建数据库
2.3利用数据库
2.4删除数据库
3.常用数据范例
3.1数值范例(分为整形和浮点型):
3.2字符串范例
3.3日期范例
4表的操作
4.1查看表布局
4.2删除表
5.MySQL表的增删改查
5.1新增(create)
5.1.1单行数据插入(全部列都插入)
5.1.2多行数据(指定列插入)
5.2查询(retrieve)
5.2.1全列查询
5.2.2指定列查询
5.2.3查询字段为表达式
5.2.4别名
5.2.5去重:DISTINCT
5.2.6排序:ORDER BY
5.2.7条件查询:WHERE
5.2.8分页查询:LIMIT
5.3修改 (update)
5.4删除(delete)
5.5数据库约束
5.5.1约束范例
5.6查询
5.6.1聚合查询
5.6.2GROUP BY子句
5.6.3HAVING
5.6.4连合查询
内毗连:
外毗连:
自毗连:
子查询:
5.6.5合并查询
6.MySQL索引事务
6.1索引
6.1.1索引的作用:
6.1.2索引的数据布局:
6.2事务
6.2.1事务的四大特性
6.2.2隔离性程度
6.2.3隔离级别
7.JDBC编程
数据库的介绍:
数据库-管理数据的软件,相比于文件体系来说,更加能有用的管理数据.同时,数据库也提供一种远程服务,通过远程毗连来利用数据库,即数据库服务器.
1.数据库的分类:
大抵可以分成关系型数据库和非关系型数据库
1.1关系型数据库(RDBMS):
接纳关系模子来构造数据的数据库.平凡讲,就是利用表来存储和管理数据.
每个表由行和列组成,表之间通过关系(主键,外键等)进行关联.
常用的关系型数据库如:1.Oracle 2.MySQL 3.SQL server
1.2非关系型数据库:
一种不依赖于传统关系模子的数据库,实用于处理非布局化和半布局化数据,这让他具备了高扩展性和灵活性.
其核心概念主要为以下四点
[*]键值存储 ---> 2.Redis
[*]文档存储 ---> 1.MongoDB
[*]列族存储 ---> 3.hbase
[*]图数据库 ---> 4.Neo4j
常见的非关系型数据库如:1.MongoDB 2.Redis 3.hbase 4.Neo4j
1.3两数据库的区别:
关系型和非关系型的区别关系型数据库非关系型数据库利用SQL是一般不基于SQL实现事务支持支持不支持复杂操作支持不支持海量读写效率低效率高基本布局布局稳固灵活性高利用场景业务方面用于数据缓存大概统计 2.数据库的操作
2.1显示当前的数据库
show databases;
https://i-blog.csdnimg.cn/direct/7f3ff9944d8346769490a6f020ac8af3.png
2.2创建数据库
语法:
CREATE DATABASE database_name
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
[*]大写的表示关键字
[*]character set:指定命据库接纳的字符集
[*]collate:指定命据库字符集的校验规则
示例:1.创建名为db_test1的数据库
create database db_test1;
https://i-blog.csdnimg.cn/direct/d1f8fa3ac17e40ca9e7685045efe1905.png
2.假如体系没有 db_test2 的数据库,则创建一个名叫 db_test2 的数据库,假如有则不创建
create database if not exists db_test2; https://i-blog.csdnimg.cn/direct/305cdb54c99343c1a03a8625fbeba09b.png
2.3利用数据库
use 数据库名; https://i-blog.csdnimg.cn/direct/a4891299466f4d94b4133e2a15aada23.png
2.4删除数据库
语法:
drop database db_name; 注意:删除数据库黑白常伤害的操作,数据库删除之后,其中包罗的表和数据会被全部删除
https://i-blog.csdnimg.cn/direct/a7846b131d5749579e89f05f2c657075.png
当我们实行删除语句之后,我们查看数据库,发现数据库已经别删除.
3.常用数据范例
3.1数值范例(分为整形和浮点型):
这里我们只介绍集中常用的数值范例
数据范例大小阐明范围BIT[(M)]M指定位数,默认为1 二进制数,M 范围从 1 到 64,存储数值范围从 0 到 2^M - 1。 0 到 2^M - 1(例如,BIT(8) 的范围是 0 到 255)。INT4字节支持符号和无符号范围:-2,147,483,648 到 2,147,483,647(有符号)或 0 到 4,294,967,295(无符号)DECIMAL(M,D)可以变大变小(取决于M和D)DECIMAL (5, 2) 可以存储 123.45 M是总位数,D是小数位数
例如 DECIMAL(5,2) 的范围是 -999.99 到 999.99。
3.2字符串范例
数据范例大小阐明VARCHAR(SIZE)0-65,535字节可变长度字符串 3.3日期范例
数据范例用途格式范围大小DATE存储日期值YYYY-MM-DD1000-01-01到9999-12-313字节TIME存储时间值,不包罗日期HH:MM:SS -838:59:59到
838:59:59
3字节DATETIME存储日期和时间值YYYY-MM-DD HH:MM:SS1000-01-01 00:00:00到9999-12-31 29:59:598字节TIMESTAMP存储时间戳,通常用于纪录数据的创建和修改时间YYYY-MM-DD HH:MM:SS1970-01-01 00:00:01到2038-01-19 03:14:074字节 4表的操作
4.1查看表布局
首先,我们需要创建一个测试表,在一个数据库中,同时要添加相应的字段
例如:id,name,password,age,sex,birthday等字段
mysql> create table student_test(
-> id int,
-> name varchar(20) comment '姓名',
-> age int,
-> sex varchar(1),
-> birthday date
-> ); https://i-blog.csdnimg.cn/direct/f1a80acf97af4b07a80d27863c6db74e.png
然后我们利用关键字desc来查看表的布局:
https://i-blog.csdnimg.cn/direct/cc085699230a47b982ea3a54aec186ba.png
第一列是字段的名字;第二列是字段的范例;第三列是值是允许为空;第四列是索引范例;第五列是默认值
4.2删除表
--基本语法格式
drop table table_name;
-- drop 删除表的命令
-- if exists(可选) 如果表不存在,避免抛出错误
-- table_name 表的名字 https://i-blog.csdnimg.cn/direct/14718bcbae8f4baa8b3cefc8477f972a.png
当我们实行完删除语句后,我们再次查询数据库中的表时,发现student_test表已经被删除
5.MySQL表的增删改查
增删改查即CRUD (create)(retrieve)(update)(delete)四个单词的首字母缩写
5.1新增(create)
--基本语法
insert into table_name (column1,column2,column3,...)
values (value1,value2,value3);
--table_name:要插入的表名
--(column1,column2,column3,...):要插入数据的列名
--values (value1,value2,value3):要插入的具体值,值必须与列名的顺序一致 注:插入操作是通过网络访问,发起哀求和返反响应,这都偶然间开销;
开销主要是两部分缘故原由:1.网络时间开销
2.数据库服务器把数据存在硬盘上,IO操作花费时间
首先,我们为后面的操作,创建一张测试表(门生表)
5.1.1单行数据插入(全部列都插入)
--插入两条数据
insert into student values (100,1000,'唐僧',null);
insert into student values (101,1001,'孙悟空','11111');
https://i-blog.csdnimg.cn/direct/e48c5577ad014cdda7e5f51d5e4a8604.png
5.1.2多行数据(指定列插入)
insert into student(id,sn,name) values (102,20001,'曹孟德'),(103,20002,'孙仲谋'); https://i-blog.csdnimg.cn/direct/17c931a46a184cfebd39fcd48df6c285.png
注:未被指定的列,则以默认值来填充
5.2查询(retrieve)
--基本语法
select {*|column1,column2,...}
from table_name
]
;
--select 指定要查询的列
--from 指定要查询的表
--where 指定的查询方式
--order by 指定排序方式
--limit 限制返回的行数 注:*叫做通配符,代表了全部的列
首先,我们为后续的操作,创建一个结果分数表,并且向表内插入数据
https://i-blog.csdnimg.cn/direct/04dd652f41c14f5fb0126c652c198f22.png
https://i-blog.csdnimg.cn/direct/2ec15a1cc7074d7eb4d03a31617ec1d0.png
https://i-blog.csdnimg.cn/direct/9da462f5fcff46a6accc1f5a3feb4724.png
5.2.1全列查询
全列查询:即通过通配符*来进行查询
但是,通过这样的方式进行查询,可能会由于查询的结果许多,从而造成传输量的巨大
5.2.2指定列查询
select id,name,english from exam_result; https://i-blog.csdnimg.cn/direct/bc7829495c9b442ba4f2d24157a941c7.png
5.2.3查询字段为表达式
SELECT id, name, chinese + math + english FROM exam_result; 注:这种带有表达式的查询,查询结果返回的是一个"暂时表",这个暂时表并不会写入硬盘,而且暂时表的范例也不和原始表完全一致.
https://i-blog.csdnimg.cn/direct/33ac8e95e71f4542b5d37c5a699293e5.png
5.2.4别名
select column alias_name [...] from table name; 5.2.5去重:DISTINCT
通过distinct关键字可以去除查询列中的重复数据
https://i-blog.csdnimg.cn/direct/36ab278234a94db4b1ad81751a59aed3.pnghttps://i-blog.csdnimg.cn/direct/79facff1bb184a47b38bb1ddbd3e589d.png 5.2.6排序:ORDER BY
在SQL中,假如没有显示的写order by,则认为查询结果的序次是不确定的
假如多个列排序的值雷同,此时先后序次也不确定
-- 查询同学姓名和 qq_mail,按 qq_mail 排序显示
SELECT name, qq_mail FROM student ORDER BY qq_mail;
-- 查询同学及总分,由高到低
SELECT name, chinese + english + math FROM exam_result
ORDER BY chinese + english + math desc;
-- 查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
SELECT name, math, english, chinese FROM exam_result
ORDER BY math DESC, english, chinese;
https://i-blog.csdnimg.cn/direct/ad1a19e082014485bb5b5e8fd907ccf4.pnghttps://i-blog.csdnimg.cn/direct/0d4635281ad14c12a4e1015170b81475.pnghttps://i-blog.csdnimg.cn/direct/7a81a6a6665b4b60bc0047014c98d901.png 5.2.7条件查询:WHERE
比力运算符
运算符表明>,>=,<,<==NULL=NULL的结果是NULL<=>NULL<=>NULL的结果是true(1)!=,<>between a0 and a1范围is null is not null
like 模糊匹配,%表示任意多字符;_表示一个字符
in判断值是否在指定的聚集中 逻辑运算符
运算符表明AND与&&雷同OR与||雷同NOT逻辑非,取反 例子:
1.基本查询
-- 查询总分在 200 分以下的同学
SELECT name, chinese + math + english 总分 FROM exam_result
WHERE chinese + math + english < 200; https://i-blog.csdnimg.cn/direct/24eed8e5453f43d289b91d8f750185fb.png
2.利用逻辑运算符进行的查询
-- 查询语文成绩大于80分,且英语成绩大于80分的同学
SELECT * FROM exam_result WHERE chinese > 80 and english > 80; https://i-blog.csdnimg.cn/direct/37829162dfb5459593214c1372c281d3.png
3.范围查询(between...and...)
-- 查询语文成绩在 分的同学及语文成绩
SELECT name, chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90; https://i-blog.csdnimg.cn/direct/0eb87cd43d0d4ce28749464a2f6fafc4.png
4.模糊查询(like)
-- % 匹配任意多个(包括 0 个)字符
SELECT name FROM exam_result WHERE name LIKE '孙%';-- 匹配到孙悟空、孙权
-- _ 匹配严格的一个任意字符
SELECT name FROM exam_result WHERE name LIKE '孙_';--匹配到孙权 https://i-blog.csdnimg.cn/direct/80891e560f4a43c7b140c75790a6b3e3.png
5.2.8分页查询:LIMIT
--分页查询的语法
select ... from table_name limit n offset s;
--s:表示跳过的行数,n:表示返回的行数 -- 第 3 页,如果结果不足 3 个,不会有影响
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3
OFFSET 6; https://i-blog.csdnimg.cn/direct/24799d2994b34406870f166e07a110a4.png
5.3修改 (update)
--基本语法
update table_name set column1 = value1,column2 = value2,...
;
-- update table_name 指定要更新的表
-- set 指定要更新的列及其新值
-- where condition 指定更新条件 -- 将孙悟空同学的数学成绩变更为 80 分
UPDATE exam_result SET math = 80 WHERE name = '孙悟空';
https://i-blog.csdnimg.cn/direct/9fafe5a6cf4044008dd12f2d063953b0.png
5.4删除(delete)
--基本语法
delete from table_name ; DELETE FROM exam_result WHERE name = '孙悟空'; https://i-blog.csdnimg.cn/direct/22201304a4cd4001af01ce11f84891e2.png
5.5数据库约束
以上,我们介绍了数据库的一些基本的增删改查操作,接下来我们对这些操作做一个深入的认识
5.5.1约束范例
注:约束可以组合在一起去利用
[*]主键约束(primary key) - 唯一标识表中的每一行,确保每行数据的唯一性
[*]主键列的值必须唯一且不能为空
[*]一个表只能有一个主键,但是主键可以有多个列组成
[*]外键约束(foreign key) - 创建表与表之间的关系,确保引用完整性
[*]外键的值必须是被引用表的主键大概唯一键的值
[*]外键可以是null
[*]唯一约束(unique) - 确保列中的值唯一
[*]唯一约束列的值必须唯一,但是可以为null
[*]一个表可以有多个唯一约束
[*]非空约束(not null) - 确保列中的值不能为null
[*]非空约束列必须包罗值
[*]查抄约束(check) - 确保列中的值满意指定条件
[*]查抄约束可以界说复杂的条件
[*]假如条件不满意,插入或更新操作会失败
[*]默认约束(default) - 为列指定默认值
[*]假如插入数据时未指定值,则利用默认值
[*]自动递增约束(auto_increment) - 自动为列生成唯一的递增值
[*]通常用于主列
[*]每次插入新纪录,列的值会自动递增
1)NULL约束:创建表时,可以指定某列不为空
create table student (
id int not null,
sn int,
name varchar(20),
qq_mail varchar(20)
); 2)UNIQUE约束:指定某一列为唯一的,不重复的
create table student (
id int not null,
sn int unique,
name varchar(20),
qq_mail varchar(20)
); 3)DEFAULT约束:指定插入数据时,name列为空,默认值unknown
create table student (
id int not null,
sn int,
name varchar(20) default 'unknown',
qq_mail varchar(20)
); 4)PRIMARY KEY主键约束:指定某一列大概几列为主键
create table student (
id int not null primary key,
sn int,
name varchar(20),
qq_mail varchar(20)
); 注:
[*]主键约束与唯一约束都有先查询的过程,mysql会默认给primary key和unique这样的列自动添加索引,用以提高查询速度
[*]主键约束一般与自动递增约束共同利用
问:当我们在数据量过大的时候,我们会对数据进行分库分表,在这样的情况下我们如何利用自增主键,由于多个服务器三者不互通,我们并不能知到其他主键序号是多少,所以如何确定当一条新的数据插入某一个分库时,如何确定其主键序号?
方案长处缺点UUID简朴,无需中心化服务存储空间大,无序雪花算法高性能,适合分布式体系依赖时间戳,可能受时钟回拨影响Redis 自增 ID高性能,适合分布式体系依赖 Redis,增加体系复杂性分段分配自增 ID简朴易实现需要预先规划 ID 范围,扩展性较差数据库序列数据库原生支持,简朴易用仅实用于支持序列的数据库分布式 ID 生成服务高性能,适合大规模分布式体系依赖外部服务,增加体系复杂性结合业务逻辑生成结合业务需求,避免冲突需要业务字段支持 5)FOREIGN KEY外键约束:关联其他表的主键大概唯一键
--建立一个班级表
create table classes(
id int primary key auto_increment,
name varchar(20),
`desc` varchar(20)
);
create table student (
id int not null primary key auto_increment,
sn int,
name varchar(20) default 'unknown',
qq_mail varchar(20)
classes_id int,
foreign key (classes_id) reference classes(id)
--在student表中添加外键约束,括号里面的是子表中的列,
--reference 后面表示的是父表中的主键或者唯一键列
); 注:
1)假如要进行删除表的操作,要确保表可以或许顺利进行删除,首先要删除子表,再删除父表
2)在对表中数据进行修改时,同样也会受到限制
3)在这样的子表和父表的布局中,不但仅是父表约束了子表,同样子表也同样约束了父表
5.6查询
5.6.1聚合查询
首先,我们先总结一下聚合函数(常见)
函数名作用示例COUNT()盘算行数或非空值的数量SELECT COUNT(*) FROM users;SUM()盘算数值列的总和SELECT SUM(age) FROM users;AVG()盘算数值列的平均值SELECT AVG(age) FROM users;MIN()返回列中的最小值SELECT MIN(age) FROM users;MAX()返回列中的最大值SELECT MAX(age) FROM users; 聚合查询着实就是对表中的每行之间进行运算
5.6.2GROUP BY子句
group by子句可以对指定列进行分组查询,通常与聚合函数一起利用,以便对每个分组进行统计和盘算
我们接下来,准备一个测试表和数据
create table employee(
id int primary key auto_increment,
name varchar(20) not null,
role varchar(20) not null,
salary numeric(11,2)
);
insert into employee(name, role, salary) values
('1','服务员', 1000.20),
('2','游戏陪玩', 2500.99),
('3','游戏角色', 9999.11),
('4','游戏角色', 3333.5),
('5','游戏角色', 7000.33),
('6','董事长', 120000.66); https://i-blog.csdnimg.cn/direct/ece122a6e0284b0bb6ccb1a573fce262.png
查询每个角色的,最高,最低,平均工资
select max(salary),min(salary),avg(salary) from employee group by role; https://i-blog.csdnimg.cn/direct/f6b1d294490b4990962c85b22c383f9f.png
5.6.3HAVING
在通过group by进行分组之后,假如需要对分组后的结果在进行条件过滤,此时并不能利用where语句,而要利用having进行筛选.但是其可以同where一同利用.
--显示平均工资高于30000的角色和它的平均工资
select
name,role,avg(salary)
from
employee group by role,name having avg(salary) > 30000; https://i-blog.csdnimg.cn/direct/fee69ba08dfd4883bc004227ca916b48.png
5.6.4连合查询
在进行后续演示后,我们先进行演示表和数据的准备
create table classes(id int primary key auto_increment,name varchar(20),`desc` varchar(100));
create table student(id int primary key auto_increment,sn varchar(20),name varchar(20),
qq_mail varchar(20),classes_id int);
create table course(id int primary key auto_increment,name varchar(20));
create table score(score decimal(3,1),student_id int ,course_id int);
insert into classes(name, `desc`) values
('计算机系2019级1班', '学习了计算机原理、C和Java语言、数据结构和算法'),
('中文系2019级3班','学习了中国传统文学'),
('自动化2019级5班','学习了机械自动化');
insert into student(sn, name, qq_mail, classes_id) values
('982','萧炎','xiaoyan@qq.com',1),
('835','小医仙',null,1),
('391','彩鳞',null,1),
('031','萧薰儿','xiaoxuner@qq.com',1),
('054','雅菲',null,1),
('234','天火尊者','tianhuo@qq.com',2),
('223','青鳞',null,2),
('527','药尊者','yaozunzhe@qq.com',2);
insert into course(name) values
('Java'),('中国传统文化'),('计算机原理'),('语文'),('高阶数学'),('英文');
insert into score(score, student_id, course_id) values
-- 萧炎
(70, 1, 1),(98, 1, 3),(44, 1, 5),(98, 1, 6),
-- 小医仙
(60, 2, 1),(65, 2, 5),
-- 彩鳞
(43, 3, 1),(67, 3, 3),(89, 3, 5),
-- 雅菲
(77, 4, 1),(23, 4, 3),(66, 4, 5),(82, 4, 6),
-- 天火尊者
(71, 5, 1),(57, 5, 5),
-- 青鳞
(76, 6, 2),(53, 6, 4),(69, 6, 6),
-- 药尊者
(70, 7, 2),(82, 7, 6); https://i-blog.csdnimg.cn/direct/2eb6d94e30a54948b98796c51086e51e.png
https://i-blog.csdnimg.cn/direct/93d31a481c834d30a5a7d3a6fbf1385c.png
https://i-blog.csdnimg.cn/direct/7045e96ec13b4b07a358baafd64c602c.png
https://i-blog.csdnimg.cn/direct/cf21e19c72fc410cbb30c4952ba33f54.png
内毗连:
--语法
select columns from table1 inner join table2 on table1.column = table2.column;
--table1和table2表示要连接的两个表
-- on后面的表达式是连接条件,指定两个表之间的关联列 1)我们查询萧炎同学全部课程的结果
select student.name,score.score,course.name from student inner join score on student.id = student_id join course on course.id = score.course_id and student.name = '萧炎'; https://i-blog.csdnimg.cn/direct/ede677ad9453430a84975bfc760a0b52.png
2)我们查询全部同学的总结果
select student.name,sum(score.score) from student join score on score.student_id = student.id group by score.student_id; https://i-blog.csdnimg.cn/direct/2b9e6d72f2664c9a844bd96827cea61a.png
外毗连:
外毗连分为左外和右外毗连,其意思是左侧的表完全显示我们就说是左外毗连;右侧的表完全显示我们就是说右外毗连
--语法
select columns from table1 left join table2 on table1.column = table2.column;
select columns from table1 right join table2 on table1.column = table2.column; 自毗连:
自毗连是指在同一张表毗连自身进行查询(自身进行笛卡尔积)
查询某个门生中英文结果比数学结果高的结果信息
--先查询两门课程的id
select id,name from course where name = '英文' or name = '高阶数学';
--在查询成绩表中,英文比数学成绩好的信息
select s1.* from score s1 join score s2 on s1.student_id = s2.student_id and s1.score < s2.score and s1.course_id = 5 and s2.course_id = 6; https://i-blog.csdnimg.cn/direct/e08d5db6abcf4f44979b5e15a44d8cf5.png
子查询:
多个sql强行组合,但是对代码可读性来讲,是毁灭性打击.
--查询与小医仙同学的同班同学
select * from student where classes_id = (select classes_id from student where name = '小医仙'); https://i-blog.csdnimg.cn/direct/53e4476c139a41929703244ae0b8dcb3.png
5.6.5合并查询
合并查询就是将多个select语句进行合并实行.但是要求这几个语句所查询的表的列的范例,个数,名字都一样;在合并查询中可以利用union,union all关键字对查询的结果进行去重大概留重
--union
select * from course where id<3
union
select * from course where name = '英文';
--union all
select * from course where id<3
union all
select * from course where name = '英文'; 6.MySQL索引事务
6.1索引
是数据库中用于加速数据检索的一种数据布局.它雷同于书籍的目次,可以资助数据库快速定位到特定的数据行,而不需要扫描整个表
6.1.1索引的作用:
加速查询:索引可以显著提高查询速度,特殊是在大数据量的表中。
优化排序和分组:索引可以加速 ORDER BY 和 GROUP BY 操作。
唯一性约束:唯一索引可以确保列中的值唯一。
加速毗连操作:在多表毗连查询中,索引可以提高毗连效率。
6.1.2索引的数据布局:
×哈希索引:基于哈希表实现,适合等值查询;等值查询的时间复杂度为O(1);但是,哈希索引不支持范围查询,同时哈希冲突可能导致性能下降,不支持排序和分组操作
×二叉搜刮树:二叉搜刮树每个节点最多只有两个子节点,导致树的高度较高,这就会导致查询时间复杂度为O(h),对于大规模的数据,树的高度会显著增加,导致查询性能下降;同时,假如插入的数据序次不匀称,二叉搜刮树就会退化为链表,查询时间复杂度退化为O(n);其次,二叉搜刮树节点存储不连续,导致I/O操作频仍
×B树:B 树的叶子节点没有通过指针毗连,范围查询需要多次遍历。对于范围查询(如 BETWEEN、>、<),性能不如 B+ 树;B 树的非叶子节点也存储数据,导致存储空间利用率较低.对于大规模数据,存储空间开销较大;B 树的实现和维护比 B+ 树复杂.增加了数据库体系的开发和维护本钱。
√B+树:B+树是B树的改进版,在B+树中,叶子结点包罗了全部数据的全集,叶子结点同时用于雷同链表的方式相连;B+树相较于B树和二叉搜刮树来比,高度降低,更适合范围查询,全部的查询都在叶子结点,所以查询的速度都是一样的;非叶子节点只需要存储索引列的值,数据存放于叶子结点即可.
6.2事务
事务平凡来说,就是把多个SQL打包到一起,变成一个团体
打包成一个团体->"原子性";在这许多SQL实行过程中,假如其中某一个sql实行错误,并非其之前的实行没有发生,而是自动恢复成之前的样子
6.2.1事务的四大特性
[*]原子性:事务中的全部操作要么全部成功,要么全部失败;这样就能确保事务是一个不可分割的工作单元
[*]一致性:事务使数据库从一个一致状态转换到另一个一致状态;确保数据库的完整性约束在事务的实行前后都得到满意
[*]隔离性:并发事务之间互不干扰,每个事务都感觉不到其他事务的存在;这样防止并发事务导致的数据不一致的题目;他主要通过隔离级别来进行实现(这个我们稍后解说)
[*]长期性:事务提交后,对数据库的修改是永久性的,即使体系崩溃也不会丢失;确保数据的长期和可靠
6.2.2隔离性程度
1.读脏数据("脏读"):
事务A读取了事务B没有提交的数据,假如事务B回滚,事务A读取的数据是无效的.
办理方式:通过对'写'操作加锁,当事务B在写的时候,不允许事务A进行读操做
2.不可重复读:
事务A在多次读取同一数据时,可能会得到不同的结果,由于事务B在事务A读取之间进行了修改
办理方式:通过对'读'操作加锁,当事务A进行读取操作时,事务B不能对数据进行修改
3.幻读:
事务A在多次查询可能会得到不同的结果集,由于事务B在事务A查询之间插入了新数据
办理方式:串行化,彻底的放弃并发
6.2.3隔离级别
[*]read uncommitted : 不做任何限制,并发度最高
[*]read committed : 写操作加锁,并发度降低,隔离级别提高,办理脏读
[*]repeatable read : 写和读加锁,并发度降低,隔离级别提高,办理脏读+不可重复读
[*]serializable : 严酷串行化,并发度降低,隔离级别提高,办理脏读+不可重复读+幻读
7.JDBC编程
Java 提供的用于毗连和操作关系型数据库的尺度 API。通过 JDBC,Java 步伐可以与各种数据库(如 MySQL、PostgreSQL、Oracle 等)进行交互。
查:
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCSelectDemo {
public static void main(String[] args) throws SQLException {
//向上转型,降低耦合性,代码依赖于抽象的DataSource接口,而不是MysqlDataSource实现,
// 如果需要更换数据源,只需要修改实例化部分,而不是修改其他的代码
DataSource dataSource= new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("");
Connection connection = dataSource.getConnection();
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet resultSet = statement.executeQuery();
//初始情况 光标指向第一行之前
while (resultSet.next()){
//使用getxx方法获取每一列
//获取int 就用getInt获取string 就用 getString
//这里的参数就是数据库表的列名
int id = resultSet.getInt("id");
int sn = resultSet.getInt("sn");
String name = resultSet.getString("name");
String qq_mail = resultSet.getString("qq_mail");
int classes_id = resultSet.getInt("classes_id");
System.out.println(id + ":" + sn + ":" + name + ":" + qq_mail + ":" + classes_id);
}
//释放资源
resultSet.close();
statement.close();
connection.close();
}
} 修改,删除:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class JDBCInsertDemo {
public static void main(String[] args) throws SQLException {
//使用jdbc往数据库中,插入一个记录
//1.创建数据源,描述了数据库在哪
DataSource dataSource= new MysqlDataSource();
//设置数据库所在位置
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("");
//2.和数据库建立连接
Connection connection = dataSource.getConnection();
// 控制台输入用户的信息
Scanner scanner = new Scanner(System.in);
System.out.println("序号");
int id = scanner.nextInt();
System.out.println("学号");
int sn = scanner.nextInt();
System.out.println("请输入姓名");
String name = scanner.next();
System.out.println("请输入邮箱");
String qq_mail = scanner.next();
System.out.println("请输入班级");
String classes_id = scanner.next();
//3.构造一个SQL语句,完成插入操作
//String sql = "insert into student values (1,'张三')";
//通过prepareedStatement 占位符进行替换
String sql = "insert into student values (?,?,?,?,?)";
//jdbc中 还需要搭配一个特定的对象来描述这里的sql对象
PreparedStatement statement = connection.prepareStatement(sql);
//PreparedStatement提供替换sql语句里面的占位符
statement.setInt(1,id);
statement.setInt(2,sn);
statement.setString(3,name);
statement.setString(4,qq_mail);
statement.setString(5,classes_id);
System.out.println("sql: " + statement);
//4.执行SQL语句,控制客户端给服务器发送请求
//针对 增 删 改 使用executeUpdate
// //针对查使用 executeQuery
//返回结果这个操作影响到几行
int ret = statement.executeUpdate();
System.out.println("ret =" + ret);
//5.断开和数据库的连接,并且释放必要的资源
statement.close();
connection.close();
//资源创建顺序和资源释放顺序是相反的
}
}
序号
9
学号
459
请输入姓名
熊战
请输入邮箱
xiongzhan@qq.com
请输入班级
2
sql: com.mysql.jdbc.JDBC42PreparedStatement@25bbf683: insert into student values (9,459,'熊战','xiongzhan@qq.com','2')
ret =1
https://i-blog.csdnimg.cn/direct/10e1a46a8fcd44d19163688eb033dca0.png
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false"); 在这段代码的右边:
[*]jdbc:mysql:是 JDBC 毗连 MySQL 数据库的 URL 格式。它用于指定命据库的毗连信息,包括主机地址、端口号、数据库名称、用户名和密码等
[*]127.0.0.1:数据库服务器所在的IP地址
[*]3306:端口号
[*]test:访问数据库的名字
[*]characterEncoding=utf8:形貌了哀求字符的编码方式
[*]useSSL=false:关闭加密功能
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]