Javaweb学习笔记(二)



第二章 springboot

一、Maven

1、定义:Apache Maven 是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建。
在这里插入图片描述

2、作用
(1) 方便的依赖管理
(2) 统一的项目结构
(3) 标准的项目构建流程
3、创建Maven项目
在这里插入图片描述
4、Maven坐标
(1) 定义:Maven 中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置。使用坐标来定义项目或引入项目中需要的依赖
(2) Maven 坐标主要组成
①groupld: 定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
②artifactld:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
③version:定义当前项目版本号
5、Maven依赖管理
依赖坐标信息:https://mvnrepository.com/
(1) 配置依赖-当前项目运行所需要的iar包,一个项目中可以引入多个依赖
① 在 pom.xml 中编写 < dependencies > 标签
② 在< dependencies > 标签中使用 < dependency > 引入坐标
③ 定义坐标的 groupld,artifactld,version
④ 点击刷新按钮,引入最新加入的坐标
(2) 依赖传递 -依赖具有传递性

① 直接依赖:在当前项目中通过依赖配置建立的依赖关系
② 间接依赖: 被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
③ 排除依赖:排除依赖指主动断开依赖的资源,被排除的资源无需指定版本

<dependencies>
	<dependency>
		<groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
        <scope>test</ scope >
        <!-- 排除依赖 -->
     	<exclusions>
     		<exclusion>
				<groupId>junit</groupId>
            	<artifactId>junit</artifactId>
        	</exclusion>
      	</exclusions>
	</dependency>
</dependencies>

