引言

用户使用浏览器上的Web应用,进行注册、登录、查看和下载等功能时,发送请求给后端,后端Controller控制层接收request,然后调用Service服务层方法实现功能后,将response返回给浏览器。而Service服务层会调用Mapper数据访问层方法,Mapper会与数据库直接进行交互,将数据表映射到实体类从而获取数据。
在这里插入图片描述

一、新建Spring Boot工程

打开IDEA,New Project,选择Spring Boot快速构建Spring工程,引入Web、MyBatis、MySQL起步依赖,最后Create。
在这里插入图片描述

二、建库建表和插数据

确保本地MySQL服务启动,使用DataBase插件连接数据库,然后执行下方的SQL语句,创建数据库mybatis,然后创建数据表user,并插入6条数据。
在这里插入图片描述

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');

三、实体类:User类

User类是一个简单的Java Bean(也称为POJO,Plain Old Java Object),通常用于表示数据库中的一条记录或业务逻辑中的一个实体。在这个例子中,User类代表了一个用户实体。以下是对User类各个部分的解释:

  1. 包声明package org.example.springdemo.pojo; 这行代码声明了类所在的包名,有助于Java编译器和运行时环境组织类文件。

  2. 类声明public class User 这行代码声明了一个公开的类,名为User

  3. 成员变量:类内部定义了五个私有成员变量(id, name, age, gender, phone),分别用于存储用户的ID、姓名、年龄、性别和电话号码。

  4. 无参构造器public User() 是一个无参数的构造方法,它允许在不提供任何初始值的情况下创建User对象。这通常是JPA(Java Persistence API)或MyBatis等ORM(Object-Relational Mapping)框架在实例化实体时所需要的。

  5. 有参构造器public User(int id, String name, int age, int gender, String phone) 是一个带有参数的构造方法,允许在创建User对象时直接初始化其成员变量。

  6. Getter和Setter方法:每个成员变量都有对应的getter和setter方法,用于获取和设置变量的值。这些方法是Java Bean规范的一部分,允许外部代码以标准化的方式访问类的内部状态。

  7. toString方法@Override public String toString() 方法覆盖了Object类的toString方法,提供了一种将User对象的内部状态转换为字符串表示的方式。这通常用于调试或日志记录。

在实际应用中,User类与数据库中的user表相关联,其中每个属性都映射到表中的每个字段。

在这里插入图片描述

四、数据访问层:UserMapper接口

这段代码展示了如何使用MyBatis框架通过定义Mapper接口和注解的方式,实现对数据库的基本查询操作。MyBatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。它消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

在这个例子中,UserMapper接口定义了一个名为findById的方法,用于根据用户的ID从数据库中查询并返回一个User对象。

  • @Mapper注解:这个注解用于标识这个接口是一个MyBatis的Mapper接口,MyBatis在启动时会自动扫描这些接口并创建它们的实现,以便在应用中通过依赖注入使用。

  • @Select注解:这个注解用于指定查询数据库的SQL语句。在这个例子中,SQL语句是"select * from user where id = #{id}",意味着从user表中查询ID等于方法参数id的记录。#{id}是MyBatis的参数占位符,它会被方法调用时传入的参数值替换。

  • public User findById(int id);:这是UserMapper接口中的一个方法声明。它接受一个整型参数id,并返回一个User类型的对象。这个方法的实现由MyBatis框架在运行时动态提供,开发者无需手动编写实现代码。

在使用这个Mapper接口之前,需要在MyBatis配置文件中(通常是XML文件或Java配置类)注册这个Mapper接口,或者在Spring Boot应用中通过@MapperScan注解指定Mapper接口所在的包,以便MyBatis能够扫描到并创建这些Mapper接口的实现。

在这里插入图片描述

五、服务层:Service接口和ServiceImpl实现类

这段代码展示了一个使用Spring框架的服务层示例,其中UserService是一个接口,而UserServiceImpl是它的一个实现类。这个服务层的设计目的是为了封装业务逻辑,并通过调用数据访问层(在这个例子中是UserMapper)来与数据库进行交互。

  • UserService是一个Java接口,它定义了一个名为getUserById的方法。这个方法接受一个整型参数id,并返回一个User对象。

  • 接口是Java中一种抽象类型,它允许定义方法的签名而不实现它们。实现接口的类必须提供接口中所有方法的具体实现。

  • UserServiceImpl是一个Java类,它实现了UserService接口。这意味着它必须提供getUserById方法的具体实现。

  • @Service注解是Spring框架提供的,用于标识这个类是一个服务层的组件。Spring容器在启动时会自动扫描这些注解,并创建相应的bean实例。

  • @Autowired注解用于自动注入UserMapper的实例。UserMapper是一个数据访问层(DAO)接口,通常与MyBatis等ORM框架一起使用,用于定义数据库操作的方法。在这个例子中,UserMapper有一个名为findById的方法,它接受一个ID并返回一个User对象。

  • getUserById方法实现了UserService接口中定义的方法。它调用userMapperfindById方法,并将结果返回。

