Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(下)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)

Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(中):https://developer.aliyun.com/article/1580543

12 表的操作

12.1 查看表 show

-- 查看当前数据库下所有的表
show tables;

12.2 查看表结构 desc

-- 查看表结构
-- desc 表名
desc emp

12.3 表的创建 【重要】

CREATE TABLE 表名(

列名 数据类型 [约束] ,

列名 数据类型 [约束] ,

列名 数据类型 [约束]

);

-- 建表
create table user(
    username varchar(50),
    password varchar(50),
    age int,
    phone_num varchar(20),
    birthday date,
    money double
)

12.4 删除表

drop table 表名;删除表

-- 删除表
-- drop table 表名;
-- drop table if exists 表名;
drop table if exists user;

12.5 修改表【了解】alter

添加列

  • alter table 表名 add 添加的字段 数据类型;
-- 在user表中添加一个address字段
alter table user add address varchar(100);

修改列的数据类型

  • alter table 表名 modify 修改的字段 数据类型;
-- 在user表中修改birthday字段的类型为datetime类型
alter table user modify birthday datetime;

删除列

  • alter table 表名 drop 字段名;
-- 在user表中删除一个phone_num字段
alter table user drop phone_num;

修改列名

  • alter table 表名 change 旧列名 新列名 数据类型;
-- 在user表中将username改为name
alter table user change username name varchar(50)

13 表的约束【理解】

13.1 约束

约束:

  • 用于限制加入到表中的数据的类型和规范

13.2 约束的分类

  • 实体完整性
  • 域完整性
  • 引用完整性

13.3 实体完整性

  1. 主键约束
  • 主键的特点:非空+唯一
  1. 主键的语法:字段名 数据类型 primary key
  1. 唯一约束
  1. 唯一特点:某个字段在一列数据中是唯一的(可以为多个null)
  1. 唯一语法:字段名 数据类型 unique
  1. 自增长约束
  1. 自增长特点:一般与主键一起使用,每添加一条数据,主键自动生成,在原有的基础上加1
  2. 自增长语法: 字段名 数据类型 primary key auto_increment
  1. 联合主键约束
  • 联合主键特点:与主键的作用含义一样,只不过由多个字段一起组成主键
  • 应用场景:中间表
  • 自增长语法: primary key(字段1,字段2)


/*
  约束:
    实体完整性约束
      主键约束
        主键:指的是一行数据唯一标识的那一列
          自然主键:主键字段就是这个表的某个属性
          代理主键:使用一个与表无关字段来作为表的主键
        主键的特点:非空+唯一
                主键的语法:字段名 数据类型 primary key

            唯一约束
         唯一特点:某个字段在一列数据中是唯一的
                  唯一语法:字段名 数据类型 unique

            自增长约束
         自增长特点:一般与主键一起使用,每添加一条数据,主键自动生成,在原有的基础上加1   
         自增长语法: 字段名 数据类型 primary key auto_increment

             联合主键约束
        联合主键特点:与主键的作用含义一样,只不过由多个字段一起组成主键
                应用场景:中间表
        自增长语法: primary key(字段1,字段2)
*/
drop table if exists user;
create table user(
  id int primary key,
  name varchar(20),
  age int
)
insert into user values(1,'jack',30); 

insert into user (name,age) values('jack',30); -- 错误,违反主键约束
insert into user values(null,'jack',30); -- 错误,违反主键约束(非空)
insert into user values(1,'rose',30); -- 错误,违反主键约束(唯一)


drop table if exists user;
create table user(
  id int primary key,
  name varchar(20) unique,
  age int
)
insert into user values(1,'jack',30);


insert into user values(2,'jack',31);  -- 错误,违反唯一约束
insert into user values(3,null,33); 
insert into user values(4,null,34); 



drop table if exists user;
create table user(
  id int primary key auto_increment,
  name varchar(20) unique,
  age int
)


insert into user (name,age) values ('jack',33);
insert into user (name,age) values ('rose',33);
insert into user  values (null,'马冬梅',34);



drop table if exists user;
create table user(
  name varchar(20),
  age int,
  primary key(name,age)
)
insert into user values('jack',30);
insert into user values('jack',31);
insert into user values('rose',31);
insert into user values('jack',30); -- 错误,违反联合主键约束

13.4 域完整性