(3) 依赖范围 -依赖的jar包一般可以在任何地方使用,通过 scope>…</ scope >设置其作用范围
① 主程序范围有效。(main文件夹范围内)
② 测试程序范围有效。 (test文件夹范围内)
③ 是否参与打包运行。(package指令范围内)
在这里插入图片描述
(4) 生命周期-Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统一
Maven中有3套相互独立的生命周期,每套生命周期包含一些阶段 (phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。
① clean:清理工作
② default:核心工作,如: 编译、测试、打包、安装、部署等
③ site:生成报告、发布站点等
在这里插入图片描述
在这里插入图片描述
5、分模块设计:将项目按照功能拆分成若干个子模块,方便项目的管理维护、扩展,也方便模块间的相互调用,资源共享。通过maven连接起来。
6、继承
(1) 定义:继承描述的是两个工程间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承。
(2) 作用:简化依赖配置、统一管理依赖
(3) 实现:
① 创建maven模块 tlias-parent,该工程为工程,设置打包方式pom(默认jar)

<!--每个springboot的父工程是spring-boot-starter-parent,让父工程继承
spring-boot-starter-parent再让子工程继承父工程-->
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.7.17</version>
	
	<relativePath/> 
</parent>
<packaging>pom</packaging>

② 在子工程的pom.xml文件中,配置继承关系。

<!--relativePath指定父工程的pom文件的相对位置(如果不指定,将从本地仓库/远程仓库查找该工程)-->
<parent>
	<groupId>com.itheima</groupId>
	<artifactId>tlias-parent</artifactId>
	<version>1.0-SNAPSHOT</version>
	<relativePath>../tlias-parent/pom.xml</relativePath> 
</parent>

③ 在父工程中配置各个工程共有的依赖(子工程会自动继承父工程的依赖)。在这里插入图片描述
(4) 工程打包方式
① jar: 普通模块打包,springboot项目基本都是jar包 (内嵌tomcat运行)
② war:普通web程序打包,需要部署在外部的tomcat服务器中运行
③ pom: 父工程或聚合工程,该模块不写代码,仅进行依赖管理
(5) 版本锁定:
① 定义:在maven中,可以在父工程的pom文件中通过< dependencyManagement > 来统一管理依赖版本。子工程引入该依赖时,无需指定< version >,但仍需导入该依赖,由父工程统一管理,变更依赖版本.
② 自定义属性:通过< properties >来自定义属性

<!--父工程pom.xml-->
<properties>
	<jjwt.version>0.9.0</jjwt.version>
</properties>
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>io.jsonwebtoken</groupId>
         	<artifactId>jjwt</artifactId>
        	<version>${jjwt.version}</version>
    	</dependency>
	</dependencies>
</dependencyManagement>
<!--子工程pom.xml-->
<dependencies>
	<dependency>
		<groupId>io.jsonwebtoken</groupId>
		<artifactId>jjwt</artifactId>
	</dependency>
</dependencies>

7、聚合
(1) 定义:将多个模块组织成一个整体,同时进行项目的构建。聚合工程是一个不具有业务功能的“空”工程(有且仅有一个pom文件)
(2) 实现:父工程可以同时是聚合工程,maven中可以通过< modules >设置当前聚合工程所包含的子模块名称。

<!-- 聚合其他模块 -->
<modules>
	<module>../tlias-pojo</module>
	<module>../tlias-utils</module>
	<module>../tlias-management</module>
</modules>

8、私服
(1) 定义:私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的中央仓库,用于解决团队内部的资源共享与资源同步问题。
(2) 依赖查找顺序:本地仓库——私服——中央仓库
(3) 项目版本
① RELEASE(发行版本):功能趋于稳定、当前更新停止,可以用于发行的版本,存储在私服中的RELEASE仓库中。
② SNAPSHOT(快照版本):功能不稳定、尚处于开发中的版本,即快照版本,存储在私服的SNAPSHOT仓库中。
③ CENTRAL(中央仓库):从中央仓库下载的jar包。
(4) 资源上传与下载
在这里插入图片描述
① 设置私服的访问用户名和密码以及依赖下载的仓库组地址

<!-- maven的setting.xml -->
<!-- 配置私服的用户名和密码 -->
 <server>
	<id>maven-releases</id>
	<username>admin</username>
    <password>admin</password>
</server>
<server>
	<id>maven-snapshots</id>
    <username>admin</username>
    <password>admin</password>
</server>
<!-- 配置私服的连接地址 -->
<mirror>
       <id>maven-public</id>
       <mirrorOf>*</mirrorOf> <!--mirrorOf用于匹配仓库id,*用于匹配所有的仓库id-->
       <url>http://192.168.150.101:8081/repository/maven-public/</url>
</mirror>
<profile>
	<id>allow-snapshots</id>
    	<activation>
        <activeByDefault>true</activeByDefault>
        </activation>
	<repositories>
		<repository>
        	<id>maven-public</id>
            <url>http://192.168.150.101:8081/repository/maven-public/</url>
            <releases> <!--指定release版本可以在仓库地址中使用-->
           		<enabled>true</enabled>
           	</releases>
           	<snapshots> <!--指定snapshots版本可以在仓库地址中使用-->
               	<enabled>true</enabled>
            </snapshots>
		</repository>
	</repositories>
</profile>

② 上传自己的项目到私服上

<!--项目的pom.xml-->
<distributionManagement>
	<!-- release版本的发布地址 -->
    <repository>
    	<id>maven-releases</id>
        <url>http://192.168.150.101:8081/repository/maven-releases/</url>
    </repository>   
    <!-- snapshot版本的发布地址 -->
    <snapshotRepository>
    	<id>maven-snapshots</id>
        <url>http://192.168.150.101:8081/repository/maven-snapshots/</url>
    </snapshotRepository>
</distributionManagement>

③ 发布项目,直接运行 deploy 生命周期即可 (发布时,建议跳过单元测试)

二、HTTP协议

1、概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。
在这里插入图片描述
2、特点
① 基于TCP协议:面向连接,安全
② 基于请求-响应模型的:一次请求对应一次响应
③ HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。
缺点:多次请求间不能共享数据
优点: 速度快
3、HTTP请求协议
(1) 请求数据格式
在这里插入图片描述
4、HTTP响应协议
(1) HTTP响应格式
在这里插入图片描述
(2) 常见的响应状态码
在这里插入图片描述

(3) 响应头
在这里插入图片描述

三、Web服务器-Tomcat

1、定义:Tomcat是Apache 软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持ervlet/JSP少量/avaEE规范。Tomcat也称为Web容器、Servlet容器。
2、官网:https://tomcat.apache.org/
3、基本使用
(1) 启动: bin/startup.bat
(2) 停止: bin/shutdown.bat
(3) 部署: 应用复制到webapps目录

四、请求响应

4.1 定义
1、请求(HttpServletRequest):获取请求数据
2、响应(HttpServletResponse):设置响应数据
3、BS架构(Browser/Server):浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。
4、CS架构(Client/Server):客户端/服务器架构模式。
在这里插入图片描述

4.2 请求

1、简单参数
(1) 原始方式:在原始的web程序中,获取请求参数,需要通过HttpServletRequest对象手动获取

@RestController
public class RequestController {
    @RequestMapping("/simpleParam")
    public String simpleParam(HttpServletRequest request){
        //获取请求参数
        String name = request.getParameter("name");
        String ages = request.getParameter("age");
        int age = Integer.parseInt(ages);
        System.out.println(name + ":" + age);
        return "OK";
    }
}

(2) SpringBoot方式:参数名与形参变量名相同,定义形参即可接收参数

@RequestMapping("/simpleParam")
public String simpleParam(String name,Integer age){
System.out.println(name + ":" + age);
return "OK";
}

(3) @RequestParam注解:方法形参名称与请求参数名称不匹配,通过该注解完成映射该注解的required属性默认是true,代表请求参数必须传递

@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name="name",required=false) String name,Integer age){
	System.out.println(name + ":" + age);
	return "OK";
}

