tlias智能学习辅助系统-学习笔记Part02
tlias智能学习辅助系统-学习笔记Part02
今日目标
- 编写 SpringBoot 入门案例 ❤️ ✏️
- 能够理解Http协议相关概念以及获取请求参数,响应数据 🍐 ✏️
- 能够切换服务器运行Web Boot项目 ✏️ 🚀
- 使用三层架构进行分层解耦 🍐
- 在SpringBoot下集成Mybatis框架(XML/注解/动态sql)
1. SpringBoot 入门
SpringBoot定义

SpringBoot是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程。Spring的官网,国内社区
- Spring 程序缺点
- 配置繁琐
- 依赖设置繁琐
- SpringBoot 程序优点
- 自动配置
- 起步依赖(简化依赖配置)
- 辅助功能(内置服务器(tomcat),……)
需求:创建 Springboot 项目
1️⃣ 创建新模块,选择 Spring 初始化,并配置模块相关基础信息

2️⃣ 选择当前模块需要使用的技术集

3️⃣ 开发控制器类

包名:com.yourcompany.controller
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{uid}")
public String getById(@PathVariable Integer uid){
System.out.println("id ==> "+ uid);
return "hello , spring boot! ";
}
}
需求:修改服务器端口
默认端口是:8080---修改为8848
修改服务器端口
YAML 是 JSON 的超集,简洁而强大,是一种专门用来书写配置文件的语言,可以替代 application.properties
YAML 的使用非常简单,利用缩进来表示层级关系,并且大小写敏感。

- 在 application.yml 中配置
server:
port: 80
2. SpringBoot获得参数和数据响应
前言
本节,我们主要讲解,如何接收页面传递过来的请求数据

- 接收普通类型参数传递
- 接收json数据参数
- 接收路径参数
本节,我们主要讲解,如何返回数据给前端页面

- 返回一般Json数据
- 返回统一响应结果Json数据
请求参数获取实操
代码操作
简单参数 :在向服务器发起请求时,向服务器传递的是一些普通的请求数据。
参数格式:
http://localhost:8848/users/simpleParam?name=韩立&age=188
路径上的参数名字和方法的形参必须一模一样,类型也要一致
操作步骤流程: 👇👇

路径参数:
参数格式:
http://localhost:8848/users/112
- 前端:通过请求URL直接传递参数
- 后端:使用
{…}
来标识该路径参数,需要使用@PathVariable
获取路径参数


参数格式:
localhost:8848/users/dateParam?start=2010-01-12
在一些特殊的需求中,可能会涉及到日期类型数据的封装。比如,如下需求:
因为日期的格式多种多样(如:2022-12-12 10:05:45 、2022/12/12 10:05:45),那么对于日期类型的参数在进行封装的时候,需要通过@DateTimeFormat注解,以及其pattern属性来设置日期的格式。

在前后端进行交互时,如果是比较复杂的参数,前后端通过会使用JSON格式非常常用的格式的数据进行传输。
参数格式:👇
{
"id": 1,
"name": "韩立",
"password": "123456",
"age": 122,
"hobby": "修仙、法术",
"description": "凡人的主角",
"department": "青云门"
}
请求图示: 👇

实操步骤: 👇
- 在controller的同级目录下定义一个domain的包,创建一个user类,如下:👇 点击查看图解
@Data //如果不用这个注解,需要自行补充get和set方法
public class User {
private Integer id;
private String name;
private String password;
private Integer age;
private String hobby;
private String description;
private String department;
}
要使用@Data注解,需要在
pom.xml
加入lombok依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
</dependency>
- 根据user类,准备对应的json假数据,如下
{
"id": 1,
"name": "韩立",
"password": "123456",
"age": 122,
"hobby": "修仙、法术",
"description": "凡人的主角",
"department": "青云门"
}
- 在UserController中,书写接受方法,如下:

- 打开apifox软件,发起请求,如下

响应数据实操
代码操作
SpringBoot工程,Controller中的方法返回值对象,自动转成了Json字符串

上述查询操作,返回是User对象字符串
- 如果是修改成功操作尼?返回是true?
- 如果是删除成功操作尼? 返回的是true?
- 如果是新增操作失败操作? 返回是是false?
这样对于前端工程师的小姐姐们是不是很不友好,返回值不统一?
怎么处理尼?
看看Boss直聘的返回值标准,依葫芦画瓢统一下
点击查看统一返回值类
Result类一般放domain包下或者pojo下
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
private Integer code;//响应码,1 代表成功; 0 代表失败
private String msg; //响应信息 描述字符串
private Object data; //返回的数据
//增删改 成功响应
public static Result success(){
return new Result(1,"success",null);
}
//查询 成功响应
public static Result success(Object data){
return new Result(1,"success",data);
}
//失败响应
public static Result error(String msg){
return new Result(0,msg,null);
}
}