/*
    域完整性约束
      数据类型约束(必填)

      非空约束
         非空特点:添加数据的时候,不能为null
         非空语法:字段名 数据类型 not null

      默认值约束
         默认值特点:这一列数据如果不添加,则默认值生效
         默认值语法: 字段名 数据类型 default '默认值'

*/
drop table if exists user;
create table user(
  id int primary key auto_increment,
  name varchar(20) not null,
  age int
)
insert into user (name,age) values (null,33); -- 错误,违反非空约束
drop table if exists user;
create table user(
  id int primary key auto_increment,
  name varchar(20) default '宋小宝',
  age int
) 
insert into user (name,age) values (null,33); -- 注意:默认值不生效
insert into user (age) values (33); -- 默认值生效

13.5 引用完整性

引用完整性约束:

  • 外键约束
  • 语法:foreign key
  • 特点
  • 主表中有的从表中可以没有
  • 主表中没有的从表中不能有(从表中修改、增加)
  • 删除主表数据要保证从表中没有(主表中删除)
  • 总结:在实战开发中,如果能不使用外键的尽量就不使用外键。使用逻辑外键
/*
  引用完整性约束(在实际开发,如果能够不使用外键约束就不使用,我们可以使用逻辑外键)
    引用完整性约束:指的是多张表之间的引用约束
    主表(dept:主键)    从表(emp:外键)
        外键约束
       特点:
         1、主表中有的从表中可以没有,但是主表没有的从表一定不能有
         2、删除主表中的数据的时候,要保证从表没有与之关联的数据
         3、修改从表中数据的时候。要保证主表中存在
            
            语法:
        constraint 外键约束的名称 foreign key(外键字段) references 关联表(关联字段)

*/


drop table if exists tb_dept;
create table tb_dept(
  deptno int primary key,
  dname varchar(30),
  location varchar(30)
);

drop table if exists tb_emp;
create table tb_emp(
  empno int primary key,
  ename varchar(30),
  job varchar(30),
  deptno int,
  constraint fk_dept_emp foreign key(deptno) references tb_dept(deptno)
)
insert into tb_dept values(100,'开发部','金融港');
insert into tb_dept values(101,'人事部','光谷广场');
insert into tb_emp values(6666, 'jack','java开发',20000); -- 错误,违反了外键约束

insert into tb_emp values(6666, 'jack','java开发',100);
delete from tb_dept where deptno = 100; -- 错误,违反了外键约束
update tb_emp set deptno = 102 where empno = 6666;

14 权限管理【了解】

  • 创建用户
  • 语法:create user 用户名 identified by 用户密码
  • 用户授权
  • 语法:grant 权限名称(select、update、insert、alter、create…) on 数据库.数据表 to 用户
  • 回收权限
  • 语法:revoke 权限名称(select、update、insert、alter、create…) on 数据库.数据表 from 用户
  • 删除用户
  • 语法: drop user 用户名
-- 创建用户
create user 'cxk' identified by '123456';

-- 授权
-- grant all(select、delete、update、select、create、drop..) on *.* to 用户
-- *.* 所有表
grant select on java2108.emp to 'cxk'

-- 回收权限
-- revoke all on *.* from 用户
revoke select on java2108.emp from 'cxk';

-- 删除
-- drop user if exists 用户
drop user if exists 'cxk'

15 视图【了解】

15.1 概念

视图,虚拟表,从一个表或多个表中查询出来的表,作用和真实表一样,包含一系列带有行和列的数据。视图中,用户可以使用SELECT语句查询数据,也可以使用INSERT,UPDATE,DELETE修改记录,视图可以使用户操作方便,并保障数据库系统安全。

15.2 视图特点

  • 优点
  • 简单化,数据所见即所得。
  • 安全性,用户只能查询或修改他们所能见到得到的数据。
  • 逻辑独立性,可以屏蔽真实表结构变化带来的影响。
  • 缺点
  • 性能相对较差,简单的查询也会变得稍显复杂。
  • 修改不方便,特变是复杂的聚合视图基本无法修改。

15.3 视图的创建

语法:CREATE VIEW 视图名 AS 查询数据源表语句;

15.3.1 创建视图

-- 创建视图
create view myView as (select empno,ename,job,mgr,hiredate,deptno from emp)


15.3.2 使用视图

-- 查询视图
select * from myView;

15.4 视图的修改

  • 方式一:CREATE OR REPLACE VIEW 视图名 AS 查询语句
  • 方式二:ALTER VIEW 视图名 AS 查询语句

