MySQL启动时出现系统错误5.拒绝访问的解决办法
- 以管理员身份运行cmd
 - 进入MySQL安装目录下的bin目录
 - 执行net start mysql 或者mysqld –console
 
定义了所有操作所有关系型数据库的规则(接口),各个数据库厂商实现接口实现数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
简单理解:假如现在有一个Person接口,其中有一个方法eat,Worker实现类继承这个接口。Person p = new Worker(); p.eat(); 这里执行的是Worker中实现了的方法。JDBC也是类似,编程时用接口类型调用方法,真正执行的是导入的jar包中实现类对应的实现方法。
下载对应MySQL厂商的驱动jar包:https://dev.mysql.com/downloads/connector/j/
Select Operating System:Platfrom Independent

找到mysql-connector-java-8.0.22.jar

为方便管理,先将jar包复制到项目下面的libs目录下,然后右键libs点击Add as Library






1  | mysqldump -uroot -proot test > a.sql;-- 自定义sql文件路径  | 
create:创建
1  | #create database if not exists 数据库名;  | 
Retrieve:查询
show databases;show create database 数据库名; Delete:删除
drop database if exist 数据库名;update:修改
修改数据库的字符集
alter database 数据库名 character set 编码格式;
使用数据库
查询当前正在使用的数据库名称
select database();
创建
create tables 表名(
 列名 数据类型1,
 列名 数据类型2
);
数据类型
int :整数类型
double:小数类型
date:只包含年月日yyyy-MM-dd
datetime:包含年月日时分秒:yyyy-MM-dd HH:mm:ss
timestamp:时间戳,如果不给字段赋值,则系统将自动赋值当前的系统时间。且要设置默认值
alter table 表名 MODIFY 列名 TIMESTAMP not null DEFAULT CURRENT_TIMESTAMP; # 这里是修改的时候设置的默认值CURRENT_TIMESTAMP
varchar:字符串
查询
查询某个数据库中所有的表名称
show tables;
查看表结构
desc 表名;
更新
修改表名
alter table 表名 rename to 新表名
修改表的字符集
查看表的字符信息
show create table 表名;
修改
alter table character set 字符集;
添加一列
alter table 表名 add gender varchar(10);
修改列名称 类型
alter table 表名 modify 列名 新类型;  只改类型
alter table 表名 change 旧列名 新列名 新类型;
删除列
alter table 表名 drop 列名;
删除
drop table if exists 表名;
复制表
create table 表名 like 被复制的表名;
添加数据
insert into 表名(列名1,.......,列名n) values(值1,......值n);
insert into 表名 values(值1,......值n); # 需要为每一列都添加值
删除数据
delete from 表名 [where 条件];
删除表中所有记录
truncate table 表名; # 删除表,然后再创建一样S的空表delete from 表名; # 不推荐使用,因为是有多少条记录执行多少次删除修改数据
update 表名 set 列名1=值1,.....,列名n=值n [where 条件];
不加where将会把表中该列所有的数据修改
基础查询
1  | /*  | 
条件查询
运算符:
< <= > >= = <> !=
BETWEEN…AND
IN(集合)
LIKE 模糊查询
占位符
_ (下划线):单个任意字符
%: 任意多个字符
IS NULL
and 或者&&
or 或者||
not 或者 !
排序查询:升序:ASC(默认),降序:DESC
1  | -- order by 排序字段1 排序方式1,排序字段2 排序方式2...  | 
聚合函数:count、max、min、sum、avg
1  | -- select count(列名) from 表名; -- 排除了空值得出的记录个数  | 
分组查询:分组之后查询的字段:分组字段、聚合函数
1  | -- group by 分组字段  | 
where和having的区别:
分页查询
MySQL下:limit 开始的索引,每页查询的条数
1  | -- 每页显示两条记录  | 
主键约束:primary key
非空约束:not null
唯一约束:unique
1  | create table stu(  | 
外键约束:foreign key
创建表时添加外键
删除外键
创建表之后添加外键
级联操作 on update cascade on delete cascade 
级联删除\级联更新:restrict、cascade、set null、no action
1  | -- 拆分为两张表 emp和department  | 
多表之间的关系
一对一:
一个人只有一个身份证
实现方式:可以任意一方添加唯一外键指向另一方的主键
一对多
多对多
数据库设计的范式
| dep_id | dep_name | dep_location | 
|---|---|---|
| 1 | 研发部 | 广州 | 
| 2 | 销售部 | 深圳 | 
| id | name | age | dep_id | salary | 
|---|---|---|---|---|
| 1 | 张三 | 21 | 1 | 25 | 
| 2 | 王五 | 21 | 2 | 20 | 
内连接
1  | -- 隐式内连接  | 
外连接
1  | -- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门则不显示  | 
子查询
1  | -- 子查询的结果是单行单列  | 
事务的概念
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。在MySQL中执行一条DML语句默认提交一次事务,而Oracle默认手动提交事务。
1  | select @@autocommit;-- 1代表自动提交,0代表手动提交  | 
操作
开始事务:start transaction
回滚:rollback
提交:commit
1  | start TRANSACTION;  | 
事务的四大特征
事务的隔离级别
多个事务之间是隔离的、相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题
存在问题
隔离级别:隔离级别从小到大安全性越来越高,但是效率越来越低
数据库查询隔离级别
1  | select @@transaction_isolation;  | 
数据库设置隔离界别
1  | set global transaction_isolation ='REPEATABLE-READ';  | 
管理用户
添加用户
删除用户
修改用户密码
查询用户
1  | -- 切换数据库 mysql  | 
权限管理
查询权限、授予权限、撤销权限
1  | -- 查询权限  | 
mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password, 客户端版本低的话加密规则和mysql8的加密规则不一样,因此会连接失败。
升级SQLyong/navicat客户端版本(推荐)
修改MySQL加密规则(不推荐,如果暂时连接一下,可以先修改为mysql_native_password,然后复原为caching_sha2_password)
1  | ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';  | 
作用
编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】 javadoc
代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】
1  | //压制警告,关于AnnoDemo的所有代码警告都不显示  | 
格式
元注解 public @interface 注解名称{ 属性列表 }
1  | public MyAnno {  | 
java.lang.annotation.Annotation1  | E:\JAVA\javase\study1\src\hxx\Annotation>javac MyAnno.java  | 
属性:接口中的抽象方法
属性的返回值类型:
定义了属性,在使用时需要给属性赋值
1  | public MyAnno {  | 
元注解:描述注解的注解
@Target :描述注解能够作用的位置
@Retention:描述注解被保留的阶段
@Document:描述注解是否被抽取到api文档中
@Inherited:描述注解是否被子类注解
1  | //可用于类  | 
1  | 
  | 
1  | public class Calculator {  | 
1  | 
  | 
1  | /*  | 
反射是框架设计的灵魂
框架:半成品软件。可以在框架的基础上进行软件开发,简化编码
反射:将类的各个组成部分封装为其他对象,这就是反射机制
1  | public class ReflectDemo {  | 
1  | public static void main(String[] args) throws Exception {  | 
1  | public static void main(String[] args) throws Exception {  | 
1  | public static void main(String[] args) throws Exception {  | 
1  | System.out.println(personClass.getName()); //获取类名  | 
需求:写一个“框架”,可以帮我们创建任意类的对象,并且执行其中任意方法
实现
1  | public class Person {  | 
1  | //配置文件为pro.properties  | 
1  | public class ReflectTest {  | 
测试分类
Junit使用:核心思想:调用被测方法,使用断言
定义一个测试类(测试用例)
测试类名:被测试的类名+Test
包名:xxx.xxx.test
定义测试方法:可以独立运行
给方法加注解@Test
导入Junit的依赖环境
@before 修饰的方法在测试方法前会自动执行
@After 修饰的方法在测试方法后会自动执行行
1  | public class Calculator {  | 
1  | public class CalculatorTest {  |