购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第6章
数据库操作及代码生成器使用

在前几章中,已成功地完成了项目基础环境的配置。本章要建立项目所需的数据库,并与MySQL数据库建立连接。此外,还将整合EasyCode工具,以便能够快速地生成符合本项目规范的目录结构和代码。通过工具的辅助开发,可以提升开发效率,确保项目代码的书写符合规范。

6.1 数据库的创建与连接

数据库的创建可以直接在MySQL的可视化工具中创建,数据库连接的部分,Spring Boot引入了Spring Data框架实现数据库访问的抽象层。这使在项目中,只需在配置文件中配置MySQL的连接信息,如数据库URL、用户名、密码等。Spring Boot会自动根据这些配置来初始化数据库连接池和其他必要的资源,这种方式使数据库连接的管理更加便捷,无须手动处理烦琐的连接细节。

6.1.1 创建MySQL数据库

打开Navicat软件,可新建一个连接,例如,笔者创建了一个library的连接,然后使用鼠标右击library连接,从弹窗中选择“新建数据库”选项,如图6-1所示。

然后填写新建数据库的信息,数据库名为library_v1;将字符集设置为utf8mb4;将排序规则设置为utf8mb4_bin,单击“确定”按钮即可创建完成,如图6-2所示。

还有另一种使用SQL语句创建数据库的方式,单击菜单中的“查询”选项,然后单击“新建查询”按钮,如图6-3所示,输入创建数据库的SQL语句即可,代码如下:

图6-1 新建数据库

图6-2 填写数据库信息

图6-3 SQL语句创建数据库

6.1.2 Spring Boot连接MySQL

1.配置数据库连接

数据库创建完成后打开library-admin模块的application-dev.yml配置文件,本地的配置都被放在该文件中,添加MySQL数据库的连接信息,包括数据库URL、用户名、密码等,代码如下:

2.引入依赖

在父模块的pom.xml文件中添加与MySQL数据库相关的依赖声明,Spring Boot会根据这些依赖自动配置数据库连接池等资源,代码如下:

依赖版本声明完成,需要在library-common子模块的pom文件中添加MySQL驱动和连接池依赖,代码如下:

在启动项目前,library-admin需要引入common依赖,获取MySQL驱动,代码如下:

启动项目,并检查控制台打印的信息是否报错,如果没有报错,则说明已成功地配置了MySQL驱动和连接池。

6.1.3 整合MySQL监控

MySQL监控的最佳实践是采用Druid作为解决方案。Druid作为阿里云的开源项目,在功能、性能和可扩展性方面远胜于其他数据库连接池,包括DBCP和C3P0等,其强大的功能使它成为MySQL监控的首选工具。

1.配置监控属性

打开application-dev.yml配置文件,在datasource二级属性的druid下添加druid监控配置,代码如下:

2.监控平台分析

配置完成后,启动项目,在浏览器地址栏输入http://localhost:8081/api/library/druid/login.html,此时页面会显示404错误,如图6-4所示。此原因是druid-spring-boot-3-starter目前的最新版本是1.2.18,虽然适配了Spring Boot 3,但还缺少自动装配的配置文件(笔者创作本书时,该问题还未被修复)。

图6-4 访问druid监控界面

现在需要手动在resources目录下创建一个名为META-INF的目录,在该目录中再创建一个spring目录,然后创建一个名为org.springframework.boot.autoconfigure.AutoConfiguration.imports配置文件,如图6-5所示。

在配置文件中添加自动配置类,代码如下:

添加完成后,重新启动项目,再次访问http://localhost:8081/api/library/druid/login.html,就可以正常显示登录页面了,然后输入在配置文件中自定义的用户名和密码进行登录,如图6-6所示。

登录成功后,如果单击顶部菜单的“数据源”选项,则页面会显示DataSource配置的基本信息,包括用户名、链接地址、驱动等信息,如图6-7所示。

其他菜单监控界面的功能介绍如下。

图6-5 添加自动装配文件

图6-6 druid监控登录界面

图6-7 数据源监控信息界面