2、实体参数:请求参数名与形参对象属性名相同,定义POJO(实体类文件夹)接收即可

//定义一个实体类
public class User {
    private String name;
    private Integer age;
}
//将实体参数name、age传递给方法
@RequestMapping("/simplePojo")
public String simplePojo(User user){
	System.out.println(user);
	return "OK";
}

3、数组集合参数:请求参数名与形参数组名称相同且请求参数为多个

在这里插入图片描述
(1) 使用数组封装

 @RequestMapping("/arrayParam")
 public String arrayParam(String[] hobby){
	System.out.println(Arrays.toString(hobby));
	return "OK";
}

(2) 使用集合封装:使用@RequestParam绑定参数关系

 @RequestMapping("/listParam")
 public String listParam(@RequestParam List<String> hobby){
	System.out.println(hobby);
	return "OK";
}

4、日期参数:使用 @DateTimeFormat 注解完成日期参数格式转换

@RequestMapping("/listParam")
public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updataTime){
	System.out.println(updataTime);
	return "OK";
}

5、JSON参数:JSON数据键名与形参对象属性名相同,定义POJO类型形参接收参数,需要使用 @RequestBody标识
在这里插入图片描述

@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user){updataTime){
	System.out.println(user);
	return "OK";
}

6、路径参数:通过请求URL直接传递参数,使用{…}来标识该路径参数,需要使用@PathVariable 获取路径参数并绑定在{…}上

@RequestMapping("/path/{id}/{name}")
public String pathParam(@PathVariable Integer id,@PathVariable String name){
	System.out.println(id);
	System.out.println(name);
	return "OK";
}

4.3 响应

1、@ResponseBody——响应数据的注解
(1) 类型:方法注解、类注解
(2) 位置:Controller方法上/类上
(3) 作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合,将会转换为]SON格式响应
(4) 说明:@RestController = @Controller + @ResponseBody
2、统一响应结果
在这里插入图片描述

五、分层解耦

5.1 三层架构