3. 三层架构分层解耦
三层架构分层解耦
三层架构就是为了符合高内聚,低耦合 思想,把各个功能模块划分为表现层 、业务逻辑层 和数据访问层 三层架构,各层之间采用接口相互访问,并通过对象模型的实体类作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致

Spring、SpringMVC、Mybatis等是框架
思考一下:如果表现层框架改了,请问其他2层需要修改吗?
- 数据访问层:对数据库的CRUD基本操作,特有包名:mapper或者dao
- 业务逻辑层:对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑功能。例如
注册业务功能
,我们会先调用数据访问层
的selectByName()
方法判断该用户名是否存在,如果不存在再调用数据访问层
的insert()
方法进行数据的添加操作。特有包名:service - 表现层/控制层:接收请求,封装数据,调用业务逻辑层,响应数据。特有包名:controller或者web
实操:根据三层架构的思想,创建对应的包和实现类
1.点击查看建包的步骤和解释 👈 👈
实操:根据三层架构的思想,给User用户模块,创建一个查询所有的接口
- 在控制层 controller包下,的UserController类中,增加一个findAllUser()的方法
- 在业务层service包下,创建UserService接口,定义一个findAllUser()的抽象方法,返回值是
List<User>
- 在业务层service包下,创建impl包,在impl包下创建UserServiceImpl实现类,实现UserService接口,并实现其未实现的方法,返回值是
List<User>
- 在持久层mapper包下,创建selectAll()方法,返回值是
List<User>

注意!!
如果你完成并理解上述2个实操 ,对于三层架构的作用和实践,你很到位哦!!!👍 接下来结合Spring的核心概念,让代码更加简洁吧!!!
提示:使用
@Autowired
@Service
2个注解能使代码更加简洁哦!!
点击查看答案步骤提示建议自己先试试哦!!然后再点击看提示哦
4. SpringBoot下集成Mybatis框架(XML/注解/动态sql)
SpringBoot下集成Mybatis框架

