一、数据库
1. 子查询(嵌套查询)
1. 查询工资高于2号部门平均工资的员工信息
select avg(sal) from emp where dept_id=2;
select * from emp where sal>(select avg(sal) from emp where dept_id=2);
2. 查询工资高于程序员最高工资的员工信息
select max(sal) from emp where job='程序员';
select * from emp where sal>(select max(sal) from emp where job='程序员');
3. 查询工资最高的员工信息
select * from emp where sal=(select max(sal) from emp);
4. 查询和孙悟空相同工作的员工信息
select * from emp where job=(select job from emp where name='孙悟空') and name!="孙悟空";
5. 查询拿最低工资的员工同事们的信息(同事指同一部门)
select min(sal) from emp;
select dept_id from emp where sal=(select min(sal) from emp);
select * from emp where dept_id=(select dept_id from emp where sal=(select min(sal) from emp)) and sal!=(select min(sal) from emp);
2. 数值计算 + - * / %
1. 查询每个员工的姓名,工资和年终奖(5个月的工资)
select name,sal,5*sal 年终奖 from emp;
2. 给3号部门的员工每人涨薪5块钱
update emp set sal=sal+5 where dept_id=3;
二、关联
1. 关联关系
创建表的时候,表和表之间存在的业务关系.
有哪几种关系:
一对一: 有AB两张表,A表中的一条数据对应B表中的一条数据, 同时B表中的一条数据也对应A表中的一条数据.
一对多:有AB两张表,A表中的一条数据对应B表中的多条数据, 同时B表中的一条数据对应A表中的一条数据.
多对多:有AB两张表,A表中的一条数据对应B表中的多条数据, 同时B表中的一条数据也对应A表中的多条数据.
如果表之间存在关联关系,如何建立关系?
一对一: 在两张表的任意一张表中添加建立关系的字段指向另外一张表的主键
一对多: 在多的表中添加建立关系的字段指向另外一张表的主键
多对多: 新建一张关系表,表中至少有两个字段用于建立关系, 指向另外两张表的主键
2. 关联查询
同时从多张表中查询数据的方式称为关联查询
包括三种查询方式:
等值连接
内连接
外连接
3. 等值连接
格式: select 字段信息 from A,B where A.xxx=B.xxx(关联关系) and 其它条件
1. 查询每个员工的姓名\工资和对应的部门名
select e.name,sal,d.name
from emp e,dept d
where e.dept_id=d.id;
2. 查询工资高于2000的员工姓名,工资和对应的部门名和地址
select e.name,sal,d.name,loc
from emp e,dept d
where e.dept_id=d.id and sal>2000;
3. 查询程序员的部门地址
select distinct loc
from emp e,dept d
where e.dept_id=d.id and job="程序员";
4 内连接
等值连接和内连接的作用一样,查询的都是两个表的"交集数据"(存在关系的数据)
格式: select 字段信息 from A join B on A.x=B.x where 其它条件
1. 查询每个员工的姓名\工资和对应的部门名
select e.name,sal,d.name
from emp e join dept d on e.dept_id=d.id;
2. 查询工资高于2000的员工姓名,工资和对应的部门名和地址
select e.name,sal,d.name,loc
from emp e join dept d on e.dept_id=d.id where sal>2000;
3. 查询程序员的部门地址
select distinct loc
from emp e join dept d on e.dept_id=d.id where job="程序员";
5 外连接
外连接查询到的是一张表的全部和另外一张表的交集数据
格式: select 字段信息 from A left/right join B on A.x=B.x where 其它条件
insert into emp(name,sal) values("灭霸",5);
1. 查询所有的员工姓名和对应的部门名
select e.name,sal,d.name
from emp e left join dept d on e.dept_id=d.id;
2. 查询所有部门名和对应的员工姓名
select d.name,e.name
from emp e right join dept d on e.dept_id=d.id;
6. 关联查询总结
-
如果需要同时查询多张表的数据使用关联查询
-
如果查询到的是两张表的交集数据使用等值连接或内连接(推荐)
-
如果查询的是一张表的全部和另外一张表的交集则使用外连接
三、数据库连接
1. JDBC
-
Java DataBase Connectivity: Java数据库连接
-
JDBC是Sun公司提供的一套专门用于Java语言和数据库软件进行连接的API(Application Programma Interface) , Sun公司为了避免Java程序员每一种数据库软件都学习一套全选的方法, Sun公司通过JDBC接口将方法名固定好,各个数据库厂商根据此接口中的方法名写各自的实现类(驱动) , 这样的话对于Java程序员 不管连接什么数据库软件 方法名是一样的,即使某一天换了数据库软件 代码是不需要改变的,这样大大提高了开发效率.
-
如何通过JDBC和数据库软件进行连接并执行SQL语句
1. 创建Maven工程
2. 在pom.xml里面添加以下依赖
<!--dependency依赖 dependencies多个依赖-->
<dependencies>
<!-- 连接MySQL数据库的依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
</dependencies>
3. 创建Demo01.java ,添加main方法,在方法中添加以下代码
//1. 获取数据库连接对象 异常抛出
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/empdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false",
"root","root");
System.out.println("连接对象:"+conn);
//2. 创建执行SQL语句的对象
Statement s = conn.createStatement();
//3. 执行SQL语句 execute执行
s.execute("drop table jdbct1");
//4. 关闭资源
conn.close();
System.out.println("执行完成!");
Statement执行SQL语句的对象
-
execute("sql"); 此方法可以执行任意SQL语句, 推荐执行数据库相关和表相关的SQL语句
-
int row = executeUpdate("sql"); 此方法执行增删改 相关的SQL语句, 返回值表示生效的行数
-
ResultSet rs = executeQuery("sql"); 执行查询相关的SQL语句,查询到的结果装在ResultSet对象中.
2. DBCP
-
DataBaseConnectionPool数据库连接池
-
作用: 将连接重用,避免频繁的开关连接, 从而提高执行效率
-
如何使用DBCP?
-
找到 dbcp的依赖 赋值到工程的pom.xml里面
-
通过以下代码创建连接池,并从连接池对象中获取连接
-
//创建连接池对象
DruidDataSource dds = new DruidDataSource();
//设置连接数据库的信息
dds.setUrl("jdbc:mysql://localhost:3306/empdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false");
dds.setUsername("root");
dds.setPassword("root");
//设置初始连接数量
dds.setInitialSize(3);
//设置最大连接数量
dds.setMaxActive(5);
//从连接池中获取连接对象 异常抛出
Connection conn = dds.getConnection();
System.out.println("连接对象:"+conn);
四、数据库语句
1. SQL注入
-
用户往输入值的地方输入了SQL语句,导致原有SQL语句的逻辑发生改变,这个过程称为SQL注入
-
通过PreparedStatement带有预编译效果的执行SQL语句的对象,解决SQL注入问题
-
如何解决?
-
使用PreparedStatement,将编译SQL语句的时间点提前到创建对象时,此时编译用户输入的内容还没有在SQL语句中, 编译后可以理解为将SQL语句的逻辑锁死, 用户输入的内容只能以值的形式添加到原有SQL语句中,这样将不再影响原有SQL语句的逻辑,从而避免了SQL注入的问题.
-
select count(*) from user where username='tom' and password='123456';
select count(*) from user where username='abcd' and password='' or '1'='1'
2. SQL语句分类
-
DDL: 数据定义语言 包括数据库相关和表相关的SQL语句
-
DML: 数据操作语言,包括增删改查.
-
DQL: 数据查询语言,包括查询相关
-
TCL: 事务控制语言,和事务相关的SQL语句.
-
DCL:数据控制语言, 指用户相关和权限分配相关.
3. 数据类型
-
整数: int和bigInt bigInt等效Java中的long
-
浮点数: double(m,d) m代表总长度 d代表小数长度 , 25.444 m=5 d=3
-
字符串:
-
char(m): 固定长度, m=5 存"abc" 占5个 最大长度255
-
varchar(m): 可变长度,m=5 存"abc" 占3个 最大长度65535 内容少的用varchar
-
text(m):可变长度 最大长度65535 内容长的用text
-
-
时间类型:
-
date: 只能保存年月日
-
time: 只能保存时分秒
-
datetime: 年月日时分秒, 默认值为null, 最大值9999-12-31
-
timestamp(时间戳,通过保存距离1970年1月1日的毫秒数来实现时间记录的): 年月日时分秒, 默认值为当前系统时间 , 最大值2038-1-19
-
五、SpringBoot
1. SpringBoot简介
什么是服务器?
-
服务器就是一台高性能的电脑
什么是Web服务器?
-
就是在高性能电脑上安装了Web服务软件,比如安装了Tomcat
什么是Web服务软件?
-
Web服务软件是不具备任何业务功能的, 可以理解为容器,用来装实现具体业务功能的组件(组件指Servlet,而Controller的作用是将多个Servlet整合到了一个类文件中)
-
Web服务软件做了哪些事儿?
-
负责搭建底层的网络连接
-
负责根据客户端请求的静态资源路径找到静态资源文件并响应给客户端
-
负责根据客户端请求的动态资源路径找到对应Controller里面的方法并且执行
-
三大框架SSM
-
SpringMVC: 从第二阶段开始接触到第四阶段
-
Spring: 从第四阶段开始讲到最后
-
Mybatis:从第三阶段开始到最后
SpringBoot框架
-
如果不使用SpringBoot工程, 创建Maven工程,工程里面如果需要添加其它框架,需要在pom.xml文件中添加大量的依赖信息然后个别的框架还需要添加xml配置文件,在配置文件中还需要添加大量的配置信息, 这些操作都需要程序员独立完成, 使用SpringBoot创建工程时如果需要引入其它框架只需要在创建时打钩的方式引入各种框架即可, 大大提高了构建工程的效率
客户端发出请求的几种方式:
-
地址栏中输入请求地址后回车发出请求 同步
-
通过超链接发出请求 同步
-
通过form表单发出请求 同步
-
通过前端框架发出异步请求
服务器端接收请求参数的几种方式
-
通过HttpServletRequest对象获取参数 (以后基本不用)
-
通过在处理请求的方法参数列表处声明的方式接收参数
-
通过在处理请求的方法参数列表处声明自定义对象的方式接收参数
2. 创建SpringBoot工程
1. 创建工程时需要设置url路径为https://start.springboot.io
2. 创建工程的第一个页面中还需要修改以下内容
3. 勾选Web->Spring Web
4. 点击finish 创建完成
- 创建完工程后 看build页卡里面的内容 如果显示红色报错如下图,
- 通过刷新Maven解决上面错误
- 直到build页卡中显示如下图的绿色对勾说明工程创建并编译成功
- 如果刷新Maven后还是没有出现绿色对勾, 删除.m2文件夹下的repository文件夹 后再次刷新Maven,如果还是不能解决检查Maven是否配置成功, 删除工程重新换一个工程名再次从头创建
3. 工程中需要使用数据库的步骤
-
创建utils的包
-
把jdbc01工程中的DBUtils.java工具类复制到新工程的utils包下
-
在pom.xml中添加两个依赖
<!-- 连接MySQL数据库的依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
注册功能步骤:
-
创建springboot工程, 工程名1-1
-
创建index.html首页 首页里面添加注册超链接 href="/reg.html"
-
创建reg.html页面, 页面中form表单提交地址为/reg 三个文本框和一个提交按钮
-
创建controller.UserController在里面添加reg方法处理/reg请求,创建User实体类,然后声明在reg方法的参数列表处,用来接收传递过来的参数
-
创建utils包,把DBUtils复制到包下面
-
在pom.xml里面添加两个依赖 想着刷新maven
-
在UserController的reg方法中调用JDBC代码把传递过来的用户信息保存到数据库里面,并且给客户端响应:"注册成功!";
六、Mybatis框架
1. Mybatis简介
-
目前最流行的数据持久层框架
-
Mybatis框架可以根据用户通过注解或配置文件所指的的SQL语句自动生成对应的JDBC代码,从而提高了开发效率
-
如何使用?
-
创建SpringBoot工程
-
打钩三个:
-
Spring Web
-
Mybatis Framework
-
MySql Driver
-
-
-
创建完工程后 需要在application.properties配置文件中添加连接数据库的信息 否则工程无法正常启动 会报以下错误
-
配置文件中添加以下内容
2. 同步请求和异步请求
-
同步: 指单线程依次做几件事
-
异步:指多线程同时做几件事
-
同步请求: 指客户端只有一个主线程, 既要负责页面展示相关,也要负责发请求获取数据,由于只有一个线程当发请求时则不能显示页面(清空页面), 当把数据请求回来之后再把请求到的数据展示到页面中, 这样的话只能实现页面的整体改变,无法实现页面的局部改变
-
异步请求: 指客户端主线程负责页面展示相关, 由子线程发请求获取数据, 这样页面内容就不需要清空, 子线程得到数据后可以把数据直接展示到原页面中, 这个过程称为页面的局部改变,异步请求就是用来实现页面局部刷新的
客户端如何发出异步请求?
-
通过前端Axios框架发出异步请求
-
在页面中引入axios框架的js文件
-
https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js
3. Get 和 Post
-
Get: 请求参数在请求地址的后面 通过?分割 , 参数可见所以不能出现敏感信息, 参数的大小首先只能传递几k的数据
-
应用场景: 从服务器获取数据时用Get(比如各种查询), 删除数据一般也使用Get
-
-
Post:请求参数在请求体中, 没有大小限制
-
应用场景: 给服务器传递大量数据时使用Post请求,参数中包含敏感信息时
-
4. 前后端分离
-
前后端不分离,指在Controller中需要处理页面相关代码,就是将前端代码和后端代码混在一起写,如果存在手机端的话后端程序员需要准备另外一个Controller只提供数据(因为手机端是不需要html页面的) 这样对于后端Java程序员而言需要准备两套实现同一业务的代码,这样工程中会有大量重复代码
-
前后端分离,指Controller中只提供数据, 不管前端是浏览器还是手机一视同仁只返回数据, 这样浏览器客户端需要的页面则需要另外一次请求,这样后端程序员只需要写一套Controller代码即可
-
由于前后端分离后, 浏览器客户端是先请求页面,然后页面加载之后再请求数据,把请求的数据在展示到页面中,这个过程是页面局部刷新的需求,所以只能通过异步请求实现,所以以后所开发的工程只要是前后端分离则请求数据只能通过异步请求.
5. 后端的MVC
-
将实现一个业务功能的代码分为三部分
-
V:View视图 指前端页面相关代码 ,前端MVC是将此部分代码再划分为三部分
-
C:Controller控制器, 对应Controller代码
-
M:Model模型 指数据模型相关, 指Mapper相关代码
搭建页面View->处理请求Controller->操作数据Model(Mapper)
6. JSON
-
轻量级的数据交换格式
-
作用: 将复杂的数据封装到字符串中,然后进行网络数据传输
-
客户端向服务器发请求获取数据时,如果服务器返回给客户端的内容为一个对象或者一个集合,此时SpringMVC框架会自动将对象或集合转成JSON格式的字符串,然后将字符串转成二进制数据进行网络传输, 客户端接收到数据后先将二进制数据转回JSON格式的字符串然后Axios框架再将JSON格式的字符串转成数组.
总结
本篇的内容为数据库进阶知识,包括(关联查询、数据库连接、数据语句)、SpringBoot、MyBatis框架等知识。