现在的博客是基于PHP的WordPress搭建的,前后端技术栈都落后好多年了。最近除了在美化博客,手写js代码添加一些新功能。还在想要不要迁移一下博客,换一个框架。查了一下最新的博客框架,有SpringBoot搭建的,好像可以自己写一个啊,就是前端可能有点麻烦。说干就干。
这次打算做一个SpringBoot + Mybatis 的项目。刚好博客网站需要实现的功能不多,用简单轻巧的Mybatis就行。之前是在SSM项目里用Mybatis,这次刚好练手在SpringBoot里整合Mybatis。
之前有段时间大二有段时间,VPS到期没买新的,博客也没开。没记录第一次Spring开发项目时的问题,这次也写一下。
创建项目
SpringBoot整合Mybatis(SpringBoot3)
原来跟网上教程走,为了能先跑起来,用的是Spring 1.5.7 和MySQL 5.5,JDK还是1.8。现在用最新版本SpringBoot 还要和Mybatis对上版本,自己会写了也用上JDK17。
这是Maven的pom.xml文件,这样配置就好了。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.test</groupId>
<artifactId>springmabatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springmabatis</name>
<description>springmabatis</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<!-- springBoot web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- mysql -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<!-- thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
资源文件夹
SpringBoot静态资源位置是在src/main/resources/目录下,src/main/resources/static/下放静态资源,src/main/resources/templates/下放网页。
再新建一个目录src/main/resources/mapper/放mabatis的xml文件。
同时要在SpringBoot的配置文件里添加Mapper 扫描路径
# MyBatis configuration
mybatis.mapper-locations=classpath:/mapper/*.xml
项目会使用mapper配置文件的形式。也会用注解形式实现一遍,不过最终实现注解会注释掉。
因为使用了SpringBoot的默认目录,所以statis和templates目录不用像Spring MVC那样,要在配置里写扫描路径。
无法解析 MVC 视图
如果Controller层需要返回一个页面。使用的是Html作为页面,解析Html要用Thymeleaf,项目pom.xml文件里已经加了。
返回的地址是从src/main/resources/templates/
开始,比如
@RequestMapping("/test")
public test ()
{
return "index" // index.html 文件位于 src/main/resources/templates/
}
@Controller注解和@RestController注解
使用SpringMVC框架搭建的项目是前后端不分离的,前后端分离的标志是使用API进行开发。
我之前在SpringMVC写Controller层时,是直接返回已经渲染的视图,接口和视图不是分离的。
前端通过一个 RESTful 接口 /api/categories
用于获取数据,将这些数据渲染到 HTML 页面中。
@Controller
@RequestMapping("/view")
public class CategoryController {
@Autowired
private CategoryService categoryService;
@GetMapping("/categories")
public String categories(Model model) {
List<Category> categories = categoryService.getCategories(); // 从服务获取数据
model.addAttribute("categories", categories); // 将数据添加到模型
return "categories"; // 返回视图名称
}
}
现在用SpringBoot,前后端分离的写法就是
//控制器用于接口
@RestController
@RequestMapping("/api")
public class CategoryController {
@GetMapping("/categories")
public List<Category> getCategories() {
return categoryService.getCategories(); // 返回数据
}
}
@Controller
@RequestMapping("/view")
public class ViewController {
@GetMapping("/categories")
public String categories() {
return "categories"; // 视图名称,映射到 src/main/resources/templates/categories.html
}
}
接口返回数据: @RestController 和返回 @ResponseBody 数据。 视图返回页面: @Controller 和返回视图名称。
通常返回视图页面的Controller类单独一个类,当然和返回接口数据的写在一个类里也可以
@Controller
@RequestMapping("")
public class CategoryController {
@Autowired
CategoryService categoryService;
@GetMapping(value="/admin_category_list")
public String listCategory() {
return "include/admin/admin/listCategory"; // 返回视图名称
}
@GetMapping("/categories")
@ResponseBody
public List<Category> list() {
return categoryService.list(); // 返回 JSON 数据
}
}
但是如果用错了@Controller注解和@RestController那就会报错Thymeleaf 无法解析访问模板文件。
Exception processing template "categories": Error resolving template [categories], template might not exist or might not be accessible by any of the configured Template Resolvers
这边文章有更详细的关于 Spring Boot 中@Controller的使用:
文章评论