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
![](https://reborn-photo-url.oss-cn-beijing.aliyuncs.com/oss:/hxx_photo/add as liabrary.png)
![](https://reborn-photo-url.oss-cn-beijing.aliyuncs.com/oss:/hxx_photo/add as liabrary2.png)
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.Annotation
1 | 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 { |