(1)SQL监控的主要功能是统计所有SQL语句的执行情况,例如,执行的SQL语句、执行数、执行时间等。

(2)SQL防火墙主要是SQL防御统计、表访问统计、函数调用情况及提供黑白名单的访问统计。

(3)Web应用主要监控SQL的最大并发、请求次数及事务提交数等信息。

(4)URL监控统计项目中Controller接口的访问统计及相关执行的情况。

(5)Session监控可以监控当前session的状况、创建时间、最后访问时间及访问IP地址等信息。

(6)Spring监控利用AOP对指定接口的访问时间、JDBC执行数和时间、事务提交数和回滚数等信息的监控。

(7)JSON API使用API的方式访问Druid的监控接口,返回JSON形式的数据。

6.2 通用类设计与实现

在项目开发中,通常会遇到需要在多个子模块中使用相同的功能模块的情况,例如,接口返回类、分页请求参数、常量和枚举等。为了避免重复编写代码,并提高代码的可维护性和可重用性,可以采用以下两种主要方法。

(1)遵循“不要重复自己”的原则,即尽量避免在不同地方重复编写相同的代码。通过将公共的逻辑、数据结构和行为抽取到统一的地方,确保系统中只存在一个实现,以减少错误和维护代码的成本。

(2)创建抽象层,将通用功能与具体实现分离开来。这有助于将公共的代码逻辑抽象化,从而使不同部分的代码能够共享同一套功能。例如,可以定义接口返回格式的标准模板,统一管理分页请求参数的结构,以及集中管理常量和枚举类型。

6.2.1 统一响应数据格式

统一的返回格式是指在一个应用程序或API中,所有的请求响应都遵循相同的格式,以便于客户端和服务器端之间的通信和数据交换。这种做法可以提高代码的可维护性、可读性,同时也方便了错误的处理和数据解析。

在library-common子模块中新建一个constant包,主要用来存放一些公共常量的类,在该包中创建一个Constants公共常量类,代码如下:

再新建一个response包,并创建一个Result返回类,设定如果接口请求成功,则返回200状态码,如果失败,则返回500状态码,代码如下:

6.2.2 错误码枚举类

错误码枚举类用于定义应用程序中可能出现的错误,并对这些错误码进行集中管理。使用枚举类能够更加清晰地表示不同类型的错误,使代码更易读和维护。在library-common子模块中创建一个enums包,在包中新建一个ErrorCodeEnum类,代码如下:

代码中使用了@Getter和@AllArgsConstructor两个注解,这两个注解都在Lombok库中,接下来需要添加Lombok插件和依赖。

6.2.3 Lombok安装

Lombok是一个Java库,它通过自动生成样板代码来简化Java类的编写,以提高开发效率和可读性。Lombok主要通过注解来消除冗长的getter、setter、构造函数、equals、hashCode等方法的手动编写。安装也比较简单,只需两步。

目前Lombok支持多种IDE,其中包括主流的Eclipse、IDEA、MyEclipse等。在IDEA中添加Lombok插件,如图6-8所示。

图6-8 安装Lombok插件

从插件介绍中可以看到支持哪些注解,在项目编码中会经常使用这些注解。引入Lombok依赖,在父模块的pom.xml文件中添加依赖配置,代码如下:

在ErrorCodeEnum枚举类中导入AllArgsConstructor和Getter这两个包,然后就可以正常使用了,这两个注解有什么作用?

(1)@Getter注解会自动生成getter方法。

(2)@AllArgsConstructor注解会自动生成包含所有字段的构造函数。

6.2.4 异常处理

在开发应用程序的过程中,经常会遇到各种异常情况,如数据库连接异常、网络请求异常、业务逻辑异常等。为了提高应用程序的稳定性和用户体验,需要对这些异常进行统一处理。

1.自定义异常

异常处理类主要简化在应用程序中抛出异常并记录错误码的过程,在library-common子模块中创建一个处理异常的exception包,然后在包中添加自定义类BaseException,部分代码如下:

2.全局异常处理

