1. 简介
在基础学习部分使用SpringBoot+Postgresql+mybatis技术进行实现。
2. SpringBoot
Spring Boot 是一个基于 Java 的开源框架,由 Pivotal 团队开发,旨在简化 Spring 应用程序的创建、配置和部署过程。它通过“约定优于配置”的设计理念,减少了开发人员的工作量,使开发者能够快速构建出高质量的应用程序。Spring Boot 的核心目标是简化新 Spring 应用的初始搭建以及开发过程,通过特定的方式进行配置,从而避免了繁琐的样板化配置。
2.1 springdata 数据获取
-
Spring Data:Spring Data 是 Spring Framework 的一部分,它提供了一种一致的数据访问方法,包括关系型、非关系型和 MapReduce 等。Spring Data 通过简化数据访问层的开发,使得开发者可以专注于业务逻辑的实现,而不是繁琐的数据访问配置。
2.2 springframework 核心功能
-
Spring Framework 核心功能:Spring Framework 最初的核心功能是 Spring IoC(控制反转)和 Spring AOP(面向切面编程)。这些功能奠定了 Spring 的基础,随着 Spring 的不断发展,它引入了 Spring 事务、Spring MVC 等一系列伟大的产品,最终成就了 Spring 帝国,几乎可以解决企业开发中的所有问题。
2.3 springsecurity认证授权
-
Spring Security:Spring Security 是 Spring Framework 的一部分,它通过全面且可扩展的身份验证和授权支持来保护应用程序。Spring Security 提供了多种安全机制,如基于表单的登录、基于 JWT 的认证、基于角色的访问控制等,确保应用程序的安全性。
2.4 springamqp消息传递
-
Spring AMQP:Spring AMQP 是 Spring Framework 的一部分,它提供了一种简单的方式来使用 RabbitMQ 进行消息传递。Spring AMQP 通过抽象 RabbitMQ 的底层细节,使得开发者可以专注于业务逻辑的实现,而不是繁琐的消息传递配置。
2.5 springcloud服务治理
-
Spring Cloud:Spring Cloud 是一系列框架的集合,它利用 Spring Boot 的开发便利性,简化了分布式系统基础设施的开发。Spring Cloud 包括服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等功能,可以实现一键启动和部署。Spring Cloud 是为了解决微服务架构中的服务治理问题而开发的框架,它完全基于 Spring Boot 开发。
2.6 传统spring与springboot对比
1传统构建spring应用程序缺点
导入依赖繁琐
项目配置繁琐
2 springboot应用程序优点
起步依赖:本质就是一个Maven坐标,整合了一个完成一个功能需要的所有坐标
自动配置:bean对象会自动注入到ioc容器,不需要手动声明,简化开发
其他特性:内嵌的Tomcat,Jetty(无需部署WAR文件),外部化配置,不需要XML配置(properties/yml)
补充:
Spring Boot 的主要特点包括:
- 内嵌 Servlet 容器:Spring Boot 内嵌了 Tomcat、Jetty 或 Undertow 等 Servlet 容器,使得开发者无需部署 WAR 文件,只需将项目打包成 JAR 文件,然后通过
java -jar
命令即可运行。- 简化 Maven 配置:Spring Boot 提供了丰富的 starter 依赖,开发者只需添加这些 starter,Spring Boot 会自动引入所需的依赖项,从而简化了 Maven 的配置。
- 自动配置:Spring Boot 通过
META-INF/spring.factories
文件实现了自动配置,根据项目的依赖关系自动配置 Spring 的组件,减少了手动配置的工作量。- 支持多种技术集成:Spring Boot 支持与多种技术的集成,如 MyBatis、Hibernate、Thymeleaf、WebSocket、Redis、RabbitMQ 等,使得开发者可以灵活地选择所需的技术栈。
- 快速开发:Spring Boot 提供了丰富的 starter 和默认配置,使得开发者能够快速构建应用程序,而无需花费大量时间在配置上。
3. 创建简单项目
3.1 IDEA无springboot插件时
【springboot】IDEA手动创建SpringBoot简单工程(无插件)-CSDN博客
3.2 IDEA有springboot插件时
【springboot】IDEA创建SpringBoot简单工程(有插件)-CSDN博客
4. 学习路径
4.1 配置文件
1. propertoes配置文件
官方文档
示例
修改Tomcat的端口号和虚拟目录
2. yaml配置文件
更加常用:1.层级表示更加明确2.更关注数据
application.yml
示例
server:
port: 9191
servlet:
context-path: /start1
3. 配置信息书写与获取
三方技术配置信息
自定义配置信息
如果将相关的配置信息写入代码中,那么在打包的时候就会修改java代码并且需要重新打包,如果卸载配置文件中,只需要更改配置文件即可也不需要重新打包
书写
数组配置书写
获取:单个获取
简化:整个类属性批量获取
4.2 整合MyBatis
4.2.1 创建数据库
1. 数据库安装:
【PostgreSQL】安装及使用(Navicat/Arcgis),连接(C#)_postgresql navicat-CSDN博客
2. 数据库连接
下载驱动
由于我电脑上安装的两个版本的Postgresql12和14所以端口得修改
添加表数据
打开编写窗口
以下是mysql数据库的语句
create database if not exists mybatis;
use mybatis;
create table user(
id int unsigned primary key auto_increment comment 'ID',
name varchar(100) comment '姓名',
age tinyint unsigned comment '年龄',
gender tinyint unsigned comment '性别, 1:男, 2:女',
phone varchar(11) comment '手机号'
) comment '用户表';
insert into user(id, name, age, gender, phone) VALUES (null,'白眉鹰王',55,'1','18800000000');
insert into user(id, name, age, gender, phone) VALUES (null,'金毛狮王',45,'1','18800000001');
insert into user(id, name, age, gender, phone) VALUES (null,'青翼蝠王',38,'1','18800000002');
insert into user(id, name, age, gender, phone) VALUES (null,'紫衫龙王',42,'2','18800000003');
insert into user(id, name, age, gender, phone) VALUES (null,'光明左使',37,'1','18800000004');
insert into user(id, name, age, gender, phone) VALUES (null,'光明右使',48,'1','18800000005');
以下是postgresql的语句(注意不要建立user表,会与原始的user表冲突)
-- 1. 创建数据库(兼容IF NOT EXISTS语法需调整)
CREATE DATABASE mybatis;
-- 2. 连接数据库(PostgreSQL无USE命令)
\c mybatis;
-- 3. 创建表(处理自增主键、无符号类型、注释语法)
CREATE TABLE "usertest" (
id SERIAL PRIMARY KEY, -- 自增主键改造
name VARCHAR(100), -- 字符串类型兼容
age SMALLINT, -- TINYINT UNSIGNED → SMALLINT
gender SMALLINT, -- 同age处理逻辑
phone VARCHAR(11) -- 保留原定义
);
COMMENT ON TABLE "usertest" IS '用户表'; -- 表注释单独设置
COMMENT ON COLUMN "usertest".id IS 'ID';
COMMENT ON COLUMN "usertest".name IS '姓名';
COMMENT ON COLUMN "usertest".age IS '年龄';
COMMENT ON COLUMN "usertest".gender IS '性别, 1:男, 2:女';
COMMENT ON COLUMN "usertest".phone IS '手机号';
-- 4. 插入数据(处理自增列、单引号规范)
INSERT INTO "usertest" (name, age, gender, phone) VALUES
('白眉鹰王', 55, 1, '18800000000'), -- 省略自增id [[20]][[10]]
('金毛狮王', 45, 1, '18800000001'),
('青翼蝠王', 38, 1, '18800000002'),
('紫衫龙王', 42, 2, '18800000003'),
('光明左使', 37, 1, '18800000004'),
('光明右使', 48, 1, '18800000005');
4.2.2 代码实现
1. 添加镜像,方便下载依赖
<!-- 配置阿里云仓库 -->
<repositories>
<repository>
<id>aliyun-repos</id>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>aliyun-repos</id>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
2.添加mybatis起步依赖
<!--mybatis的起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
3. 添加 postgresql 数据库的驱动依赖
<!--postgresql驱动依赖-->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
4. 创建User实体类
package com.zwh.springbootmybatis.pojo;
public class User {
private Integer id;
private String name;
private Short age;
private Short gender;
private String phone;
public User() {
}
public User(Integer id, String name, Short age, Short gender, String phone) {
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
this.phone = phone;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Short getAge() {
return age;
}
public void setAge(Short age) {
this.age = age;
}
public Short getGender() {
return gender;
}
public void setGender(Short gender) {
this.gender = gender;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
", phone='" + phone + '\'' +
'}';
}
}
5. 创建数据库交互接口 Mapper
package com.zwh.springbootmybatis.mapper;
import com.zwh.springbootmybatis.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface UserMapper {
@Select("select * from user where id = #{id}")
public User findById(Integer id);
}
6. 创建业务逻辑接口 Service
package com.zwh.springbootmybatis.service;
import com.zwh.springbootmybatis.pojo.User;
public interface UserService {
public User findById(Integer id);
}
7. 创建接口的实现类 ServiceImpl
package com.zwh.springbootmybatis.service.impl;
import com.zwh.springbootmybatis.mapper.UserMapper;
import com.zwh.springbootmybatis.pojo.User;
import com.zwh.springbootmybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User findById(Integer id) {
return userMapper.findById(id);
}
}
8. 处理前端请求 Controller
package com.zwh.springbootmybatis.Controller;
import com.zwh.springbootmybatis.pojo.User;
import com.zwh.springbootmybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/findById")
public User findById(Integer id){
return userService.findById(id);
}
}
9.运行
http://127.0.0.1:8080/findById?id=1
mapper
、service
、impl
、pojo
、controller讲解
在Spring Boot中,mapper
、service
、impl
、pojo
、controller
是分层架构中的关键组件,它们分别负责不同的职责:
-
Mapper:通常指MyBatis的Mapper接口,用于定义与数据库交互的方法。这些方法的具体实现(如SQL语句)通常放在
mapper.xml
文件中。Mapper接口通过@Mapper
注解标识,并且可以继承BaseMapper
等通用接口。 -
Service:表示业务逻辑层的接口,定义了业务逻辑的方法。Service接口通常由
ServiceImpl
实现,实现类中会调用Mapper接口来执行数据库操作。 -
ServiceImpl:是Service接口的实现类,负责具体的业务逻辑处理。它通常通过
@Service
注解标识,并且会注入Mapper接口以获取数据库操作能力。 -
Pojo(Plain Old Java Object) :表示实体类,通常用于映射数据库表。Pojo类包含字段和对应的getter/setter方法,用于在Java对象与数据库之间进行数据转换。
-
Controller:负责处理前端请求,作为应用的入口点。Controller通过
@Controller
或@RestController
注解标识,并调用Service层的方法来处理业务逻辑。
这些组件共同构成了Spring Boot的分层架构,使得代码结构清晰、易于维护和扩展。
4.3 Bean管理
4.3.1 Bean扫描
springbootapplication注解是包含springbootconfiguration、和enableautoconfiguration和componentscan注解,所以能扫描到springbootquickstart文件夹内的内容
非springbootquickstart文件夹解决扫描问题
这样就可以扫描到itheima下的内容了
4.3.2 Bean注册
1. 第三方文件如何注册
如果要注册的bean对象来自于第三方(不是自定义的),是无法用@Component及衍生注解声明bean的
解决以上方法用@Bean和@import可以解决
安装自定义jar包
mvn install:install-file -Dfile=C:\Users\10618\Desktop\02_Bean注册资料\common-pojo-1.0-SNAPSHOT.jar -DgroupId=cn.itcast -DartifactId=common-pojo -Dversion=1.0 -Dpackaging=jar
install:install-file 通过本地文件来安装
-Dfile 本地磁盘的路径
-DgroupId 指定jar包安装完成后的组织名
-DartifactId 安装后的工程名字
-Dversion 版本
-Dpackaging 打包的方式
安装完成
本地安装
添加依赖
如果失败的话请查看该idea的 maven本地仓库中是否有对应文件,没有的话复制进来即可
查看文件内容
2. 使用@Bean
在启动类中注册bean对象:不推荐
package com.zwh.springbootregedit;
import cn.itcast.pojo.Country;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class SpringbootRegeditApplication {
public static void main(String[] args) {
ApplicationContext applicationContext =SpringApplication.run(SpringbootRegeditApplication.class, args);
Country country=applicationContext.getBean(Country.class);
System.out.println(country);
}
//注入Country对象
@Bean
public Country Country(){
return new Country();
}
}
在配置类中集中注册:推荐
注意添加@Configuration
先获取bean,再输出
修改名称,默认就是函数名称
Bean嵌套使用
3. 使用@Import
常用于
导入配置类
导入ImportSelector接口实现类
导入配置类
数组批量注入
导入ImportSelector接口实现类(解决以上数组批量导入不优雅的情况)
优化类名从配置文件中导入,这样会让程序变得更加灵活
写配置文件
读取配置文件
再次优化,将其写到一个注解类中
创建注解类
引用注解类
4.3.3 添加 Bean 注册条件
注入到容器内实体类型对象的属性都是null,这些对象并没有什么实际的意义,因为实体类的对象就是来封装对象的,结果你这些对象中什么都没有;
普通解决方案
1.给这些属性赋值然后再注入bean
但是这些属性又是固定的不是很好,所以写入到配置文件中
将配置文件中的内容进行注释,发现直接报错
但是想要的效果是在配置文件中没有找到对应值,就不进行注入bean,有值的情况下才进行注入
SpringBoot提供了设置注册生效调价的注解@conditional
以下是基于该注解的衍生注解
以下三个是常用的注解
@ConditionalOnProperty
这样就没有注入Country这个类
打开配置这样就注入了
@ConditionalOnMissingBean
@ConditionalOnClass
目前我环境中的web依赖是注释掉的
4.4 自动配置原理
为什么要学习自动配置原理
1.在实际开发中我们经常会定义一些公共的组件,然后提供给各个部门使用,为了使用方便我们会将公共的组件定义为starer,如果你想自定义starter,就必须先了解自定义配置原理
2.应对,面试
自动配置
遵循预定大约配置的原则,在boot程序启动后,起步依赖中的一些bean对象会自动注入到ioc容器
之前我们注入bean并不是自动注入配置
源码分析(不用看)
举例:程序引入spring-boot-starter-web起步依赖,启动后,会自动向ioc容器中注入DispatcherServlet类
自动配置注解
总结
2.7之前的配置类是写在spring.factories中的,2.7-3.0spring.factories和imports都可以,3.0以后只支持imports
如何实现自动配置
根据以上实现思路写出以下2.0的脚本文件
引入
这个jar包可以完成自动配置
面试回答
4.5 自定义stater
场景
在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用。而在SpringBoot的项目中,一般会将这些公共组件封装为SpringBoot的starter
创建自定义mybatis的starter
步骤
创建maven工程
工程1
工程2
原始mybatis的文件结构
添加依赖包
创建自动配置类
更换自己写的dmybatis-spring-boot-starter依赖,运行