15.4.1 修改视图

-- 修改视图
-- 方式1:
create or replace view myView as((select empno,ename,job,hiredate,deptno from emp))
-- 方式2:
alter view myView as ((select empno,ename,hiredate,deptno from emp))

15.5 视图的删除

DROP VIEW 视图名

15.5.1 删除视图

-- 删除视图
drop view if exists myView;


  • 注意:删除视图不会影响原表

15.6 视图的注意事项

  • 注意:
  • 视图不会独立存储数据,原表发生改变,视图也发生改变。没有优化任何查询性能。
  • 如果视图包含以下结构中的一种,则视图不可更新
  • 聚合函数的结果
  • DISTINCT 去重后的结果
  • GROUP BY 分组后的结果
  • HAVING 筛选过滤后的结果
  • UNION、UNION ALL 联合后的结果

16 事务【理解】

16.1 事务的概念

**事务(transaction)**是一个原子操作。是一个最小执行单元。可以由一个或多个SQL语句组成,在同一个事务当中,所有的SQL语句都成功执行时,整个事务成功,有一个SQL语句执行失败,整个事务都执行失败。

16.2 事务的边界

  • 开始:连接到数据库,执行一条DML语句。 上一个事务结束后,又输入了一条DML语句,即事务的开始
  • 结束:
    1). 提交:
    a. 显示提交:commit;

b. 隐式提交:一条创建、删除的语句,正常退出(客户端退出连接);

2). 回滚:

a. 显示回滚:rollback;

b. 隐式回滚:非正常退出(断电、宕机),执行了创建、删除的语句,但是失败了,会为这个无效的语句执行回滚。

16.3 事务的原理

数据库会为每一个客户端都维护一个空间独立的缓存区(回滚段),一个事务中所有的增删改语句的执行结果都会缓存在回滚段中,只有当事务中所有SQL 语句均正常结束(commit),才会将回滚段中的数据同步到数据库。否则无论因为哪种原因失败,整个事务将回滚(rollback)。

16.4 事务的特性

  • Atomicity(原子性)

一个事务不可分割,要么一起执行成功,要么一起失败

  • Consistency(一致性)

事务操作的前后要保证的数据的一致

  • Isolation(隔离性)

一个事务的操作不能影响到另一个事务的执行

  • Durability(持久性)

一个事务操作完成对数据库的影响是永久

16.5 事务应用

应用环境:基于增删改语句的操作结果(均返回操作后受影响的行数),可通过程序逻辑手动控制事务提交或回滚

  • 事务完成转账
#A 账户给 B 账户转账。
#1.开启事务
set autocommit=0;  #禁止自动提交 set autocommit=1;#开启自动提交
#2.事务内数据操作语句
UPDATE ACCOUNT SET MONEY = MONEY-1000 WHERE ID = 1;
UPDATE ACCOUNT SET MONEY = MONEY+1000 WHERE ID = 2;
#3.事务内语句都成功了,执行 COMMIT;
COMMIT;
#4.事务内如果出现错误,执行 ROLLBACK;
ROLLBACK;
  • 注意:开启事务后,执行的语句均属于当前事务,成功再执行 COMIIT,失败要进行 ROLLBACK

16.6 事务的并发问题

  • 1、脏读:事务A读到事务B没有提交的数据
  • 2、不可重复读:事务A在同一个事务中,因为事务B修改了数据并提交,造成两次读取到的数据不一致
  • 3、幻读:事务A在同一个事务中,因为事务B新增了数据并提交,如果事务A修改数据,会出现多修改了一条数据,出现幻觉

16.7 如何解决事务并发问题

通过设置事务隔离级别可以解决以上问题

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
不可重复读(read-committed)—Oracle默认的隔离级别
可重复读(repeatable-read)—MySQL默认隔离级别,幻读一般是可以接受的
串行化(serializable)–效率低

16.8 演示问题

  • 查看当前数据库的隔离级别
  • select @@tx_isolation;
  • 修改当前数据库的隔离级别
  • set session transaction isolation level 隔离级别
  • eg: set session transaction isolation level repeatable read;

17 SQL语言的分类

17.1 SQL语言分类

  • 数据查询语言DQL(Data Query Language):select、where、order by、group by、having 。【重要】
  • 数据定义语言DDL(Data Definition Language):create、alter、drop。
  • 数据操作语言DML(Data Manipulation Language):insert、update、delete 。 【重要】
  • 事务处理语言TPL(Transaction Process Language):commit、rollback 。 【重要】
  • 数据控制语言DCL(Data Control Language):grant、revoke。

