苏州市住房城乡建设局网站,免费h5游戏制作平台,电子商务网站 整站 psd,下载网站模板数据库准备#xff1a;
在上一次Spring Boot Vue3 前后端分离 实战 wiki 知识库系统一---Spring Boot项目搭建已经将SpringBoot相关的配置环境给搭建好了#xff0c;接下来则需要为咱们的项目创建一个数据库。
1、mysql的安装#xff1a;
关于mysql的安装这里就…数据库准备
在上一次Spring Boot Vue3 前后端分离 实战 wiki 知识库系统一---Spring Boot项目搭建已经将SpringBoot相关的配置环境给搭建好了接下来则需要为咱们的项目创建一个数据库。
1、mysql的安装
关于mysql的安装这里就不过多说明了这块在当时https://www.cnblogs.com/webor2006/p/14984451.html的学习中已经安装好了 目前服务是暂停状态貌似我点“Start MySQL Server”启动不了需要用如下命令
sudo /usr/local/mysql/support-files/mysql.server start 此时就成功启动mysql服务了 2、连接mysql
然后接下来用工具连接一下mysql我这用的是“Navicat Premium”这款软件 3、创建数据库
接下来创建一个数据库 其中utf8mb4是真正的utf8可以存放表情符号则utf8它是伪uft8三个字节不支持表情符号。 IDEA数据库插件配置
通常我们都会用一个三方的数据库软件来进行数据库数据的查看但是其实也可以借助IntelliJ IDEA自带的它进行数据库连接的配置 这样就省得来回切窗口直接在IDE中进行数据库数据的查看这也挺方便的所以接下来配置一下 目前此库中还木有表接下来创建一张表
drop table if exists demo;
create table demo (id bigint not null comment id,name varchar(50) comment 名称,primary key (id)
) engineinnodb default charsetutf8mb4 comment测试;insert into demo (id, name) values (1, 测试); 如果想查看表中的数据可以直接双击就会有一个结果窗口出来 是不是也挺方便的而且这个还免费最主要是不用切换窗口。另外还有一个比较好用的功能就是我们新建的sql文件可以直接进行执行最终就会到已连接的数据库表中比如 集成持久层框架Mybatis
集成Mybatis
接下来需要集成持久层框架也就是跟数据库打交道的这一层通常持久层框架有两个Mybatis和Hibernate 其中Mybatis是半自动的需要我们自己写sql而Hibernate是全自动的不需要咱们写sql我记得当年ssh框架盛行时学这玩意可费劲了这里我们选择Mybatis。
1、添加依赖 !-- 集成mybatis--dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.1.3/version/dependency!-- 集成mysql连接 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.22/version/dependency 2、配置数据源
# 增加数据库连接
spring.datasource.urljdbc:mysql://localhost/wiki?characterEncodingUTF8autoReconnecttrueserverTimezoneAsia/ShanghaiallowMultiQueriestrue
spring.datasource.usernameroot
spring.datasource.password你自己的用户名密码
spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver 3、新建数据库对应的实体 4、新建数据库操作层 其实这一层就是熟知的dao层由于之后会使用Mybatis的代码生成器功能生成的包名就中mapper所以这里也取名叫mapper。
5、定义接口对应的SQL
对于这个list查询所有demo表中的数据那它的具体sql是啥呢这里就需要到这块xml中进行定义了 ?xml version1.0 encodingUTF-8?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.cexo.wiki.mapper.DemoMapperselect idlist resultTypecom.cexo.wiki.domain.Demoselect id, name from demo/select
/mapper
这块的代码基本固定直接拷过来就成其中有个注意的地方就是这个sql中是用的反斜线。
6、free mybatis tool插件安装
有木有发现对于mybatis中的这个xml配置你想从这块跳到具体的方法定义是比较麻烦的 当然你可以直接先定位到DemoMapper主个类然后再去定位到list()这个方法但是有一个更加方便的方式就是安装一个这么个插件 所以咱们安装试一下 试一下效果 嗯挺好用的。
7、增加持久层扫描注解MapperScan
对于咱们定义的这个持有层的接口对于Spring Boot而言它是不知道的所以需要在这增加这么一个注解 8、配置mybatis所有mapper.xml所在的路径
对于我们配置的这块文件 那SpringBoot是如何知道该xml就是要执行的SQL呢同样需要进行配置一下
# 配置mybatis所有Mapper.xml所在的路径
mybatis.mapper-locationsclasspath:/mapper/**/*.xml 演示查询test表
mybatis的配置一切就绪接下来咱们来使用一下是否能进行数据库的操作当然需要弄个接口来演示下。
1、新建service
为了将我们的DemoMapper接口应用上需要新建一个service主要是处理业务逻辑 而要想让它被SpringBoot管理类上需要加个注解 接着咱们来定义一个方法刚好跟DemoMapper定义的list()对应 其中对于demoMapper这上成员变量木有实例化对吧是因为还得加载注解将其注入 另外还有可使用springboot自身的注入注解 这块咱们选择Resource。
2、将service使用到controller上
接下来咱们则需要回到Controller中来调用这个service如下 3、运行
接下来咱们做一下测试还是回到test.http这个类中 集成Mybatis官方代码生成器
概述
在上面我们已经成功的集成了Mybatis到工程中了有木有发现步骤还是比较多的需要准备这么多东东 有木有发现其实这些类起名都是以Demo开头其实Mybatis官方已经给我们自动生成这些模板代码用来加速我们平常的开发所以下面就来看一下如何自动生产这些类。
集成Mybatis Generator
1、添加依赖
!-- mybatis generator 自动生成代码插件 --plugingroupIdorg.mybatis.generator/groupIdartifactIdmybatis-generator-maven-plugin/artifactIdversion1.4.0/versionconfigurationconfigurationFilesrc/main/resources/generator/generator-config.xml/configurationFileoverwritetrue/overwriteverbosetrue/verbose/configurationdependenciesdependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.22/version/dependency/dependencies/plugin 2、配置generator-config.xml生成规则
其中代码生成的规则是依赖于这么一个xml文件 所以咱们在这个指定的目录中新建这么一个文件 其内容这里是一个模板代码如下
?xml version1.0 encodingUTF-8?
!DOCTYPE generatorConfigurationPUBLIC -//mybatis.org//DTD MyBatis Generator Configuration 1.0//ENhttp://mybatis.org/dtd/mybatis-generator-config_1_0.dtdgeneratorConfigurationcontext idMysql targetRuntimeMyBatis3 defaultModelTypeflat!-- 自动检查关键字为关键字增加反引号 --property nameautoDelimitKeywords valuetrue/property namebeginningDelimiter value/property nameendingDelimiter value/!--覆盖生成XML文件--plugin typeorg.mybatis.generator.plugins.UnmergeableXmlMappersPlugin /!-- 生成的实体类添加toString()方法 --plugin typeorg.mybatis.generator.plugins.ToStringPlugin/!-- 不生成注释 --commentGeneratorproperty namesuppressAllComments valuetrue//commentGeneratorjdbcConnection driverClasscom.mysql.cj.jdbc.DriverconnectionURLjdbc:mysql://localhost/wiki?serverTimezoneAsia/ShanghaiuserIdrootpassword你的密码/jdbcConnection!-- domain类的位置 --javaModelGenerator targetProjectsrc/main/javatargetPackagecom.cexo.wiki.domain/!-- mapper xml的位置 --sqlMapGenerator targetProjectsrc/main/resourcestargetPackagemapper/!-- mapper类的位置 --javaClientGenerator targetProjectsrc/main/javatargetPackagecom.cexo.wiki.mappertypeXMLMAPPER/table tableNamedemo domainObjectNameDemo//context
/generatorConfiguration
其中需要更改的地方主要是这几个地方 这块根据自己的项目情况再来修改既可。
3、增加启动命令
代码生成器的配置一切ok接下来则需要执行生成命令这里在run这块增加一个生成命令如下 4、测试生成效果
接下来咱们来看一下自动生成mybais的相关代码的效果 由于我们之前已经手动创建了相关mybatis的类了所以这里再生成时会提示已经存在相关文件了 其中有一个这个类貌似不知道有何意义 这个在之后会用到的到时再说其中DemoMapper生成一大堆通用的数据表的操作
package com.cexo.wiki.mapper;import com.cexo.wiki.domain.Demo;
import com.cexo.wiki.domain.DemoExample;
import java.util.List;
import org.apache.ibatis.annotations.Param;public interface DemoMapper {long countByExample(DemoExample example);int deleteByExample(DemoExample example);int deleteByPrimaryKey(Long id);int insert(Demo record);int insertSelective(Demo record);ListDemo selectByExample(DemoExample example);Demo selectByPrimaryKey(Long id);int updateByExampleSelective(Param(record) Demo record, Param(example) DemoExample example);int updateByExample(Param(record) Demo record, Param(example) DemoExample example);int updateByPrimaryKeySelective(Demo record);int updateByPrimaryKey(Demo record);
}
要是自己手写得费死了劲了所以能利用这个代码生成器可以大大的增加开发效率。
5、演示demo表列表查询
接下来咱们用新生成的再来测一下看是否好使还是以list接口为例目前报错了 需要更改一下 它表示查所有其中这个方法的参数就是上面所生成的DemoExample不传的话就是查所有最终运行当然都正常啦这里就不演示了。
6、优化Controller代码
最后对于Controller还有一个细节待优化就是 这样就可以在定义接口时将公共的路径给省掉了。
电子书列表查询接口开发
电子书表结构设计
接下来则来正式进行电子书的开发先来进行表结构的设计这里其实可以从最终效果图中可以大致感受到它的结构 这里就直接给出sql了
# 电子书表
drop table if exists ebook;
create table ebook (id bigint not null comment id,name varchar(50) comment 名称,category1_id bigint comment 分类1,category2_id bigint comment 分类2,description varchar(200) comment 描述,cover varchar(200) comment 封面,doc_count int not null default 0 comment 文档数,view_count int not null default 0 comment 阅读数,vote_count int not null default 0 comment 点赞数,primary key (id)
) engineinnodb default charsetutf8mb4 comment电子书;insert into ebook (id, name, description) values (1, Spring Boot 入门教程, 零基础入门 Java 开发企业级应用开发最佳首选框架);
insert into ebook (id, name, description) values (2, Vue 入门教程, 零基础入门 Vue 开发企业级应用开发最佳首选框架);
insert into ebook (id, name, description) values (3, Python 入门教程, 零基础入门 Python 开发企业级应用开发最佳首选框架);
insert into ebook (id, name, description) values (4, Mysql 入门教程, 零基础入门 Mysql 开发企业级应用开发最佳首选框架);
insert into ebook (id, name, description) values (5, Oracle 入门教程, 零基础入门 Oracle 开发企业级应用开发最佳首选框架);
这里将其拷到all.sql中 执行一下 此时可以看到成功执行了 可以看到用了这个内置的Database在开发中真的挺方便所有都只需要在IDE中来处理不需要来回切到三方窗口中了。
使用代码生成器快速开发列表接口
好有了表之后接下来就可以使用Mybatis的这个代码生成利器将持久层相关的类全部生成了先做一下这个配置上的改动 接下来则就可以执行代码生成了如下 测试
1、新建Controller
拉下来咱们就可以进行测试了先新建一个Controller这里直接基于TestController拷贝一下 然后此时需要手动改一下这里面的代码是吧其实都不用手动改直接整体替换就可以了怎么替换呢如下 这样整体替换之后接下来再来替换一下 再整体替换一下另外这里的test的路径也改一下 目前还缺一个EbookService对吧下面就来新建一下。
2、新建Service
其方法也是跟上面Controller一样不需要自己手写就是整体替换就成 这样两步操作其Service层就搞定了。
3、编写测试用例
接下来则编写一个测试用例如下 4、总结
通过mybatis的这个自动生成器对于一个新表的常规持久化的功能是不是非常之快基本上就是整体替换一个简单的增删改查的持久化层逻辑就搞定了相当happy。
封装通用返回值
1、定义通用返回类
目前我们电子书的查询列表的接口直接返回的是一个列表对象对吧 很明显对于前端来说不太人性应该返回值中有成功与失败的一些通用状态字段所以接下来咱们有必要能返回值进行一个通用结构化的处理如下 package com.cexo.wiki.resp;public class CommonRespT {/*** 业务上的成功或失败*/private boolean success true;/*** 返回信息*/private String message;/*** 返回泛型数据自定义类型*/private T content;public boolean getSuccess() {return success;}public void setSuccess(boolean success) {this.success success;}public String getMessage() {return message;}public void setMessage(String message) {this.message message;}public T getContent() {return content;}public void setContent(T content) {this.content content;}Overridepublic String toString() {final StringBuffer sb new StringBuffer(ResponseDto{);sb.append(success).append(success);sb.append(, message).append(message).append(\);sb.append(, content).append(content);sb.append(});return sb.toString();}
}
这样的话以一个登录接口为例如果登录失败返回的样子就是这样了 而如果登录成功返回格式就是 当然不同公司其通用的返回格式都不太一样但是都会有一个统一的结构的。
2、使用通用返回类
接下来则可以改造一下咱们的电子书列表接口了如下 3、测试
接下来热部署测一下效果 封装请求参数和返回参数
根据名称模糊查询电子书
接下来增加一个需求就是查询电子书可以根据书名进行模糊匹配那如何做呢先来给接口增加一个参数 其中EbookService该如何改造呢此时就需要使用到EbookEample这个类了 因为它里面包含所有对表操作的封装方法下面来看一下针对此场景如何使用它 好接下来测试一下效果 封装请求参数
接下来假如查询参数又需要根据description来进行模糊匹配呢是不是咱们在list方法中又得增加一个参数 那如果之后需求又变更是不是这里面的参数就会越来越多所以有必要对其请求参数进行一下封装如下 其里面的内容可以从Ebook中来拷觉得有必要的就留下比如这里用两个字段
package com.cexo.wiki.req;public class EbookReq {private Long id;private String name;public Long getId() {return id;}public void setId(Long id) {this.id id;}public String getName() {return name;}public void setName(String name) {this.name name;}Overridepublic String toString() {return EbookQueryReq{ id id , name name \ } ;}
}
然后此时我们的查询参数就可以改用这个请求类了 然后在service类中也需要改 其结果也是一样的Spring Boot会根据请求参数自动映射到EbookReq中对应的字段上的。
封装返回参数
这里对于返回值也需要封装一下先看一下目前我们对于电子书列表查询的返回值 但是实际情况对于结果的返回并非将所有的数据库信息都返回给前端最典型的就是用户登录登录成功之后并不会将整个User返回前端比如密码字段就不会给前端所以咱们有必要对返回参数进行一个封装如下 目前它跟Ebook的字段是一模一样的随着之后的业务迭待会有不同的接下来咱们将它应用一下 其中有个TODO是因为这块有更好省事的解决方案如下 改完之后再测试一下一切正常。
制作CopyUtil封装BeanUtils
最后这里做一个代码优化就是刚才咱们写的这块代码 这块是个通用功能可能之后会被大量用到如果每次都写这么一大堆还是比较繁琐的所以有必要对它进行一个封装这里直接把工具类贴出来 package com.cexo.wiki.util;import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;import java.util.ArrayList;
import java.util.List;public class CopyUtil {/*** 单体复制*/public static T T copy(Object source, ClassT clazz) {if (source null) {return null;}T obj null;try {obj clazz.newInstance();} catch (Exception e) {e.printStackTrace();return null;}BeanUtils.copyProperties(source, obj);return obj;}/*** 列表复制*/public static T ListT copyList(List source, ClassT clazz) {ListT target new ArrayList();if (!CollectionUtils.isEmpty(source)){for (Object c: source) {T obj copy(c, clazz);target.add(obj);}}return target;}
}
这块代码逻辑比较简单就不过多解释了接下来看一下如何有这个工具来优化咱们的代码首先是单个对象的拷贝原来我们是需要用两句代码对吧 现在只需要一句搞定 而接下来对于整个列表的拷贝则可以又可以优化为 总结
这次学的东西还是非常之多的收获也多下一次则开启Vue3的界面搭建啦加油~~ 关注个人公众号获得实时推送