对于application.yml的学习
application.yml
是 Spring Boot 的核心配置文件,用于定义应用程序的配置属性。
它允许开发者通过 YAML 格式配置各种属性,如服务器端口、数据库连接、第三方服务端点等。
这些属性通过 Spring 的 @ConfigurationProperties
注解与 Java 对象绑定。
application.yml
支持不同环境的配置,如开发环境(application-dev.yml
)、测试环境(application-test.yml
)和生产环境(application-prod.yml
)
我们可以切分application,将其分成多个分文件
application-dev.yml和application-prod.yml分别表示开发环境和生产环境
内容如下
application.yml
spring:application:name: springboot3-learnprofiles:active: dev
spring:
: 这是 YAML 文件中的顶级键,表示接下来的配置都是与 Spring 框架相关的。
application:
: 这是 spring
下的一个子键,用于定义应用程序级别的配置。
name: springboot3-learn
: 这设置了应用程序的名称。在这个例子中,应用程序被命名为 "springboot3-learn"。 应用程序名称可以在日志、监控、服务发现等场景中使用。
profiles:
: 这是另一个 spring
下的子键,用于配置 Spring 的 profiles 功能。
active: dev
: 这指定了当前激活的 profile 是 "dev"(开发环境)
application-dev.yml
server:port: 8000# springdoc-openapi项目配置
springdoc:swagger-ui:path: /swagger-ui.htmltags-sorter: alphaoperations-sorter: alphaapi-docs:path: /v3/api-docsgroup-configs:- group: 'default'paths-to-match: '/**'packages-to-scan: net.chatmindai.springboot3learn.controller# knife4j的增强配置,不需要增强可以不配
knife4j:enable: truesetting:language: zh_cnspring:datasource:url: jdbc:mysql://124.223.65.138:38306/springboot3learn?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghaiusername: springboot3learnpassword: jhYWm3YHh6GGKppY
这段代码可以分为四段,分别起到
设置应用程序运行的端口为 8000。
配置 Swagger UI 和 OpenAPI 文档。设置 Swagger UI 的路径,API 文档路径,以及要扫描的包。
启用 Knife4j(一个 Swagger 增强工具)并设置语言为中文。
配置 MySQL 数据库连接。指定数据库 URL、用户名和密码。
application-prod.yml
server:port: 80
knife4j:enable: false
在application.yml代码中,active: dev用来激活开发环境的代码
- 你可能会有多个配置文件,如
application-dev.yml
,application-prod.yml
等。 - 设置
active: dev
会使 Spring Boot 加载application-dev.yml
中的配置。 - 这允许你为不同的环境(如开发、测试、生产)维护不同的配置,而无需更改代码。
- 总而言之,便于维护,起到一个类似于封装的作用。
application各种环境的工作原理
application.yml
包含默认配置。
application-dev.yml
包含开发环境特有的配置。
当应用程序启动时,它会加载 application.yml
和 application-dev.yml
。(应用程序启动时激活了 dev
Profile)
应用程序将使用 application-dev.yml
中定义的配置属性。
创建并连接数据库
我们引入两个依赖,用来集成 MyBatis-Plus,利用其增强功能来简化数据库操作,和通过java连接数据库。
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.7</version>
</dependency>
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope>
</dependency>
接下来我们导入数据库
使用如下mysql语句
-- auto-generated definition
create table demo_user
(id bigint auto_increment comment '主键ID'primary key,name varchar(50) not null comment '用户名称,长度2-50个字符',age int not null comment '用户年龄,0-150岁',email varchar(255) not null comment '用户邮箱地址',phone_number varchar(20) null comment '用户手机号,格式:1开头的11位数字',birth_date date null comment '用户出生日期',plan_date date null comment '计划日期,必须是未来的日期',score double null comment '用户分数,必须为正数',hobbies json null comment '用户兴趣爱好列表,1-5项',agree_terms tinyint(1) not null comment '是否同意服务条款',create_at datetime default CURRENT_TIMESTAMP null comment '记录创建时间',update_at datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '记录最后更新时间'
)comment '演示用户信息表' collate = utf8mb4_unicode_ci;
再找到之前创建的mysql表,生成mybatis-plus注解
我们可以看到生成了上述这几个类
我们来一个一个仔细分析
- 通过 MyBatis-Plus,可以很容易地对
User
表进行 CRUD(创建、读取、更新、删除)操作。 - MyBatis-Plus 提供了代码生成器,可以自动生成实体类、Mapper 映射文件、Mapper 接口和 Service 接口,从而简化数据库操作代码的编写。
一.User.java
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;/*** 演示用户信息表* @TableName demo_user*/
@TableName(value ="demo_user")
@Data
public class User implements Serializable {/*** 主键ID*/@TableId(type = IdType.AUTO)private Long id;/*** 用户名称,长度2-50个字符*/private String name;/*** 用户年龄,0-150岁*/private Integer age;/*** 用户邮箱地址*/private String email;/*** 用户手机号,格式:1开头的11位数字*/private String phoneNumber;/*** 用户出生日期*/private Date birthDate;/*** 计划日期,必须是未来的日期*/private Date planDate;/*** 用户分数,必须为正数*/private Double score;/*** 用户兴趣爱好列表,1-5项*/private Object hobbies;/*** 是否同意服务条款*/private Integer agreeTerms;/*** 记录创建时间*/private Date createAt;/*** 记录最后更新时间*/private Date updateAt;@TableField(exist = false)private static final long serialVersionUID = 1L;
}
@TableName("demo_user")
:指定这个类对应的数据库表名为 demo_user
。
@Data
:来自 Lombok 库,自动生成类的所有 getter 和 setter 方法,以及构造函数、equals、hashCode 和 toString 方法。
@TableId(type = IdType.AUTO)
:指定 id
字段作为主键,并使用数据库的自动增长(AUTO)策略。
Serializable
接口实现使得 User
类的对象可以被序列化和反序列化,这对于对象在网络传输或存储到文件/数据库中是必要的。
二.UserMapper.java
import com.example.springboot3learn.entity.user.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;/**
* @author 徐子昂的电脑
* @description 针对表【demo_user(演示用户信息表)】的数据库操作Mapper
* @createDate 2024-10-28 11:43:02
* @Entity com.example.springboot3learn.entity.user.DemoUser
*/
public interface UserMapper extends BaseMapper<User> {}
这段代码义了一个名为 UserMapper
的接口,它用于执行对数据库表 demo_user
的数据库操作。导入了 MyBatis-Plus 提供的 BaseMapper
接口,它提供了基本的数据库操作方法。
Basemapper接口
BaseMapper
接口提供了增删改查(CRUD)操作的基本方法,如 insert
、deleteById
、upd
以下是 BaseMapper
接口提供的一些常用方法:
insert(T entity)
:插入一条记录。deleteById(Serializable id)
:根据主键删除一条记录。deleteByIds(Collection<? extends Serializable> ids)
:根据主键集合删除多条记录。updateById(T entity)
:根据主键更新一条记录。selectById(Serializable id)
:根据主键查询一条记录。selectBatchIds(Collection<? extends Serializable> ids)
:根据主键集合查询多条记录。selectOne(T queryWrapper)
:根据条件查询一条记录。selectList(T queryWrapper)
:根据条件查询多条记录。selectPage(IPage<T> page, T queryWrapper)
:根据条件分页查询记录。
ateById
、selectById
等,这些方法可以直接在实体类上使用。
通过继承 BaseMapper
接口,开发者可以直接使用这些方法来操作数据库,而不需要编写具体的 SQL 语句。例如:
public interface UserMapper extends BaseMapper<User> {// 无需额外的方法定义,直接使用BaseMapper提供的方法
}
然后,在服务层或控制器层,可以直接注入 UserMapper
并使用它提供的方法:
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User getUserById(Long id) {return userMapper.selectById(id);}// 其他数据库操作方法...
}
例如上述代码 private UserMapper userMapper;
定义了一个 UserMapper
类型的私有成员变量,用于在 UserService
类中执行数据库操作。
BaseMapper
接口极大地简化了数据库操作的开发工作,提高了开发效率。
三.UserService.java
import net.chatmindai.springboot3learn.entity.user.User;
import com.baomidou.mybatisplus.extension.service.IService;/**
* @author zhangkun
* @description 针对表【demo_user(演示用户信息表)】的数据库操作Service
* @createDate 2024-10-08 14:41:15
*/
public interface UserService extends IService<User> {}
定义了一个 UserService
接口,它扩展了 MyBatis-Plus 提供的 IService
接口
MyBatis-Plus 的 IService
接口
IService
是 MyBatis-Plus 提供的一个服务层接口,它为开发者提供了一系列服务层操作方法,这些方法封装了基本的 CRUD(创建、读取、更新、删除)操作。以下是 IService
接口提供的一些关键点:
- 泛型支持:
IService
接口是泛型的,可以接受任何实体类作为参数,这使得它可以适用于不同的表和实体类。 - 扩展性:
IService
接口提供了基本的 CRUD 方法,但开发者也可以根据需要添加自定义的方法。 - 与
BaseMapper
的关系:IService
接口通常与BaseMapper
接口一起使用,BaseMapper
提供了数据访问层的操作,而IService
提供了业务逻辑层的操作。
UserService
接口的作用
- 业务逻辑封装:
UserService
接口将demo_user
表的数据库操作封装在服务层,使得业务逻辑与数据访问层分离。 - 服务层操作:通过扩展
IService<User>
,UserService
接口可以提供基本的 CRUD 操作,如添加、删除、更新和查询用户信息。 - 自定义方法:开发者可以在
UserService
接口中添加自定义方法,以实现更复杂的业务逻辑。
四.UserServiceImpl.java
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import net.chatmindai.springboot3learn.entity.user.User;
import net.chatmindai.springboot3learn.service.UserService;
import net.chatmindai.springboot3learn.mapper.UserMapper;
import org.springframework.stereotype.Service;/**
* @author zhangkun
* @description 针对表【demo_user(演示用户信息表)】的数据库操作Service实现
* @createDate 2024-10-08 14:41:15
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>implements UserService{}
类定义
@Service
注解用于标识 UserServiceImpl
类是一个服务层组件。
UserServiceImpl
类扩展了 ServiceImpl<UserMapper, User>
类,这意味着它继承了 MyBatis-Plus 提供的服务层实现类的功能。
UserServiceImpl
类实现了 UserService
接口,它必须提供接口中定义的所有方法的实现。
MyBatis-Plus 的 ServiceImpl
类
ServiceImpl
类是 MyBatis-Plus 提供的一个服务层实现类的基类,它封装了基本的 CRUD 操作,并提供了一些额外的服务层方法。ServiceImpl
类需要两个泛型参数:
- 第一个参数是 Mapper 接口类型,这里传入
UserMapper
。 - 第二个参数是实体类类型,这里传入
User
。
五.UserMapper.xml
这段代码是 MyBatis 的 Mapper XML 配置文件的一部分,它定义了与数据库表 demo_user
的映射关系。
我们来看代码,接下来拆分逐一分析
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="net.chatmindai.springboot3learn.mapper.UserMapper"><resultMap id="BaseResultMap" type="net.chatmindai.springboot3learn.entity.user.User"><id property="id" column="id" jdbcType="BIGINT"/><result property="name" column="name" jdbcType="VARCHAR"/><result property="age" column="age" jdbcType="INTEGER"/><result property="email" column="email" jdbcType="VARCHAR"/><result property="phoneNumber" column="phone_number" jdbcType="VARCHAR"/><result property="birthDate" column="birth_date" jdbcType="DATE"/><result property="planDate" column="plan_date" jdbcType="DATE"/><result property="score" column="score" jdbcType="DOUBLE"/><result property="hobbies" column="hobbies" jdbcType="OTHER"/><result property="agreeTerms" column="agree_terms" jdbcType="TINYINT"/><result property="createAt" column="create_at" jdbcType="TIMESTAMP"/><result property="updateAt" column="update_at" jdbcType="TIMESTAMP"/></resultMap><sql id="Base_Column_List">id,name,age,email,phone_number,birth_date,plan_date,score,hobbies,agree_terms,create_at,update_at</sql>
</mapper>
一,XML 声明和 DTD
<?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">
<?xml version="1.0" encoding="UTF-8"?>
:这是 XML 文件的声明,指定了 XML 的版本和编码方式。
<!DOCTYPE mapper ...>
:这是一个文档类型声明(DTD),指定了 MyBatis Mapper XML 文件的 DTD,确保了 XML 文件的正确性。
二,<mapper>
标签
<mapper namespace="net.chatmindai.springboot3learn.mapper.UserMapper">
<mapper>
标签定义了整个 Mapper 文件的根元素。namespace
属性指定了 Mapper 接口的完全限定名,这里指定了UserMapper
接口的包路径和类名。
三,<resultMap>
标签
<resultMap id="BaseResultMap" type="net.chatmindai.springboot3learn.entity.user.User"><!-- resultMap 配置 -->
</resultMap>
<resultMap>
标签定义了实体类与数据库表的映射关系。id
属性是 resultMap 的唯一标识符。type
属性指定了 resultMap 映射到的实体类,这里指定了User
类的完全限定名。
如何理解上述代码中“id 属性是 resultMap 的唯一标识符”
- 唯一性:
id
属性的值在整个 MyBatis 配置文件中必须是唯一的。这意味着在一个 MyBatis 配置文件中,不能有两个<resultMap>
标签具有相同的id
值。 - 引用:其他
<select>
、<insert>
、<update>
或<delete>
标签可以通过resultMap
属性引用<resultMap>
标签,以指定使用哪个 resultMap 来映射查询结果。
我们来举个例子
假设你有两个不同的实体类 User
和 Address
,它们各自有自己的 resultMap。在 MyBatis 配置文件中,你可以这样定义它们:
<resultMap id="UserResultMap" type="com.example.entity.User"><id property="id" column="id" /><result property="name" column="name" /><result property="age" column="age" />
</resultMap><resultMap id="AddressResultMap" type="com.example.entity.Address"><id property="id" column="id" /><result property="street" column="street" /><result property="city" column="city" />
</resultMap>
在这个例子中,UserResultMap
和 AddressResultMap
是两个不同的 resultMap,它们分别对应 User
和 Address
实体类。它们的 id
属性值是唯一的,分别是 "UserResultMap"
和 "AddressResultMap"
。
引用 resultMap
在查询语句中,你可以通过 resultMap
属性来指定使用哪个 resultMap 来映射查询结果。例如:
<select id="selectUserById" resultMap="UserResultMap">SELECT id, name, age FROM users WHERE id = #{id}
</select>
在这个 <select>
标签中,resultMap
属性的值是 "UserResultMap"
,这意味着查询结果将使用 UserResultMap
来映射到 User
实体类。
四.<id>
和 <result>
标签
<id property="id" column="id" jdbcType="BIGINT"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<!-- 其他 result 标签 -->
<id>
和<result>
标签用于定义实体类属性与数据库列的映射。property
属性指定了实体类中的属性名。column
属性指定了数据库表中的列名。jdbcType
属性指定了列的数据类型,这对于 MyBatis 生成正确的 SQL 语句很重要。
五.<sql>
标签
<sql id="Base_Column_List">id,name,age,email,phone_number,birth_date,plan_date,score,hobbies,agree_terms,create_at,update_at
</sql>
<sql>
标签定义了一个可重用的 SQL 片段。id
属性是 SQL 片段的唯一标识符。<sql>
中的内容是一个 SQL 语句,这里定义了基本的列列表。
总结
这段 Mapper XML 配置文件定义了 User
实体类与数据库表 demo_user
的映射关系,包括实体类属性与数据库列的映射,以及一个可重用的列列表。通过这个配置,MyBatis 可以将 User
实体类与数据库表进行映射,并执行相应的 SQL 语句。
然后需要给启动类加一个注解用于扫描 @MapperScan("net.chatmindai.springboot3learn.mapper")
mport org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.example.springboot3learn.mapper")
public class Springboot3LearnApplication {public static void main(String[] args) {SpringApplication.run(Springboot3LearnApplication.class, args);}}
关于上述文件的交互作用
User.java
定义了用户的数据结构。UserMapper.java
定义了与数据库表交互的方法。UserMapper.xml
定义了实体类与数据库表的映射关系。UserService.java
定义了用户管理的业务逻辑方法。UserServiceImpl.java
实现了用户管理的业务逻辑,并调用UserMapper
接口来执行数据库操作。