全局异常处理是一种应用程序中的机制,它旨在捕获应用程序中发生的所有异常,并进行一致处理,以提高应用程序的可靠性和用户体验。在定义异常处理类时涉及两个注解:@ControllerAdvice和@ExceptionHandler,其中@ControllerAdvice会拦截标注有@Controller的所有控制类;@ExceptionHandler可以作为异常处理的方法,设置value值,例如@ExceptionHandler(value=BaseException.class),表示只要异常是BaseException级别的都可以被此方法拦截。

在exception包中,添加一个全局异常处理类GlobalExceptionHandler,代码如下:

6.2.5 分页功能设计与实现

当数据量太大且同时显示在一个页面时,不仅可能会造成内存溢出,还会影响用户体验,这时就要使用分页功能将数据分割成多个页面进行显示。

1.定义分页类

在接口请求中,前端通常会将两个参数传递给接口,用于控制分页、页数和每页展示的数据条数。为了提高代码的可维护性和重用性,在需要分页的接口中,可以将这两个参数封装成一个公共的分页参数类。通过继承该分页参数类,接口可以轻松地使用这些分页参数,实现统一的分页逻辑。

在library-common子模块的constant包中新建一个BasePage类,默认每页显示10条数据,当前页为第1页,代码如下:

2.分页插件配置

MyBatis-Plus自带了分页插件,这里只需简单配置便可以实现分页功能,在library-common子模块中创建一个config配置包,然后新建一个分页配置类MybatisPlusConfig,在配置类中配置分页插件,代码如下:

3.分页数据转换工具

项目接口返给前端的数据对象类名统一为VO格式,这就涉及了对象转换,在分页接口中将查询出的实体类数据转换为VO格式的对象并输出给前端时,可以使用一个转换工具执行这个转换过程。这有助于将内部的实体类结构与对外输出的VO结构分离,保持了代码的清晰性和可维护性。

在library-common子模块中创建一个util工具包,创建一个PageCovertUtil转换类,代码如下:

在上述代码中使用了Hutool工具包中的BeanUtil.copyProperties方法实现对象属性的复制,从而将原对象的数据复制到新的对象中。

引入Hutool依赖之前,先在父模块的pom.xml文件中声明Hutool依赖版本信息,然后添加该依赖,代码如下:

6.3 整合EasyCode代码生成工具

在项目的日常开发中,大部分时间花费在编写基础的增、删、改、查(CRUD)代码。这些重复性任务消耗了大量开发时间。为了提高开发效率,本项目使用代码生成器工具,能够快速地生成标准的代码模板,从而减少手动编写重复代码的工作量。这不仅提高了开发速度,还确保了项目的代码风格和结构的一致性。

6.3.1 EasyCode简介

EasyCode是基于IntelliJ IDEA Ultimate版本开发的代码生成插件,支持自定义任意模板(Java、html、js、xml),它的初衷就是为了提高开发人员的开发效率,可直接对数据的表生成Entity、Controller、Service、Dao、Mapper。不再去手动创建每个实体类和service层及控制层等,理论上来讲只要是与数据有关的代码都可以生成。

EasyCode的特点和功能有以下几点。

(1)EasyCode提供了多种代码模板,可以根据项目需求快速生成常见的代码。例如,创建实体类、生成CRUD(增、删、改、查)操作及生成Spring Boot项目结构等。

(2)可以根据数据库表的结构,生成对应的Java类和SQL语句。

(3)支持自动生成方法、注释、属性等,减少手动编写工作。

(4)可以创建自定义代码模板,以满足项目特定的需求。

(5)支持多种编程语言。

6.3.2 安装EasyCode插件

打开IDEA开发工具,在Plugins中搜索EasyCode插件,单击Install按钮,等待安装完成,单击OK按钮,然后重启IDEA该插件才能生效,如图6-9所示。

图6-9 安装EasyCode插件

6.3.3 配置数据源

如果使用EasyCode就需要IDEA自带的数据库工具来配置数据源,IDEA连接MySQL数据库则可以分为以下几个步骤来操作。

(1)在IDEA工具的最右侧,如果单击Database选项卡,则可展开创建数据库连接窗口。在数据库连接窗口的左上角,单击“+”按钮,添加一个新的MySQL数据库连接,如图6-10所示。