1、三层架构
(1) controller: 控制层,接收前端发送的请求,对请求进行处理,并响应数据。
(2) service:业务逻辑层,处理具体的业务逻辑
(3) dao: 数据访问层(Data Access Obiect)(持久层),负责数据访问操作,包括数据的增、删、改、查。
在这里插入图片描述
2、代码实现
在这里插入图片描述

5.2 分层解耦

1、软件设计原则:高内聚低耦合
(1) 内聚:软件中各个功能模块内部的功能联系.
(2) 耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
2、代码
(1) Dao数据访问层

//EmpDao接口
public interface EmpDao {
    public List<Emp> listEmp();
}
//EmpDaoA实现类继承EmpDao接口
@Repository  //将当前类交给IOC容器管理,成为IOC容器中的bean
public class EmpDaoA implements EmpDao {
    @Override
    public List<Emp> listEmp(){
    	//加载并解析emp.xml文件
        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
        List<Emp> empList = XmlParserUtils.parse(file, Emp.class);
        return empList;
    }
}

(2) Service逻辑处理层

//EmpService接口
public interface EmpService {
    //获取员工列表
    public List<Emp> listEmp();
}
//EmpDaoA实现类继承EmpService接口
@Service //将当前类交给IOC容器管理,成为IOC容器中的bean
public class EmpServiceA implements EmpService {
    @Autowired //依赖注入,运行时IOC容器会提供该类型的bean对象,并赋值给该变量
    private EmpDao empDao;
    @Override
    public List<Emp> listEmp() {
        //1、调用Dao获取数据
        List<Emp> empList = empDao.listEmp();
        //2、对数据进行转换处理
        empList.stream().forEach(emp -> {
            //处理gender
            String gender = emp.getGender();
            if ("1".equals(gender)){
                emp.setGender("男");
            }else if("2".equals(gender)){
                emp.setGender("女");
            }
            String job = emp.getJob();
            if ("1".equals(job)){
                emp.setJob("讲师");
            }else if("2".equals(job)){
                emp.setJob("班主任");
            }else if("3".equals(job)){
                emp.setJob("就业指导");
            }
        });
        return empList;
    }
}

(3) Controller控制层

