Java阶段四Day03
文章目录
- Java阶段四Day03
- 数据处理基本流程
- 代码编写顺序
- 开发DAO层,添加的依赖项
- 配置数据源
- 任务拆解
- 内容管理
- MySQL中的数据类型和Java属性的类型对照
- 关于MyBatis Plus
- MyBatis Plus的基本使用
- 关于MyBatis Plus的使用建议汇总如下
- 自动更新时间
- 关于Profile配置
- 关于YAML配置
数据处理基本流程
Controller、Service、DAO(Mapper)通常是MVC框架中最常见的三个层级。
- Controller主要负责接收请求,处理请求,将请求交给Service层。
- Service层主要负责业务逻辑的处理,处理Service层中的方法的时候,往往需要与数据库进行交互,通常是通过Mapper层来实现。
- Mapper层主要负责数据库的读写操作,如增删改查等,通常使用Mybatis作为ORM框架。
基本的流程如下:
-
Controller层接收请求并调用相应的Service层方法。
-
Service层接收Controller层传来的请求,处理业务逻辑,并调用Mapper层进行数据操作。
-
Mapper层根据Service层传来的请求,进行数据库操作。
-
Mapper层将操作结果返回给Service层。
-
Service层接收到Mapper层的返回结果,进一步处理并将结果返回给Controller层。
-
Controller层接收到Service层返回的结果,将结果展示给用户。
代码编写顺序
- 通常,应该先开发DAO层,再开发Service层,再开发Controller层
- 由于Controller是Service的调用者,应该先开发Service层,再开发Controller层
- 由于Service是DAO的调用者,应该先开发DAO层,再开发Service层
开发DAO层,添加的依赖项
在pom.xml
中添加以下依赖项
<dependencies>
<!--SpringBoot基础依赖项-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Lombok:便捷的编写POJO类 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<!-- Druid:数据库连接池框架 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.16</version>
</dependency>
<!-- MyBatis整合Spring Boot的依赖项 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!-- MyBatis Plus整合Spring Boot的依赖项 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.0</version>
</dependency>
<!-- PageHelper:专用于MyBatis的分页框架 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<!--SpringBoot测试依赖项-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
配置数据源
spring.datasource.url=jdbc:mysql://localhost:3306/teashop?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
spring.datasource.username=root
spring.datasource.password=root
# 设置MyBatis框架的映射(Mapper)配置文件的位置
mybatis.mapper-locations=classpath:mappers/*.xml
任务拆解
-
多张数据表,应该先开发基础数据的相关功能,再开发其它数据的相关功能
- 例如:类别是文章的基础数据,必须先有类别,再有文章;例如文章是评论的基础数据,必须先有文章,再有评论
-
每种数据,大多情况下,先开发增加相关的功能,再开发查询相关的功能,再开发删除相关的功能,最后开发修改相关的功能
-
每个功能,大多情况下,先开发DAO层,再开发Service层,再开发Controller
内容管理
内容管理的开发任务大致是:
- 标签管理:新增标签 / 查询标签列表 / 查询某标签详情 / 删除标签 / 修改标签 / 其它
- 类别管理:新增类别 / 查询类别列表 / 查询某类别详情 / 删除类别 / 修改类别 / 其它
- 文章管理:文章标签 / 查询文章列表 / 查询某文章详情 / 删除文章 / 修改文章 / 其它
- 评论管理:(暂无)
- 文章、评论顶踩管理:(暂无)
MySQL中的数据类型和Java属性的类型对照
MySQL中的数据类型 | Java属性的类型 |
---|---|
tinyint 、smallint 、int | Integer |
bigint | Long |
char 、varchar 、text 系列 | String |
datatime | LocalDateTime |
decimail | BigDecimal |
- POJO类型的编写规范有:
- 各属性均是
private
权限 - 各属性均存在规范命名且
public
权限的Setters
&Getters
- 存在基于全部属性的
hashCode()
与equals()
方法,且,如果2个对象的类型相同、各属性值也全部相同,则必须返回相同的hashCode()
,且equals()
对比结果为true - 实现
Serializable
接口
- 各属性均是
- 许多框架都会默认你的代码是遵守这些规范的,所以,有些框架在实现有些效果时,会自动的调用
Setters
&Getters
方法,或其它方法,或转换类型为Serializable
- 另外,为了便于查看对象的各属性值,还建议添加
toString()
方法
关于MyBatis Plus
MyBatis Plus
(简称MP)是一个MyBatis
的增强工具,已连续5年 (2017、2018、2019、2020、2021)获得“OSC年度最受欢迎中国开源软件”奖,MyBatis Plus
在MyBatis
的基础上只做增强,不做改变- 其主要特性有:
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作
- 强大的CRUD操作:内置通用Mapper、通用Service,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用需求
- MyBatis Plus主要特性有(续):
- 支持Lambda形式调用:通过Lambda表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持主键自动生成:支持多达4种主键策略(内含分布式唯一ID生成器―Sequence) ,可自由配置,完美解决主键问题
- 支持
ActiveRecord
模式:支持ActiveRecord
形式调用,实体类只需继承Model类即可进行强大的CRUD操作 - 支持自定义全局通用操作:支持全局通用方法注入(write once, useanywhere)
- 内置代码生成器:采用代码或者Maven插件可快速生成
Mapper、Model
、Service.Controller
层代码,支持模板引擎,更有超多自定义配置等您来使用
MyBatis Plus的基本使用
MyBatis Plus默认会在classpath
下的mapper文件夹中查找配置SQL语句的XML文件,如果你使用其它名称的文件夹,需要在配置文件中通过mybatis-plus.mapper-locations
属性来指定,例如:
mybatis-plus:
mapper-locations: classpath: mappers/**/*.xml
关于MyBatis Plus的使用建议汇总如下
- 插入单条数据时,使用
MyBatis Plus
提供的方法 - 批量插入数据时,自定义方法并配置映射的SQL语句
- 根据id删除单条数据时,使用
MyBatis Plus
提供的方法 - 根据id批量删除数据时,使用
MyBatis Plus
提供的方法 - 更新数据时,使用
MyBatis Plus
提供的方法 - 统计查询时,使用
MyBatis Plus
提供的方法 - 除了统计查询以外的所有查询,都自定义方法并配置映射的SQL语句
自动更新时间
使用MyBatis Plus 自动更新创建时间、修改时间
//___________添加时间组件___________
@Component
public class TimeMetaObjectHandler implements MetaObjectHandler {
public static final String FIELD_CREATE_TIME = "gmtCreate";
public static final String FIELD_UPDATE_TIME = "gmtModified";
@Override
public void insertFill(MetaObject metaObject) {
LocalDateTime now = LocalDateTime.now();
this.setFieldValByName(FIELD_CREATE_TIME,now,metaObject);
this.setFieldValByName(FIELD_UPDATE_TIME,now,metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
LocalDateTime now = LocalDateTime.now();
this.setFieldValByName(FIELD_UPDATE_TIME,now,metaObject);
}
}
//___________实体类中添加___________
/**
* 数据创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime gmtCreate;
/**
* 数据最后修改时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime gmtModified;
关于Profile配置
-
以连接数据库的配置为例,localhost、3306、用户名、密码等,当开发完成后,可能会有专门的测试人员对此项目进行测试,测试时使用的MySQL基本上不会是当前开发使用的MySQL,则以上属性的值都需要修改,当测试通过后,项目正式上线,使用的MySQL又会不同,则各属性值需要再次修改…即使全部改完了,项目可能需要进入下一阶段的开发,以上各属性值又需要改回成开发时的配置值!在开发实践中,除了连接数据库的配置信息以外,其它配置也可能会根据项目的运行环境不同,而使用不同的配置值
-
Spring框架提供了Profile配置的机制,允许同时存在好几套配置文件,这些配置文件默认是可以不激活的(默认是无效的),当需要使用哪套配置,就激活哪套配置文件即可,这样的配置文件称之为Profile配置
-
Spring Boot框架很好的支持了Profile配置,其规则是:
application.properties
是主配置文件,其中的所有配置都是默认加载的- 以
application-自定义名称.properties
作为文件名的全部是Profile配置,默认是不加载的,必须激活这些文件中的配置才会被加载 - 在
application.properties
(主配置文件)中,使用spring.profiles.active
属性,可以激活Profile配置,此属性的值就是Profile配置的文件名的自定义部分,如果有多个Profile配置需要激活,使用逗号分隔即可 - 如果在
application.properties
(主配置文件)中,与在Profile配置中,存在完全相同的属性的配置,则以Profile配置为准,根据使用经验,对于多个Profile配置,作用域范围越小越优先
关于YAML配置
YAML是一种编写配置文件的语法,表现为以.yml
或.yaml
作为扩展名的文件相比.properties
文件,其语法的改变有:
- 原属性名中有小数点的部分,改为使用冒号+换行后空2格
- 原属性名与属性值使用等于号分隔,改为使用冒号+1个空格
- 如果多个配置中, 属性名有相同的部分,则不必配置相同的部分,保持对应的空格(缩进)即可
在Spring Boot中,关于配置文件的优先级,一般遵循以下规则:
application.properties
文件的优先级高于application.yml
文件。- 同一配置属性在不同配置文件中的优先级,以第一个被加载的文件为准。
- 配置文件中的配置属性可以通过Spring Boot提供的多种方式进行覆盖,例如命令行参数、环境变量等。
如果既有application.properties
文件又有application.yml
文件,并且两个文件中都配置了spring.profiles.active
属性,那么在启动应用程序时,spring.profiles.active
属性的值将总是以application.properties
文件中的配置值为准。但是,如果使用了命令行参数或环境变量对spring.profiles.active
属性进行了设置,那么这会覆盖application.properties
和application.yml
文件中的配置值。
其实,Spring系列框架并不支持YAML语法的配置文件,需要添加snakeyaml
工具包,在Spring Boot的基础依赖项中,已经包含此工具包,所以,在基于Spring Boot框架的项目中可以支持使用YAML配置时,也支持Profile配置, 规则完全相同,只是文件扩展名与文件内的配置语法不同
application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/teashop?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.druid.initial-size=5
spring.datasource.druid.max-active=50
mybatis-plus.mapper-locations=classpath:mappers/**/*.xml
application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/teashop?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
username: root
password: root
druid:
initial-size: 5
max-active: 50
mybatis-plus:
mapper-locations: classpath:mappers/**/*.xml