(2)单击MySQL按钮,填写数据库连接配置信息。

· Host(主机名):MySQL服务器的主机名或IP地址。

· Port(端口号):MySQL服务器的端口号,默认为3306。

· Database(数据库名称):要连接的数据库名称。

· User(用户名):连接到数据库的用户名。

· Password(密码):连接到数据库的密码。

图6-10 IDEA连接MySQL数据

填写完成后,单击左下角的Test Connection按钮,对连接进行测试,如果连接成功,则会显示Succeeded提示,然后单击Apply按钮,再单击OK按钮,保存连接配置,如图6-11所示。

6.3.4 项目包结构

包结构是指一个项目的源代码和资源文件在磁盘上的组织方式和目录结构。在本项目中约定一个项目包结构,以便于代码管理、编译、打包和发布等操作。

1.创建用户表

先创建一个操作日志表,方便接下来自定义EasyCode模板的演示。使用以下语句来创建表,代码如下:

图6-11 填写MySQL连接信息

为了使项目可以更好地管理表的初始化SQL语句,在父模块的根目录下创建db文件,然后添加一个init.sql文件,将项目所有的初始化的SQL放在该文件中进行统一管理,如图6-12所示。

图6-12 创建初始化SQL文件

2.目录结构

项目包目录结构的规范应该使用有意义的名称,以便快速理解其内容和功能,遵循一致的目录结构和命名约定有助于项目的可维护性。以library-admin子模块为例,在项目中创建不同功能的包结构,如图6-13所示。

图6-13 项目包结构

在admin包下创建controller和modules两个包,以便更好地组织项目的代码。在这个结构中,controller包用于存放与前端接口相关的业务功能,而modules包则用于存放各个业务功能的具体业务逻辑。在modules包内要创建单独功能的子包,例如,用户功能的所有代码应该位于名为user的子包内,而角色功能的代码应该位于名为role的子包内。

在每个功能子包中,例如,user包中,可以进一步划分不同类别的包,以便更好地组织相关的代码。以下是user示例的目录结构。

(1)bo包存放一些入参的对象,这里主要针对前端以JSON格式传来的数据参数。

(2)entity包存放实体类。

(3)mapper目录用于存放数据访问层代码,它充当了业务逻辑和数据库之间的接口,负责数据的访问和操作。在使用MyBatis-Plus框架时,其优势在于无须为每个数据库操作写独立的方法,只需继承相应的Mapper接口。但要注意,在项目的启动类中需要使用@MapperScan注解来扫描并开启对mapper包的扫描。

(4)service为服务层,简单的理解就是对一个或者多个mapper进行再次封装,封装成一个功能服务接口。

(5)impl包存放的是服务层的业务实现类,业务的所有代码都应该在该类中实现。通过继承业务接口实现业务层的功能,其好处在于封装service层的业务逻辑有利于业务逻辑的独立性和重复利用性。

(6)struct包存放对象相互转换实现类,使用了MapStruct的代码生成器,它基于约定优于配置的方法,极大地简化了Java Bean类型之间的映射实现。

(7)vo包为视图层,其作用是将前端所要展示的数据封装起来,通常用于业务层之间的数据传递等。

(8)mapper目录存放在resource下,可编写独立的XML文件来配置SQL映射,虽然在使用MyBatis-Plus时通常不需要编写,因为它支持使用注解或者接口方法的命名规则来自动生成SQL查询,所以可以省掉编写独立XML文件的步骤。

6.3.5 自定义EasyCode模板

根据项目的包结构,由于EasyCode自带的代码模板无法满足项目的需求,所以要自定义EasyCode代码生成的模板。

那么在哪里编写模板代码呢?打开IDEA开发工具,选择File→Settings→Other Settings菜单选项,单击EasyCode选项,这样就可以看到模板导出、导入操作,以及设置作者名称等操作,如图6-14所示。

图6-14 EasyCode插件

1.EasyCode菜单功能介绍

在左侧菜单EasyCode目录下有4个子菜单,具体功能如下:

