day01_数据库基础
课前回顾:
1.Junit单元测试,可以单独执行一个方法去测试
2.@Test @Before @After
3.类加载器:负责将class文件加载到内存
BootStrapClassLoader:核心类
ExtClassLoader:扩展类
AppClassLoader:自定义类和第三方jar包
4.类加载器机制:双亲委派 缓存机制
一个类只加载一次
5.类的加载时机:
a.new对象 b.new子类 c.执行main方法 d.调用静态成员 e.反射
6.反射:
a.Class对象:jvm自动为加载到内存的class文件在堆中创建的对象
b.class类:描述Class对象的类就叫做Class类
7.使用:
a.getConstructors:获取所有public的构造
b.getConstructor(参数类型的class对象):获取指定的public的构造
c.newinstance:创建对象
d.getDeclaredConstructors:获取所有的构造包括private
e.getDeclaredConstructor(参数类型的class对象):获取指定的构造
f.setAccessible(true):解除私有权限
g.getMethods():获取所有public的方法
h.getMethod(方法名,参数class对象):获取指定的成员方法
8.注意:
将来开发,将配置文件放到resources目录下
用类加载器读取: 当前类.class.getClassLoader().getReourceAsStream("文件名")
9.注解:
a.定义:
public @interface 注解名{
数据类型 属性名(),
数据类型 属性名() default 值;
}
b.使用:
@注解名(属性名 = "属性值"....)
c.注解解析:
isAnnotationPresent(注解的class对象)-> 判断指定位置上是否有指定的注解
getAnnotation(注解的class对象):获取指定的注解
10.元注解:管理注解的注解
@Target:控制自定义注解能放到什么位置上
@Retention:控制自定义注解的生命周期
今日重点:
1.会安装mysql服务端和客户端
2.会使用sql语句创建数据库,删除数据库
3.会使用sql语句创建表,删除表
4.会使用sql语句对表中的数据进行增,删,改,查
5.会在创建表的时候加约束
第一章.数据库介绍
1.数据库介绍
1.什么是数据库
存储数据的仓库
2.作用:
永久存数据->会将数据按照指定的格式存储,方便我们程序员直接对指定的数据进行增删改查
2.数据库管理系统
指的是一种操作和管理数据库的大型软件,用于建立,使用和维护数据库,对数据库进行统一的管理和控制,以保证数据库的安全性和完整性,用户通过数据库管理系统访问数据库的数据
3.数据库表
1.数据库中要创建很多张表,而表才是我们真正存储数据的地方
2.表的组成部分:
a.表名
b.字段名->每列的字段叫啥
c.每一个字段都有对应的数据类型
3.表和java中的javabean对应
表名->类名
字段->属性
表中的每一行数据->对象
4.数据库表和Java类的对应关系
第二章.mysql8安装
1.MySQL数据库安装
略
2.数据库服务启动和停止
MySQL软件的服务器端必须先启动,客户端才可以连接和使用使用数据库。
2.1.方式1:图形化方式
* 计算机(点击鼠标右键)==》管理(点击)==》服务和应用程序(点击)==》服务(点击)==》MySQL57(点击鼠标右键)==》启动或停止(点击)
* 控制面板(点击)==》系统和安全(点击)==》管理工具(点击)==》服务(点击)==》MySQL57(点击鼠标右键)==》启动或停止(点击)
* 任务栏(点击鼠标右键)==》启动任务管理器(点击)==》服务(点击)==》MySQL57(点击鼠标右键)==》启动或停止(点击)
2.2.方式2:命令方式
启动 MySQL 服务命令:
net start MySQL80
停止 MySQL 服务命令:
net stop MySQL80
3.配置数据库环境变量
3.1.方式1:使用MYSQL_HOME
环境变量名 | 操作 | 环境变量值 |
---|---|---|
MYSQL_HOME | 新建 | D:\ProgramFiles\mysql\MySQLServer5.7 |
path | 编辑 | %MYSQL_HOME%\bin |
3.2.方式2:直接配置mysql的bin路径
环境变量名 | 操作 | 环境变量值 |
---|---|---|
path | 编辑 | D:\ProgramFiles\mysql\MySQLServer5.7\bin |
4.数据库服务端安装之后登陆
1.win+R-->调出黑窗口
2.登录命令:
a.mysql -u用户名 -p密码->回车 -> 缺点,在登录的时候密码显示出来了
b.mysql -u 用户名 -p ->回车
输入密码(密码将显示成小星星)
问题:输入mysql命令出现"不是内部或外部命令"
原因:环境变量没配置
解决:将mysql安装路径下的bin目录复制到环境变量下的path中
如果path下有,还出现了"不是内部或者外部命令",干掉重新配置一下
问题:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
原因:输入的mysql用户名或者密码有问题
问题:ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
原因:mysql服务没有启动
5.黑窗口乱码问题(可以忽略)
1.在黑窗口中默认编码为GBK,而我们mysql为UTF-8,所以在黑窗口中操作中文就会乱码
2.解决:
a.在黑窗口中输入:set names gbk ->临时将mysql编码修改成gbk
b.在mysql安装路径下修改my.ini文件,将涉及到编码的地方都修改了,重启服务所有地方生效。
在路径:D:\ProgramFiles\mysql\MySQLServer8\Data 找到my.ini文件
修改内容1:
找到[mysql]命令,大概在63行左右,在其下一行添加
default-character-set=utf8
修改内容2:
找到[mysqld]命令,大概在76行左右,在其下一行添加
character-set-server=utf8
collation-server=utf8_general_ci
修改完毕后,重启MySQL57服务
show variables like 'character_%';
show variables like 'collation_%';
6.mysql客户端(可视化工具)安装
例如:Navicat Preminum,SQLyog 等工具
6.1.SQLyog
略
通过黑窗口先登录数据库
处理无法连接:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
6.2.Navicat
略
第三章.sql语句
1.sql语言介绍
1.概述:是一种数据库认识的语言,是所有关系型数据库的一个标准
2.注意:关系型数据库都要遵循这个sql语句规范,但是每一款关系型数据库都要自己的特点
这种具有自己特有的sql语法,叫做数据库方言
2.sql语言分类
- 数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等
- 数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行操作。关键字:insert,delete,update等
- 数据控制语言:简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户。
- 数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录。关键字:select,from,where等
3.sql语句的通用语法
1.- SQL语句可以单行或多行书写,以分号结尾
2.- 可使用空格和缩进来增强语句的可读性:基本上一个单词就一个空格
3.- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
- 例如:SELECT * FROM user。
4.- 同样可以使用/**/的方式完成注释 #
/*
我是一个注释
*/
#我也是一个注释
-- 我也是一个注释
4.sql中的数据类型
类型名称 | 说明 |
---|---|
int(整数长度) | 整数类型 |
double | 小数类型 |
decimal(m,d) | 指定整数位与小数位长度的小数类型 |
date | 日期类型,格式为yyyy-MM-dd,包含年月日,不包含时分秒 2020-01-01 |
datetime | 日期类型,格式为 YYYY-MM-DD HH:MM:SS,包含年月日时分秒 到9999年 |
timestamp | 日期类型,时间戳 从1970年到2038年 |
varchar(字符串长度) | 文本类型, M为0~65535之间的整数 |
我们先学 mysql
第四章.mysql中语句
1.DDL之数据库操作:database
1.1 创建数据库
1.关键字:create database
2.语法:
create database 数据库名 charset utf8;
注意:
1.mysql默认编码,拉丁文,latin-1,所以创建库的时候,指定一下UTF8
2.如果创建数据库的时候忘记加utf8了,可以后改
3.在写sql语句的时候,如果库名,表名,列名和sql语句的关键字冲突了,可以用``包裹
1.2 查看数据库(了解)
#查看所有数据库
show databases;
#查看指定数据库的定义信息
show create database 数据库名
#查看所有数据库
SHOW DATABASES;
#查看指定数据库的定义信息
SHOW CREATE DATABASE 220227_java1;
1.3 删除数据库
1.关键字:drop
2.语法:
drop database 数据库名字
DROP DATABASE 220227_java1;
1.4 使用数据库(切换数据库)
use 数据库名;
USE 220227_java1;
1.5 鼠标点击:创建数据库_删除数据库
2.DDL之表操作->table
2.1 创建表
1.关键字:create table
2.语法:
create table 表名(
列名 数据类型(长度) [约束],
列名 数据类型(长度) [约束],
列名 数据类型(长度) [约束]
);
4.注意:
a.如果定义完一个列之后,后面还有其他的列,需要加,
b.如果定义最后一个列了,就不用加,
c.一张表应该有一个主键(约束), primary key
当一列设置成主键了,此列中的数据唯一,不能重复
一个主键可以代表一条数据(好比是身份证)
CREATE TABLE category(
cid INT PRIMARY KEY,
cname VARCHAR(10)
);
2.3 查看表(了解)
#查看所有表
show tables;
#查看表结构
desc 表名;
#查看所有表
SHOW TABLES;
#查看表结构
DESC category;
2.4 删除表
1.关键字:drop table
2.语法:
drop table 表名
DROP TABLE category;
2.5修改表结构(了解)
alter table 表名 add 列名 类型(长度) [约束];
作用:添加列.
ALTER TABLE category ADD `desc` VARCHAR(100);
alter table 表名 modify 列名 类型(长度) [约束];
作用:修改列的类型,长度及约束.
ALTER TABLE category MODIFY `desc` VARCHAR(10);
alter table 表名 change 旧列名 新列名 类型(长度) [约束];
作用:修改表_修改列名.
ALTER TABLE category CHANGE `desc` `miaoshu` VARCHAR(10);
alter table 表名 drop 列名;
作用:修改表_删除列.
ALTER TABLE category DROP `miaoshu`;
rename table 表名 to 新表名;
作用:修改表名
RENAME TABLE category TO kind;
RENAME TABLE kind TO category;
3.DML之数据操作语言
3.1 插入数据
1.关键字:insert into values
2.语法:
insert into 表名(列名,列名) values (具体的值,具体的值)
/*
insert into 表名(列名,列名) values (具体的值,具体的值)
*/
INSERT INTO category (cid,cname) VALUES (1,"蔬菜");
/*
1.如果操作表中的数据,对应的类为varchar类型,那么操作数据时,不建议用双引号,推荐使用单引号''
2.原因:
将来我们肯定不是在mysql中直接写sql语句,我们写的sql应该放到java中
然后调用java中的api去执行我们写的sql语句,从而操作mysql中的数据
3.所以:如果将sql语句放到java语句中怎么写:写到String中
INSERT INTO category (cid,cname) VALUES (1,"蔬菜");
String sql = "INSERT INTO category (cid,cname) VALUES (1,"蔬菜");";
以上代码这样写不行
4.应该怎么写? 将sql中的""改成''
INSERT INTO category (cid,cname) VALUES (1,'蔬菜');
String sql = "INSERT INTO category (cid,cname) VALUES (1,'蔬菜');"
*/
INSERT INTO category(cid,cname) VALUES (2,'水果');
/*
其他insert方式:不用直接指定列名,直接写要存的数据
要求存储的数据要对应所有的列
*/
INSERT INTO category VALUES (3,'玩具');
/*
批量添加
insert into 表名(列名,列名) values (具体值,具体值),(具体值,具体值),(具体值,具体值),(具体值,具体值)
*/
INSERT INTO category VALUES (4,'服装'),(5,'箱包'),(6,'电脑');
3.2 删除数据
1.关键字:delete from
2.语法:
delete from 表名-> 一次全删除
delete from 表名 where 条件-> 按照条件删除
3.条件:java一样
java mysql
> >
< <
>= >=
<= <=
== =
!= != 或者 <>
/*
delete from 表名-> 一次全删除
*/
DELETE FROM category;
-- 删除cid为1的记录
DELETE FROM category WHERE cid = 1;
-- 删除cid>=5的记录
DELETE FROM category WHERE cid >= 5;
-- 删除cid不等于3的记录
DELETE FROM category WHERE cid != 3;
DELETE FROM category WHERE cid <> 3;
DELETE FROM category WHERE NOT(cid = 3);
3.3 修改数据
1.关键字:update set
2.语法:
update 表名 set 列名 = 值 -> 是将指定的列所有的数据全部修改
update 表名 set 列名 = 值 where 条件 -> 根据条件修改数据
-- 修改数据
UPDATE category SET cname = '化妆品';
-- 将表中的蔬菜改成家具
UPDATE category SET cname = '家具' WHERE cname = '蔬菜';
-- 将cid为6的数据改成手机
UPDATE category SET cname = '手机' WHERE cid = 6;
-- 将cid不等于1的canme都改成平板
UPDATE category SET cname = '平板' WHERE cid<>1;
第五章.约束
1.主键约束
1.主键约束:primary key
2.主键列中的数据有什么特点:
a.数据唯一,不能重复
b.不能为NULL
c.一个主键相当于一个人的身份证,代表一整条数据
3.注意:
每张表中都应该有一个主键列,代表一条数据
1.1.添加方式1:在创建表时,在字段后面直接指定(重点)
/*
在创建表的时候直接指定主键约束
*/
CREATE TABLE category(
cid INT PRIMARY KEY,
cname VARCHAR(10)
);
1.2.添加方式2:在constraint约束区域,去指定主键约束
1.什么是constraint约束区域:
最后一列后面和右半个小括号前面的区域
2.格式:
[constraint 名字] primary key (字段名)
3.注意:[constraint 名字]:可写可不写
-- [constraint 名字] primary key (字段名)
CREATE TABLE category(
cid INT,
cname VARCHAR(10),
PRIMARY KEY (cid)
);
1.3.添加方式3:通过修改表结构的方式
1.格式:ALTER TABLE 表名 ADD [CONSTRAINT 名称] PRIMARY KEY (字段列表)
2.注意:[CONSTRAINT 名称]可以省略不写
/*
1.格式:ALTER TABLE 表名 ADD [CONSTRAINT 名称] PRIMARY KEY (字段列表)
2.注意:[CONSTRAINT 名称]可以省略不写
*/
CREATE TABLE category(
cid INT,
cname VARCHAR(10)
);
ALTER TABLE category ADD PRIMARY KEY (cid);
INSERT INTO category (cid,cname) VALUES (1,'蔬菜');
INSERT INTO category (cid,cname) VALUES (1,'水果');-- 错误,和上面的主键数据重复
INSERT INTO category (cid,cname) VALUES (NULL,'箱包');-- 错误,主键列中的数据不能是NULL
1.4.联合主键
1.什么是联合主键:
多个列结合称之为是一个主键
2.特点:
数据不能完全一样,不能为NULL
CREATE TABLE person(
firstname VARCHAR(10), -- 姓
lastname VARCHAR(10), -- 名
address VARCHAR(10),-- 地址
city VARCHAR(10), -- 城市
PRIMARY KEY (firstname,lastname)
);
1.5.删除主键约束
ALTER TABLE 表名 DROP PRIMARY KEY->删除主键约束
#ALTER TABLE persons DROP PRIMARY KEY->删除主键约束
alter table persons drop primary key;
2.自增长约束
2.1.基本操作
1.关键字:
auto_increment
2.使用:一般和primary key 一起使用
3.注意:
a.主键能代表一条数据
b.自增长列,只能自动维护此列中的数据,可以自动编号,但是不能代表一条数据
CREATE TABLE category(
cid INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(10)
);
CREATE TABLE category(
cid INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(10)
);
-- 给自增长的列添加数据
INSERT INTO category (cname) VALUES ('手机');
-- 主键自动维护了,所以我们添加数据时,不用特意指定主键列了
INSERT INTO category (cname) VALUES ('服装'),('电脑');
-- 删除cid为6的数据
DELETE FROM category WHERE cid = 6;
-- 再次添加-> 会从被删除的那个编号开始,继续往后编号
INSERT INTO category (cname) VALUES ('鼠标');
truncate table 表名-> 清空表数据,摧毁表结构
TRUNCATE TABLE category;
/* 自增长是一个约束,操作起来和其他约束不太一样 如果自增长约束和主键约束合起来使用想删除 先删除自增长约束 再删除主键约束 */ drop table category; create table category( cid int primary key auto_increment, cname varchar(100) ); alter table category modify cid int; alter table category drop primary key;
2.2.truncate和delete区别
在自增长的前提下:
a.delete之后,重新添加数据,自增长列不会重新编号
b.truncate之后,属于DDL,摧毁表结构,删除表记录,重新添加数据,自增长列会重新编号
3.非空约束
1.关键字: NOT NULL
2.特点:
此列的数据不能为NULL
CREATE TABLE product(
pid INT PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(10) NOT NULL
);
INSERT INTO product (pname) VALUES ('Iphone13');
/*
String s1 = null -> 代表s1为null,null代表数据不存在
String s2 = "null" -> s2是有数据的,字符串内容为null
String s3 = "" -> s3确确实实是一个字符串,只不过双引号中没内容
*/
INSERT INTO product (pname) VALUES (NULL); -- 不行,pname约束为非空约束,不能是NULL 好比是String s1 = null
INSERT INTO product (pname) VALUES ('null');-- String s2 = "null" 可以添加
INSERT INTO product (pname) VALUES ('');-- String s3 = "" 可以添加
4.唯一约束
1.关键字:UNIQUE
2.特点:
UNIQUE修饰的列中的数据不能重复
CREATE TABLE product(
pid INT PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20)UNIQUE
);
TRUNCATE TABLE product;
INSERT INTO product (pname) VALUES ('苹果13');
INSERT INTO product (pname) VALUES ('华为');
INSERT INTO product (pname) VALUES ('苹果13');-- 错误,因为pname列有唯一约束,数据不能一样
唯一约束和主键约束有区别:
1.相同点:
数据都应该是唯一的
2.不同点:
a.主键约束:一个表中只有一个主键
b.唯一约束:一个表中可以有多个列为唯一约束
删除唯一约束:
ALTER TABLE persons DROP INDEX 名称 [名称是CONSTRAINT后面的名称]
第六章.简单查询
1.数据准备
#创建商品表:
create table product(
pid int primary key,
pname varchar(20),
price double
);
INSERT INTO product(pid,pname,price) VALUES(1,'联想',5000);
INSERT INTO product(pid,pname,price) VALUES(2,'海尔',3000);
INSERT INTO product(pid,pname,price) VALUES(3,'雷神',5000);
INSERT INTO product(pid,pname,price) VALUES(4,'JACK JONES',800);
INSERT INTO product(pid,pname,price) VALUES(5,'真维斯',200);
INSERT INTO product(pid,pname,price) VALUES(6,'花花公子',440);
INSERT INTO product(pid,pname,price) VALUES(7,'劲霸',2000);
INSERT INTO product(pid,pname,price) VALUES(8,'香奈儿',800);
INSERT INTO product(pid,pname,price) VALUES(9,'相宜本草',200);
INSERT INTO product(pid,pname,price) VALUES(10,'面霸',5);
INSERT INTO product(pid,pname,price) VALUES(11,'好想你枣',56);
INSERT INTO product(pid,pname,price) VALUES(12,'香飘飘奶茶',1);
INSERT INTO product(pid,pname,price) VALUES(13,'果9',1);
2.简单查询
1.关键字:select from where
2.语法:
select 列名,列名 from 表名 [where条件]
select * from 表名-> 查询表中所有列的数据 * 代表的是查询结果展示所有的列
select 列名 from 表名-> 查询指定这一列的数据 最终查询结果只展示指定的一列
select 列名 from 表名 where 条件-> 按照指定的条件查询数据
3.注意:
a.select后面写多少列,查询结果就展示多少列的数据
写哪些列,查询结果就展示哪些列的数据
b.查询出来的结果是一张伪表,这个表的数据是只读的,不能动
-- 查询 product 表中所有的数据
SELECT * FROM product;
-- 查询商品名和商品价格
SELECT pname,price FROM product;
/*
查询的过程中,可以给表起别名
as 别名
注意: as可以省略
给表起别名,不是用来看的,而是后面用来调用字段的
*/
SELECT * FROM product p;
/*
给列起别名
原列名 as 别名 -> as可以省略
*/
SELECT pname '商品名', price '价格' FROM product;
/*
去重复值
关键字: distinct(列名)
*/
SELECT DISTINCT(price) FROM product;
/*
查询之后,可以给指定的列做计算
将所有商品的价格+10后展示
*/
SELECT pname,price+10 'newPrice' FROM product;
3.条件查询
比较运算符 | < <= >= = <> | 大于、小于、大于(小于)等于、不等于 |
---|---|---|
BETWEEN …AND… | 显示在某一区间的值(含头含尾) | |
字段 IN(set) | 显示在in列表中的值,例:in(100,200) 查询id为1,3,7的商品: id in(1,3,7) | |
LIKE ‘张pattern’ | 模糊查询,Like语句中,% 代表零个或多个任意字符,_ 代表一个字符, 例如:first_name like '_a%'; 比如:查询姓张的人:name like ‘张%’ 查询商品名中带香的商品: pname like ‘%香%’ 查询第二个字为想的商品: like ‘想%' 查询商品名为四个字的商品:like '___’ | |
IS NULL | 判断是否为空 | |
逻辑运行符 | and (与) | 多个条件同时成立 全为true,整体才为true |
or(或) | 多个条件任一成立 有真则真 | |
not(非) | 不成立,例:where not(salary>100); |
-- 查询商品名为'花花公子'的商品所有信息
SELECT * FROM product WHERE pname = '花花公子';
-- 查询价格为800的商品
SELECT pname,price FROM product WHERE price = 800;
-- 查询商品价格大于60元的所有商品信息
SELECT * FROM product WHERE price>60;
-- 查询商品价格在200-1000之间的所有商品信息
SELECT * FROM product WHERE price>=200 AND price<=1000;
SELECT * FROM product WHERE price BETWEEN 200 AND 1000;
SELECT * FROM product WHERE price BETWEEN 1000 AND 200; -- 不行,小的放前面,大的放后面
-- 查询商品价格是200或者800的商品
SELECT * FROM product WHERE price = 200 OR price = 800;
SELECT * FROM product WHERE price IN (200,800);
-- 查询以'香'开头的商品
SELECT pname,price FROM product WHERE pname LIKE '香%';
-- 查询含有'霸'的商品
SELECT pname,price FROM product WHERE pname LIKE '%霸%';
-- 查询商品名为NULL的
SELECT * FROM product WHERE pname IS NULL;
-- 查询商品名不为NULL的
SELECT * FROM product WHERE pname IS NOT NULL;
4.排序查询
1.关键字:order by desc|asc
2.语法:
select 列名 from 表名 order by 排序字段 asc|desc-> 查询之后要指明对哪一列进行排序
asc:升序(默认)
desc:降序
3.问题:先查询还是先排序
先查询,后排序
而且中间不管加啥语法,都是最后排序
书写sql语句关键字的顺序
select
from
where
group by
having
order by
执行顺序:
from
where
group by
having
select
order by
先定位到要查询哪个表,然后根据什么条件去查,表确定好了,条件也确定好了,开始利用select查询
查询得出一个结果,在针对这个结果进行一个排序
-- 使用价格排序(降序)
SELECT * FROM product ORDER BY price DESC;
-- 使用价格排序(升序)
SELECT * FROM product ORDER BY price ASC;
SELECT * FROM product ORDER BY price;
-- 显示商品的价格(去重复),并排序(降序)
SELECT DISTINCT(price) FROM product ORDER BY price DESC;