这个服务层的设计遵循了Spring框架的推荐实践,即使用接口定义服务,并使用实现类提供具体的业务逻辑。通过将数据访问逻辑封装在UserMapper接口中,服务层可以更容易地进行测试和替换,因为它不直接依赖于特定的数据库实现。此外,使用@Autowired注解可以简化bean之间的依赖注入,使代码更加简洁和易于维护。

在这里插入图片描述

六、控制层:Controller类

下面代码是一个Spring MVC的控制器类UserController,它使用了Spring Web框架的注解来定义处理HTTP请求的方法。这个控制器负责处理与用户相关的请求,并调用服务层(UserService)来获取用户信息。以下是对代码的详细解释:

  • @RestController:这是一个组合注解,它结合了@Controller@ResponseBody的功能。它表明这个类是一个Spring MVC控制器,并且控制器的每个方法返回的对象都会自动转换为JSON或XML格式的响应体。这通常用于构建RESTful Web服务。

  • @RequestMapping("/user"):这个注解用于定义控制器中所有方法的公共路径前缀。在这个例子中,任何由UserController处理的请求都将以/user作为URL的一部分。

  • @Autowired:这个注解用于自动注入UserService的实例。Spring容器会在运行时查找匹配的bean,并将其注入到userService变量中。 这样,控制器就可以调用服务层的方法来执行业务逻辑。

  • @GetMapping("/id"):这个注解是@RequestMapping的一个特化,它专门用于处理HTTP GET请求。它定义了处理请求的完整URL路径(在这个例子中是/user/id),并且由于它是在类级别@RequestMapping的基础上定义的,所以实际的路径将是/user/id

  • public User getById(int id):这是一个控制器方法,它接受一个名为id的整型参数,并返回一个User对象。方法体内部调用了userService.getUserById(id)来获取用户信息,并将结果直接返回给客户端。由于@RestController注解的存在,这个User对象会被自动转换为JSON格式的响应体。

UserController类是一个典型的Spring MVC控制器,它使用注解来定义请求处理方法和路径。通过调用服务层(UserService)的方法,控制器能够处理客户端的请求并返回相应的数据。由于使用了@RestController注解,这个控制器能够轻松地构建RESTful Web服务,将Java对象自动转换为JSON或XML格式的响应体
在这里插入图片描述

七、配置文件:application.yml

application.yml文件较原始的application.properties文件的优势在于:层次清晰关注数据

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis
    username: root
    password: root

server:
  port: 9090
  servlet:
    context-path:

在这里插入图片描述

配置项解释
  • spring.datasource.driver-class-name:指定数据库驱动类的全限定名。对于MySQL 8.x版本,建议使用com.mysql.cj.jdbc.Driver

  • spring.datasource.url:指定数据库的JDBC URL,包括协议、主机名、端口号和数据库名。

  • spring.datasource.usernamespring.datasource.password:分别指定数据库的用户名和密码。

  • server.port:指定Spring Boot应用运行的端口号。在这个例子中,应用将在9090端口上运行。

  • server.servlet.context-path:指定应用的上下文路径(Context Path)。这意味着,当部署这个应用时,访问它的URL将需要包含这个路径。例如,如果应用部署在localhost上,并且上下文路径设置为/myapp,那么访问应用的URL将是http://localhost:9090/myapp

注意事项
  1. 驱动类名:确保使用的驱动类名与MySQL JDBC驱动版本相匹配。在MySQL 8.x中,推荐使用com.mysql.cj.jdbc.Driver

  2. 安全性:在生产环境中,不要将数据库用户名和密码硬编码在配置文件中。考虑使用Spring Boot的配置管理功能,如Spring Cloud Config,或环境变量来管理敏感信息。

  3. YAML格式:YAML文件对缩进非常敏感。确保每个配置项都正确缩进,以避免解析错误。

八、运行启动类SpringDemoApplication

启动SpringBoot工程,内置的Tomcat也会启动,在浏览器中输入localhots:9090/user/id?id=1即可查询到id为1的数据。

在这里插入图片描述

“积善之家,必有余庆;积不善之家,必有余殃”。一个人的善行或恶行不仅仅对自己的人生命运有极大影响,而且会影响后代子孙。如果一个人自己邪淫做恶,那么子孙后代往往会遭殃。如果一个人自己戒邪淫并力行善事,那么子孙后代会平安、有福,而且人才辈出。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