(1)Type Mapper是生成mapper.xml文件中数据库中的字段和Java中代码的字段及生成MyBatis数据之间的类型转换。最常见的就是Java中的属性property、数据库中的列名column数据类型之间的转换jdbcType。

(2)Template是最核心的内容,可在这里修改或自定义模板。Default的默认形式是MyBatis,如果使用MyBatis-Plus,则可以选择MyBatis-Plus自动生成相应代码。

(3)Column Config用来对队列进行相关配置,这里默认就好,无须改动。

(4)Global Config是全局配置,主要配置相关包的导入、公共功能、代码注释等。

2.自定义模板分组

由于没有符合项目结构的模板,所以先创建一个独有的Group Name模板分组,将项目所有的自定义模板都放在一起,方便该模板执行管理和导出等操作,组名填写完成后,单击OK按钮,即可添加成功,如图6-15所示。

图6-15 创建library-v1分组

选择library-v1分组,单击“+”按钮,创建模板,如果想要删除模板,则可选中该模板,如果单击“-”按钮,则可以删除模板。接下来新建一个生成实体类代码的模板,如图6-16所示。

图6-16 创建实体类代码模板

以生成实体类代码的语句为例,体验创建代码生成模板的用法等。可以直接将以下代码复制到图6-16的编写框中:

其中,@TableName配置表名获取的是公共配置的数据,在Global Config全局配置中要去掉表名前缀,代码如下:

其他的模板代码可以参考笔者提供的模板文件,文件会放在源代码的db下的EasyCode目录中,可直接将模板导入IDEA中,完整的模板目录如图6-17所示。

图6-17 EasyCode自定义模板目录

3.代码生成测试

模板创建完成后,使用创建的模板来生成代码,看是否可以按照自定义的项目目录结构的要求生成相关代码。打开IDEA右侧导航栏中的Database菜单,选择library_v1数据库,然后右击lib_operation_log表,单击EasyCode下的Generate Code选项,如图6-18所示。

图6-18 选择初始化代码的表

选择完后,会跳出一个弹窗,然后选择代码生成的Module(模块),也就是选择要生成在哪个项目模块中,接着选择生成包地址、使用生成代码的模板组及执行哪些模板等操作。现在先将代码生成在library-admin子模块中,如图6-19所示。

图6-19 选择模板生成代码

4.依赖包添加

等待代码生成完后,先查看生成的目录结构是否正确,如果生成正确,则接下来打开controller包中的OperationLogController类,查看代码中是否有错误,这时会发现@Valid注解报错,@Valid注解报错是由于没有添加相关的依赖,它主要用来校验前端传来的参数。打开父模块的pom.xml文件添加依赖,代码如下:

打开struct包中的OperationLogStructMapper类,@Mapper注解会报错,错误原因是没有添加mapstruct相关依赖,在父模块的pom.xml文件中添加依赖,代码如下:

添加完成,刷新一下Maven即可引入依赖。到此还有Mapper接口的扫描没有添加,否则不能将其交给Spring容器管理。在前面的章节中提过一个注解@MapperScan,将该注解放在Spring Boot应用的配置类上,在启动类上用于指定Mapper接口所在的包,代码如下:

同时也修改一下@Spring BootApplication注解扫描的路径,默认为扫描主程序所在的包及所有子包内的组件,现在改为扫描com.library包及其子包中的所有组件,代码如下:

添加完成后,启动项目,如果项目启动成功,则说明目前配置的相关信息和代码添加操作成功。

本章小结

本章内容包括项目数据库的创建、Spring Boot与MySQL的连接操作及MySQL监控管理的集成。同时还增加了项目通用的接口返回类、错误码枚举及分页管理的配置以提升项目的可维护性。最重要的是整合了EasyCode代码自动生成工具,只需几步操作就可以生成基础的CRUD代码,在项目开发中,可以节省大量的开发时间。 /IaN6niG+2MnQFAMcA2ESYj0qaz0neTCLwMZeC3uOwnxsoDqkhRFCCJhnwNibAKp

点击中间区域
呼出菜单
上一章
目录
下一章
×