MyBatis 是一个持久层框架,用于简化 Java 应用程序与关系型数据库的交互。它通过将 SQL 语句与 Java 代码进行映射,提供了一种方便且灵活的方式来访问和操作数据库。
MyBatis 解决了传统 JDBC 编程中的一些问题,包括:
- 简化数据库访问jdbc操作非常繁琐:MyBatis 提供了简洁的 API 和灵活的配置方式,减少了编写繁琐的 JDBC 代码的工作量。
- 提供对象-关系映射:MyBatis 可以将数据库表中的数据映射到 Java 对象上,通过对象来进行数据的操作和处理,减少了手动处理结果集的复杂性。
- 支持动态 SQL:MyBatis 允许在 XML 配置文件中编写动态 SQL 语句,根据不同条件生成不同的 SQL,提供了更大的灵活性和可扩展性。
- 提供缓存机制:MyBatis 提供了一级缓存和二级缓存的支持,可以提高数据访问性能,减少对数据库的频繁访问。
当使用 MyBatis 框架时,以下是配置要求的一些主要方面:
数据源配置:需要配置数据库的连接信息,包括数据库驱动、连接 URL、用户名和密码等。这些配置通常在 MyBatis 的配置文件中进行设置。
Mapper 文件配置:需要为每个数据访问对象(DAO)编写对应的 Mapper 文件,用于定义 SQL 语句和结果映射。Mapper 文件通常使用 XML 格式 ,也可以使用注解的方式进行配置。
映射配置:Mapper 文件中需要配置每个 SQL 语句与 Java 方法之间的映射关系,包括 SQL 语句的编写、参数映射和结果映射。可以使用 XML 格式或注解方式进行映射配置。
配置文件Boot项目不需要:MyBatis 需要一个主配置文件(通常命名为 mybatis-config.xml )来指定全局配置,例如类型别名、插件、缓存设置等。此外,还需要配置数据源和事务管理器等。
使用框架和依赖:在项目中使用 MyBatis 框架时,需要添加相应的依赖,例如 mybatis 和 mybatis-spring。这些依赖需要在项目的构建文件(如 Maven 的 pom.xml)中进行配置。
事务管理:如果需要在数据访问过程中进行事务管理,需要配置事务管理器,并确保每个数据访问操作在正确的事务上下文中执行。
运行环境配置:在一些特定的场景下,可能需要进行一些额外的配置,例如分页插件的配置、缓存设置的调优等。
如果左边的知识,了解了,那么可以进行Mybatis初体验了!!👇
在体验之前,需要做如下准备工作:
- 项目工程创建完成后,在pom.xml文件中的dependencies标签内,导入Mybatis的起步依赖和MySQL驱动依赖
<!-- lombok的依赖,能免除get和set方法 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
</dependency>
<!-- mybatis的起步依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
<!-- mysql驱动包依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
- 创建mybatis数据库,设置编码为utf-8mb4,创建user表,并导入一下假数据
-- 删除原有数据库
DROP TABLE IF EXISTS `user`;
-- 创建user表
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL UNIQUE,
`password` varchar(32) NOT NULL DEFAULT '12345678',
`age` int(10) NOT NULL,
`hobby` varchar(50) DEFAULT NULL,
`description` varchar(200) NOT NULL,
`department` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('8', '赵灵儿', '12345678', '20', '阵法、法术修炼', '纯真善良的女子,拥有强大的阴阳之力', '阴阳家');
INSERT INTO `user` VALUES ('9', '楚留香', '12345678', '32', '剑术、侠义行侠', '风流倜傥的豪客,以智慧和剑术征服江湖', '江湖人士');
INSERT INTO `user` VALUES ('10', '白浅', '12345678', '26', '宫廷舞蹈、仙法修炼', '美丽高贵的仙子,守护爱与正义的力量', '青丘派');
INSERT INTO `user` VALUES ('11', '苏明玉', '12345678', '29', '医术、家族事务', '聪明伶俐的女医生,心系家族兴衰', '苏家');
INSERT INTO `user` VALUES ('13', '李逍遥', '12345678', '28', '剑术、侠义行侠', '潇洒自如的剑客,为爱与正义奋斗', '天墉城');
INSERT INTO `user` VALUES ('14', '陆展元', '12345678', '31', '龙族法术、海洋探险', '勇敢善良的龙族王子,探索海洋奥秘', '东海龙宫');
INSERT INTO `user` VALUES ('18', '萧炎', '12345678', '25', '功夫、修炼', '机缘巧合下拥有强大火焰之力的少年', '草庙村');
INSERT INTO `user` VALUES ('19', '陆九淳', '12345678', '29', '家族事务、剑术修炼', '家族责任重于一切的江湖少年', '陆家');
INSERT INTO `user` VALUES ('20', '韩立', '12345678', '22', '灵力修炼、阵法研究', '机智聪明的年轻修士,掌握神奇的法术', '韩家');
INSERT INTO `user` VALUES ('21', '顾惜朝', '12345678', '28', '法术修炼、守护门派', '心地善良的女子,为守护门派而战', '古玄门');
INSERT INTO `user` VALUES ('22', '九霄真人', '12345678', '35', '仙法修炼、教导弟子', '威严正直的仙人,指导后辈修仙道路', '蓝霞宫');
INSERT INTO `user` VALUES ('23', '姬昌', '12345678', '33', '阴阳术、仙法修炼', '智勇双全的江湖人物,掌握阴阳之力', '太阴派');
INSERT INTO `user` VALUES ('24', '西门吹雪', '12345678', '30', '剑术、侠义行侠', '风流倜傥的剑客,执着追求剑道境界', '独孤家');
INSERT INTO `user` VALUES ('25', '夏冰', '12345678', '26', '魔法修炼、冰雪之力', '美丽神秘的女子,掌握冰雪之力', '幻冥宗');
INSERT INTO `user` VALUES ('26', '杨影枫', '12345678', '27', '暗器、侠义行侠', '冷酷无情的刺客,为正义而战', '影家');
INSERT INTO `user` VALUES ('27', '白素素', '12345678', '24', '文学创作、人界事务', '善良纯真的女子,用文字记录人间百态', '人界');
INSERT INTO `user` VALUES ('28', '独孤剑', '12345678', '32', '剑术、侠义行侠', '心系家族的剑客,剑法高超', '独孤家');
INSERT INTO `user` VALUES ('29', '楚九霄', '12345678', '28', '阵法、家族事务', '机智聪明的年轻人,心系家族荣耀', '楚家');
INSERT INTO `user` VALUES ('30', '谢晓峰', '12345678', '31', '拳脚功夫、江湖恩怨', '正直勇敢的江湖豪杰,忠于兄弟情义', '铁血帮');
INSERT INTO `user` VALUES ('31', '叶孤城', '12345678', '29', '剑术、侠义行侠', '冷酷无情的剑客,追求剑道极致', '武境城');
INSERT INTO `user` VALUES ('32', '李逸风', '12345678', '25', '修炼、探险', '热血青年,勇往直前探索未知世界', '蓝枫大陆');
INSERT INTO `user` VALUES ('33', '萧霜', '12345678', '27', '冰雪法术、守护宗门', '冷艳高傲的女子,守护冰霜宗的利益', '冰霜宗');
INSERT INTO `user` VALUES ('34', '楚玉峰', '12345678', '30', '家族事务、阵法修炼', '机智聪明的年轻人,家族责任重于一切', '楚家');
INSERT INTO `user` VALUES ('35', '陆雪琪', '12345678', '24', '法术、修行', '美丽冷傲的仙子,修炼法术追求修行境界', '青云门');
INSERT INTO `user` VALUES ('36', '明月心', '12345678', '26', '琴音、舞蹈', '温柔善良的女子,以音乐传递爱与希望', '云裳派');
INSERT INTO `user` VALUES ('37', '程灵素', '12345678', '27', '仙法修炼、仙岛事务', '温柔善良的仙子,守护仙岛和平', '蓬莱仙岛');
INSERT INTO `user` VALUES ('38', '韩非', '12345678', '23', '学术研究、阵法修炼', '聪明睿智的年轻人,研究阵法和学术', '韩家');
INSERT INTO `user` VALUES ('40', '戚芳', '12345678', '23', '武功、家族事务', '机智勇敢的女子,为家族荣誉而战', '戚家');
INSERT INTO `user` VALUES ('41', '楚轩辕', '12345678', '28', '家族事务、剑术修炼', '家族责任重于一切的剑客', '楚家');
INSERT INTO `user` VALUES ('42', '秦王', '12345678', '35', '政务、战争', '智勇双全的帝王,统一六国的志向', '秦国');
INSERT INTO `user` VALUES ('43', '李寻欢', '12345678', '30', '剑术、侠义行侠', '聪明机智的江湖人物,正义心十足', '大宛城');
INSERT INTO `user` VALUES ('44', '唐三藏', '12345678', '45', '佛法修行、西行取经', '慈悲心肠的高僧,带领徒弟西天取经', '大唐');
INSERT INTO `user` VALUES ('45', '吴青烟', '12345678', '26', '法术修行、江湖事务', '冷艳高傲的女子,修炼法术追求江湖大业', '青云门');
- 在application.yml配置文件下,配置数据库信息(驱动、链接、用户名、密码)
spring:
#数据库连接信息
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 1234
#Mybatis配置
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
4.将UserMapper类 将其中的方法改成抽象方法,并且将类改成接口
需求1:查询所有用户,输出在控制台可以先自己分析
点击查看详细步骤
需求2:查询名字叫 陆雪琪的用户,输出在控制台
点击查看详细步骤
需求3:爱好中含有 "法术" 的用户,输出在控制台
点击查看详细步骤
在UserMapper接口中,创建selectByCondition方法,配上参数。点击查看图解
在test下的SpringbootdemoApplicationTests中添加一个
test2
的测试方法。点击查看图解在resource下创建一个和UserMapper包名的同名多级文件夹 ,并且在文件夹下创建UserMapper.xml同名文件(后缀名不一样)。点击查看图解
然后再UserMapper.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.itcast.mapper.UserMapper">
<select id="selectByCondition" resultType="com.itcast.domain.User">
SELECT * from user where hobby like concat('%',#{hobby},'%')
</select>
</mapper>
测试效果:👇

需求4:完成了需求3后,根据下面的接口描述,完成该接口的代码书写
请求参数:
- 接口作用:通过传入关键字,查询名字、爱好、描述、门派含有此关键字的用户列表
- 接口地址:localhost:8848/users/queryByCondition
- 请求方式:POST
- 参数:name=关键字
响应结果:
点击查看详细步骤
控制层,在UserController类中增加一个,queryByCondition的方法,参数为字符串name,返回值为Result,在方法中调用服务层对象的返回
List<User>
。服务层,在UserService接口创建queryByCondition的方法,并且在UserServiceImpl实现类中,调用UserMapper的代理对象,查询数据库,返回
List<User>
。持久层,考虑到语句较为复杂,Sql语句写在映射文件UserMapper.xml中,结合where和if标签做动态Sql。
打开Apifox软件,随意输入一些参数,如青云、南宫、法术、剑术等进行测试,观察返回值
👉如果你完成了上述4个需求,恭喜你👍,掌握了SpringBoot下集成Mybatis框架基本操作,接下来可以做一个小项目巩固下了! 🎉