补充 :

T,失败要进行 ROLLBACK**

16.6 事务的并发问题

  • 1、脏读:事务A读到事务B没有提交的数据
  • 2、不可重复读:事务A在同一个事务中,因为事务B修改了数据并提交,造成两次读取到的数据不一致
  • 3、幻读:事务A在同一个事务中,因为事务B新增了数据并提交,如果事务A修改数据,会出现多修改了一条数据,出现幻觉

16.7 如何解决事务并发问题

通过设置事务隔离级别可以解决以上问题

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
不可重复读(read-committed)—Oracle默认的隔离级别
可重复读(repeatable-read)—MySQL默认隔离级别,幻读一般是可以接受的
串行化(serializable)–效率低

16.8 演示问题

  • 查看当前数据库的隔离级别
  • select @@tx_isolation;
  • 修改当前数据库的隔离级别
  • set session transaction isolation level 隔离级别
  • eg: set session transaction isolation level repeatable read;

17 SQL语言的分类

17.1 SQL语言分类

  • 数据查询语言DQL(Data Query Language):select、where、order by、group by、having 。【重要】
  • 数据定义语言DDL(Data Definition Language):create、alter、drop。
  • 数据操作语言DML(Data Manipulation Language):insert、update、delete 。 【重要】
  • 事务处理语言TPL(Transaction Process Language):commit、rollback 。 【重要】
  • 数据控制语言DCL(Data Control Language):grant、revoke。

补充 :

    相关实践学习
    每个IT人都想学的“Web应用上云经典架构”实战
    本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
    MySQL数据库入门学习
    本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
    目录
    相关文章
    |
    11天前
    |
    Java
    Java 数组学习笔记
    本文整理Java数组常用操作:遍历、求和、查找、最值及二维数组行求和等典型练习,涵盖静态初始化、元素翻倍、去极值求平均等实例,帮助掌握数组基础与应用。
    |
    11天前
    |
    小程序 Java 知识图谱
    Java 学习笔记 —— BMI & BMR 计算器
    这是一个使用 Java 编写的 BMI 与 BMR 计算器小程序,可输入年龄、性别、身高和体重,计算身体质量指数(BMI)和基础代谢率(BMR),并输出健康评估结果。通过该项目,掌握了 Java 的输入处理、数据验证、条件判断、数学运算及格式化输出等基础知识,是 Java 初学者的理想练习项目。
    |
    3月前
    |
    Java API 微服务
    2025 年 Java 从入门到精通学习笔记全新版
    《Java学习笔记:从入门到精通(2025更新版)》是一本全面覆盖Java开发核心技能的指南,适合零基础到高级开发者。内容包括Java基础(如开发环境配置、核心语法增强)、面向对象编程(密封类、接口增强)、进阶技术(虚拟线程、结构化并发、向量API)、实用类库与框架(HTTP客户端、Spring Boot)、微服务与云原生(容器化、Kubernetes)、响应式编程(Reactor、WebFlux)、函数式编程(Stream API)、测试技术(JUnit 5、Mockito)、数据持久化(JPA、R2DBC)以及实战项目(Todo应用)。
    219 5
    |
    4月前
    |
    负载均衡 算法 关系型数据库
    大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
    本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
    大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
    |
    5月前
    |
    Java 关系型数据库 MySQL
    Java汽车租赁系统源码(含数据库脚本)
    Java汽车租赁系统源码(含数据库脚本)
    100 4
    |
    5月前
    |
    NoSQL Java API
    在Java环境下如何进行Redis数据库的操作
    总的来说,使用Jedis在Java环境下进行Redis数据库的操作,是一种简单而高效的方法。只需要几行代码,就可以实现复杂的数据操作。同时,Jedis的API设计得非常直观,即使是初学者,也可以快速上手。
    274 94
    |
    11天前
    |
    数据采集 存储 弹性计算
    高并发Java爬虫的瓶颈分析与动态线程优化方案
    高并发Java爬虫的瓶颈分析与动态线程优化方案
    Java 数据库 Spring
    46 0
    |
    23天前
    |
    算法 Java
    Java多线程编程:实现线程间数据共享机制
    以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
    57 16

    推荐镜像

    更多