@RestController
public class EmpController {
    @Autowired  //依赖注入,运行时IOC容器会提供该类型的bean对象,并赋值给该变量
    private EmpService empService;
    @RequestMapping("/listEmp")
    public Result list(){
        List<Emp> empList = empService.listEmp();
        return Result.success(empList);
}

六、原理

6.1 起步依赖:通过Maven中的依赖传递来减少依赖

6.2 自动配置

1、定义:SpringBoot的自动配置就是当spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。
2、

第三章 MySQL

一、定义
(1) 数据库:DataBase(DB),存储和管理数据的仓库
(2) 数据库管理系统:DataBase Management System (DBMS),操纵和管理数据库的大型软件。
(3) 关系型数据库(RDBMS):建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
二、配置
1、初始化MySQL

mysqld --initialize-insecure

2、注册MySQL服务

mysqld -install //安装mysql
mysqld -remove mysql //卸载mysql

3、启动MySQL服务

net start mysql //启动mysql服务
net stop mysql //停止mysql服务

4、修改默认账户密码

mysqladmin -u root password 1234

5、登录MySQL

mysql -uroot -p1234

三、SQL

1、SQL分类
在这里插入图片描述

2.2 数据库设计DDL

(1) 数据类型
数据类型主要分为数值类型、字符串类型、日期类型
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
(2) 数据库

create database [if not exists] 数据库名; //创建
drop database [if exists] 数据库名; //删除
//查询
show databases; //查询所有数据库
select database(); //查询当前数据库
use 数据库名; //使用数据库

(3) 设计表结构的流程
在这里插入图片描述
① 语法

//创建
-- create table 表名(
--     字段1 字段类型 [约束] [comment 字段1注释],
-- )[comment 表注释];
create table tb_user(
    id int comment 'ID',
    username varchar(20) comment 'username',
    name varchar(10) comment '姓名',
    age int comment '年龄',
    gender char comment '性别'
)comment '用户表';
//查询
show tables; //查询当前数据库所有表
desc 表名; //查询表结构
show create table 表名; //查询建表语句
//修改
alter table tb_emp add qq varchar(11) comment 'QQ'; //添加字段
alter table tb_emp modify qq varchar(13) comment 'QQ'; //修改字段类型
alter table tb_emp change qq qq_ num varchar(13) comment 'QQ'; //将字段qq改为qq_num
alter table tb_emp drop column qq_num; //删除qq_num字段
rename table tb_emp to emp; //修改表名
//删除
drop table if exists tp_emp;

② 约束
在这里插入图片描述

2.3 数据库操作DML

1、定义:DML有助于检索和管理关系数据库中数据
2、语法

//1、添加
-- 添加单个数据
insert into 表名(字段名1,字段名2) values(1,2); //指定字段添加数据
insert into 表名 values(1,2); //全部字段添加数据
-- 添加批量数据
insert into 表名(字段名1,字段名2) values(1,2),(1,2); //指定字段添加数据
insert into 表名 values(1,2),(1,2); //全部字段添加数据
//2、修改
update 表名 set 字段名1 =1,字段名2 =2 [where 条件];//如果没有where语句,修改整张表的数据
//3、删除
delete from 表名 [where 条件]; //如果没有where语句,删除整张表的数据

2.4 数据库查询DQL

1、基础查询

//查询多个字段
select 字段1,字段2, 字段3 from 表名;
//查询所有字段
select * from 表名;
//查询时设置别名
select 字段1 [as 别名1],字段2 [as 别名2] from 表名;
//查询时去除重复记录
select distinct 字段1,字段2, 字段3 from 表名;

2、条件查询

select 字段1,字段2, 字段3 from 表名 where 条件列表;

在这里插入图片描述
3、聚合函数
(1) 聚合函数类别
① count:统计数量
② max:最大值
③ min:最小值
④ avg:平均值
⑤ sum:求和
(2) 语法

select 聚合函数(字段列表) from 表名;

4、分组查询
(1) 语法

select 字段列表 from 表名 [where 条件列表] group by 分组字段名 [having 分组后过滤条件];
//根据性别分组,统计男性和女性员工的数量
select gender,count(*) from tb_emp group by gender;
//查询入职时间在2015-01-01’ (包含) 以前的员工 ,并对结果根据职位分组 ,获取员工数量大于等于2的职位
select job,count(*) from tb_emp where entrydate<='2015-01-01' group by job having count(*)>=2;

(2) where和having区别
① 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组,而having是分组之后对结果进行过滤。
② 判断条件不同:where不能对聚合函数进行判断,而having可以。
5、排序查询
(1) 排序方式
① ASC:升序(默认)
② DESC:降序
(2) 语法
如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。

select 字段列表 from 表名 [where 条件列表][group by 分组字段] order by 字段1,字段2 排序方式;
//根据入职时间对公司的员工进行升序排序,入职时间相同,再按照更新时间进行降序排序
select * from tb_emp order by entrydate,update_time desc;

6、分页查询
(1) 起始索引从0开始,起始索引= (查询页码-1)*每页显示记录数。若查询第一页数据,起始索引可以省略,直接简写为 limit 10。
(2) 语法

select 字段列表 from 表名 limit 起始索引,查询记录数;
//查询第1页员工数据,每页展示5条记录
select * from tb_emp limit 0,5;
//查询第2页员工数据,每页展示5条记录
select * from tb_emp limit 5,5;

7、流程控制函数
(1) if(条件表达式,true取值,false取值)
(2) case 表达式 when 取值1 then 结果1 when 取值2 then 结果2 … else … end

//完成员工性别的统计,并按男性、女性显示出来
select if(gender = 1,'男性','女性') 性别,count(*) from tb_emp group by gender;
//完成员工职位的统计,并按班主任、讲师、教研主管和学工主管显示出来
select (case job when 1 then '班主任' when 2 then '讲师' when 3 then '教研主管' when 4 then '学工主管' else '未分配职位' end) 职位,count(*) 
from tb_emp group by job;

2.5 多表设计

1、一对多
(1) 实现:在多的一方添加外键,关联另外一方的主键。
(2) 物理外键
① 定义:使用foreign key定义外键来关联另一张表
② 缺点:影响增、删、改的效率(需要检查外键关系);仅用于单节点数据库,不适用与分布式、集群场景;容易引发数据库的死锁问题,消耗性能。
③ 语法

-- 创建表时添加
create table 表名(
	字段 数据类型,
	...
	[constraint] [外键名称] foreign key(外键字段名) references 主表(字段名)
);
-- 建完表后添加
alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(字段名);

2、一对一
(1) 定义:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率。
(2) 实现:任意一方,添加外键,关联另外一方的主键。
3、一对多
(1) 实现:通过中间表来维护,中间表的两个外键,分别关联另外两张表的主键。

2.6 多表查询

1、定义:多表查询是指从多张表中查询数据,会出现笛卡尔积。笛卡尔乘积是指在数学中,两个集合(A集合和B集合)的所有组合情况。
2、连接查询
(1) 内连接

//查询员工的姓名 , 及所属的部门名称
-- 显式内连接:select 字段列表 from 表1 [inner] join 表2 on 条件;
select tb_emp.name,tb_dept.name from tb_emp inner join tb_dept on tb_emp.dept_id = tb_dept.id;
-- 隐式内连接:select 字段列表 from 表1,表2 where 条件;
select tb_emp.name,tb_dept.name from tb_emp,tb_dept where tb_emp.dept_id = tb_dept.id;

(2) 外连接

-- 左外连接:select 字段列表 from left [outer] join 表2 on 条件;
//查询员工表所有员工的姓名,和对应的部门名称 (左外连接)
select e.name,d.name from tb_emp e left join tb_dept d on e.dept_id = d.id;
-- 右外连接:select 字段列表 from right [outer] join 表2 on 条件;
//查询部门表所有部门的名称和对应的员工名称 (右外连接)
select e.name,d.name from tb_emp e right join tb_dept d on e.dept_id = d.id;

3、子查询
(1) 定义:SQL语句中嵌套select语句,称为嵌套查询,又称子查询。子查询外部的语句可以是insert / update / delete / select 的任何一个,最常见的是 select。
(2) 形式

select * from tb1 where column = (select column from tb2 ...);

(3) 分类
① 标量子查询:子查询返回的结果为单个值
常用的操作符:= <> < <= > >=
② 列子查询:子查询返回的结果为一列
常用的操作符:in、not in等
③ 行子查询:子查询返回的结果为一行
常用的操作符:=、<>、in、not in
④ 表子查询:子查询返回的结果为多行多列,常作为临时表
常用的操作符:in

-- 1、标量子查询-查询“教研部”的所有员工信息
select * from tb_emp where dept_id = (select id from tb_dept where name ='教研部');
-- 2、列子查询-查询“教研部”和“咨询部” 的所有员工信息
select * from tb_emp where dept_id = (select id from tb_dept where name ='教研部' or name ='咨询部');
-- 3、行子查询-查询与“韦一笑”的入职日期及职位都相同的员工信息
select * from tb_emp where entrydate = (select entrydate from tb_dept where name ='韦一笑') and job = (select job from tb_dept where name ='韦一笑');
select * from tb_emp where (entrydate,job) = (select entrydate,job from tb_dept where name ='韦一笑');
-- 4、表子查询-查询入职日期是 “2006-01-01”之后的员工信息,及其部门名称
//select * from tb_emp where entrydate > '2006-01-01'作为临时表
select e.*,d.name from (select * from tb_emp where entrydate > '2006-01-01') e,tb_emp where e.dept_id = d.id; 

2.7 索引

1、定义:索引 (index)是帮助数据库高效获取数据的数据结构。
2、结构:MySOL数据库支持的索引结构有很多,如: Hash索引、B+Tree索引、Full-Text索引等。我们平常所说的索引,如果没有特别指明,都是指默认的B+Tree 结构组织的索引。
在这里插入图片描述
3、操作语法
主键字段,在建表时,会自动创建主键索引。添加唯一约束时,数据库实际上会添加唯一索引。

-- 创建索引
create [unique] index 索引名 on 表名(字段名);
-- 查看索引
show index from 表名;
-- 删除索引
drop index 索引名 from on 表名;

四、mybatis

1、定义:mybatis是一款优秀的持久层框架,用于简化JDBC的开发。mybatis可以使用注解XML映射文件来配置和映射原始类型、接口和Java POJO为数据库中的记录。
2、数据库连接池
(1) 定义:数据库连接池是个容器,负责分配、管理数据库连接(Connection)。它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏。
(2) 优势:资源重用;提升系统响应速度;避免数据库连接遗漏
(3) 常见产品
在这里插入图片描述
(4) 配置数据库连接池——Druid数据库连接池

<!-- pom.xml -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid-spring-boot-starter</artifactId>
	<version>1.2.8</version>
</dependency>
<!-- application.properties -->
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=1234

3、注解配置SQL
在接口方法上添加注解来执行SQL

<!-- EmpMapper -->
@Mapper 在运行时,会自动生成该接口的实现类对象(代理对象),并日路该对象交给IOC容器管理
public interface EmpMapper {
    //删除数据——根据id
    @Delete("delete from emp where id = #{id}")
    public void delete(Integer id);
    //新增数据
   	//Options主键返回,useGeneratedKeys = true表明需要拿到生成的主键值,最终封装到id
    @Options(keyProperty = "id",useGeneratedKeys = true)
    @Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id,
    create_time, update_time) values (#{username},#{name},#{gender},#{image},#{job},
    #{entrydate},#{deptId},#{createTime},#{updateTime})")
    public void insert(Emp emp); //如果有多个参数,可以使用实体类封装起来
    //更新数据
    @Update("update emp set username=#{username},name=#{name},gender=#{gender},image=
    #{image},job=#{job},entrydate=#{entrydate},dept_id=#{deptId},update_time=#{updateTime} 
    where id = #{id}")
    public void update(Emp emp);
    //查询数据——根据id
    @Select("select * from emp where id = #{id}")
    public Emp getById(Integer id);
<!-- MybatisApplicationTests -->
@SpringBootTest //整合单元测试的注解
class MybatisApplicationTests {
	@Autowired //依赖注入
	private EmpMapper empMapper;
	//删除数据——根据id
	@Test
	public void testDelete(){
		empMapper.delete(16);
		/*int delete = empMapper.delete(16);
		System.out.println(delete);*/
	}
	//新增数据
	@Test
	public void testInsert(){
		//构造员工对象
		Emp emp = new Emp();
		emp.setUsername("joey");
		emp.setName("乔伊");
		emp.setImage("1.jpg");
		emp.setGender((short)1);
		emp.setJob((short)1);
		emp.setEntrydate(LocalDate.of(2000,1,1));
		emp.setCreateTime(LocalDateTime.now());
		emp.setUpdateTime(LocalDateTime.now());
		emp.setDeptId(1);
		empMapper.insert(emp);
		System.out.println(emp.getId());
	}
	//更新数据
	@Test
	public void testUpdate() {
		//构造员工对象
		Emp emp = new Emp();
		emp.setId(18);
		emp.setUsername("ross");
		emp.setName("罗斯");
		emp.setImage("1.jpg");
		emp.setGender((short) 2);
		emp.setJob((short) 1);
		emp.setEntrydate(LocalDate.of(2000, 1, 1));
		emp.setUpdateTime(LocalDateTime.now());
		emp.setDeptId(1);
		empMapper.update(emp);
		System.out.println(emp.getId());
	}
	//查询数据——根据id
	@Test
	public void testGetById(){
		Emp emp = empMapper.getById(18);
		System.out.println(emp);
	}

4、XML映射文件配置SQL
(1) 规范
① XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。
② XML映射文件的namespace属性为Mapper接口全限定名一致。
③ XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。
(2) 代码

<!-- xml文件 -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper">
    <!-- 批量删除 -->
    //collection:遍历的集合;item:遍历出来的元素;separator:分隔符;open:遍历开始前拼接的SQL片段;close:遍历结束后拼接的SQL片段
    <delete id="deleteByIds">
        delete from emp where id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>
    <!-- 条件查询 -->
    //resultType:单条记录所封装的类型
    <select id="list" resultType="com.itheima.pojo.Emp">
        select *
        from emp
        <where>
            <if test="name != null">name like '%${name}%'</if>
            <if test="name != null">and gender = #{gender}</if>
            <if test="name != null">and entrydate between #{begin} and #{end}</if>
        </where>
        order by update_time desc
    </select>
</mapper>
<!-- EmpMapper -->
<!-- 批量删除 -->
public void deleteByIds(List<Integer> ids) ;
<!-- 条件查询 -->
public List<Emp> list(String name, Short gender, LocalDate begin,LocalDate end);
<!-- MybatisApplicationTests -->
<!-- 条件查询 -->
@Test
public void testList(){
	List<Emp> empList = empMapper.list("张",(short)1,LocalDate.of(2010,1,1),LocalDate.of(2020,1,1));
	System.out.println(empList);
}
<!-- 批量删除 -->
@Test
public void testdeleteByIds(){
	List<Integer> ids = Arrays.asList(13,14,15);
	empMapper.deleteByIds(ids);
}

5、动态SQL
(1) 定义:随着用户的输入或外部条件的变化而变化的SQL语句,我们称为动态SQL。
(2) < if >
① < if >:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。
② < where >: where 元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND或OR。

<!-- 根据姓名、性别、入职时间查询语句 -->
<!-- resultType:单条记录所封装的类型 -->
<select id="list" resultType="com.itheima.pojo.Emp">
	select *
    from emp
    <where>
    	<if test="name != null">name like '%${name}%'</if>
    	<if test="name != null">and gender = #{gender}</if>
        <if test="name != null">and entrydate between #{begin} and #{end}</if>
    </where>
    order by update_time desc
</select>

(3) < foreach >
< foreach >用于遍历循环,属性为:collection:遍历的集合;item:遍历出来的元素;separator:分隔符;open:遍历开始前拼接的SQL片段;close:遍历结束后拼接的SQL片段

<!-- 批量删除 -->
<delete id="deleteByIds">
	delete from emp where id in
    <foreach collection="ids" item="id" separator="," open="(" close=")">
    	#{id}
   	</foreach>
</delete>

(4) < sql >< include >
① < sql >:定义可重用的SQL片段。
② < include >:通过属性refid,指定包含的sql片段。

<!-- 定义可重用的SQL片段 -->
<sql id="commonSelect">
	select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, 	  
	update_time from emp
</sql>
<!-- 使用SQL片段 -->
<include refid="commonSelect"/>

6、lombok
(1) 定义:Lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率。
(2) 注解
在这里插入图片描述
7、配置格式
(1) XML

<server>
	<port>8080</port>
	<address>127.0.0.1</address>
</server>

(2) properties

server.port=8080
server.address=127.0.0.1

(3) yml/yaml

server:
  port:8080
  address:127.0.0.1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值