springboot 项目创建
1.使用官方脚手架创建项目
在这个过程中,需要连接官方脚手架地址进行创建
等待一会之后,选择项目名称、jar版本即可
根据需要选择需要导入的依赖 和 springboot版本号
选择完成,等待创建完成即可
2. 使用aliyun 脚手架创建项目
从上面的介绍中,我们可以看到创建的过程中需要连接spring官方地址,可能出现访问失败的情况,那么这时候我们可以选择aliyun的脚手架进行创建
aliyun 脚手架地址:start.aliyun.com/
在选择aliyun的脚手架的时候要注意点,aliyun目前的springboot版本号较低,如果想选择高版本号,需要自行去 pom.xml 中修改springboot的版本号。关于pom文件中的依赖和版本号相关知识,如果不清楚的话得自己花点时间学习。
当然,aliyun的脚手架也有一些优秀的地方,将一些国内有些的框架也依赖进去了,比如mybatis plus
3.进入脚手架网址,生成项目压缩包
进入脚手架地址
其实进入后你就发现,脚手架网址创建跟在idea中没有什么两样,也是选择springboot版本 ,java版本,相关依赖,然后生成一个项目压缩包即可,自己将压缩包导入到工作空间即可。
springboot 整合 junit
-
使用注解
@SpringBootTest,将相关类标记为 测试application 启动类 -
使用 @Autowired 从 spring 容器中获取相应的bean即可
-
使用 @Test 标记执行方法
-
执行test 方法即可
相关代码如下:
<!-- springtest 相关依赖 ,springboot项目默认会导入该依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
//测试代码
package com.example;
import com.example.dao.BookDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Test0104ApplicationTests {
//1.使用junit测试的方法,第一步注入 相关对象
@Autowired
private BookDao bookDao;
@Test
void contextLoads() {
//2.执行相关对象的测试方法即可
bookDao.save();
}
}
@SpringBootTest注解标记的类在启动或执行方法时,会在包下 com.example 下及父包 com 下查找是否有 @SpringBootApplication 标记的启动类 。如果没有则会报错,这时候可以指定 @SpringBootTest的 classes 属性的值为启动类即可。 比如
Test0104Application 为项目启动类
@SpringBootTest(classes = Test0104Application.class )
class Test0104ApplicationTests {
//1.使用junit测试的方法,第一步注入 相关对象
@Autowired
private BookDao bookDao;
@Test
void contextLoads() {
//2.执行相关对象的测试方法即可
bookDao.save();
}
springboot 整合 mybatis
- 项目创建时,选择依赖坐标
如果是老项目,新增mybatis 则直接在 pom文件中增加依赖坐标即可。
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
可能好奇为什么有些依赖不需要版本号,有些依赖需要版本号? 如果是起步依赖,也就是 starter 这种,一般都是要写版本号的;如果是一般实际的框架坐标,那么则要看父项目里是否有定义了版本号,如果有推荐用父项目的,因为这都是官方调出来的最优版本号;自己如果贸然选用其他的,可能造成版本不匹配或其他问题。
查看父项目 springboot 中管理的坐标版本号可按照如下顺序查看:
- 配置数据源 DataSource
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?serverTimeZone=UTC
username: root
password: root
- 添加mybatis 设置
mybatis:
configuration:
map-underscore-to-camel-case: true
在使用 yml 文件配置参数时,只需要输入相关配置的个别参数即会有相应的提示 如果没有相应的提示,则有两种情况:一种是相应的jar包没有导入 ;一种是当前配置文件不是 spring配置文件
对于第二种情况,可选择如下操作,将相应的文件添加为 spring 配置文件即可
- 编写 mapper代理类
@Mapper
public interface StudentMapper {
@Select("select * from student where id= #{id}")
Student getStudentById(@Param("id") Long id);
}
至此,mybatis 整合完成
springboot 整合 mybatisplus
-
导入相关依赖坐标
mybatis plus 目前没有被官方收录,因为无法通过在创建项目时选择依赖坐标的方式进行选择,只能手动编辑 pom 文件进行添加
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
- 配置数据源 和 mybatis plus
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?serverTimeZone=UTC
username: root
password: root
#mybatis plus配置
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
- 编写 mapper 代理类
@Mapper
public interface StudentMapper extends BaseMapper<Student> {
}
mybatis plus 针对日常使用常见,提供了一些常见接口的实现。因此我们在写 mapper 接口时直接集成 BaseMapper<T> 能帮助我们减少一部分工作量
至此,mybatis plus 整合完成
- 分页拦截器
mybatis plus 的分页插件使用的拦截器的方式实现的。因此需要手动配置一个分页拦截器 new PaginationInnerInterceptor()并且添加到拦截器链之中
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor getMybatisPlusInterceptor() {
// mybatis plus的分页是依靠拦截器的方式来实现的,因此需要添加拦截器,其中分页拦截器是 PaginationInnerInterceptor
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
springboot 整合 druid
德鲁伊作为一个非常优秀的连接池,也是经常使用到的。
- 依赖坐标
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
- 添加 druid 配置,一共有两种配置
#配置 druid, 第一种直接设置 type
#spring:
# datasource:
# driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://localhost:3306/test?serverTimeZone=UTC
# username: root
# password: root
# type: com.alibaba.druid.pool.DruidDataSource
#第二种标准配置方式,推荐使用第二种
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?serverTimeZone=UTC
username: root
password: root
#mybatis plus配置
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
springboot 开发一个完整的ssm项目
该项目是一个支持 restful 风格请求的项目,数据库采用 mysql ,使用 mybatis plus 来操作数据库
- 项目依赖
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- application.yml 配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?serverTimeZone=UTC
username: root
password: root
mybatis:
configuration:
map-underscore-to-camel-case: true
- mp 拦截器添加
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor getMybatisPlusInterceptor() {
// mybatis plus的分页是依靠拦截器的方式来实现的,因此需要添加拦截器,其中分页拦截器是 PaginationInnerInterceptor
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
- mybatis plus 服务类
mybatis plus 针对数据库常见场景,生成了默认接口 IService 接口,直接继承该接口可以更便捷地开发
public interface IBookService 的实现类时会发现,有非常多的方法需要实现。这时候,我们只需要让实现类 继承 ```
ServiceImpl<BookDao, Book>
``` extends IService<Book> {
}
我们在写 IBookService 的实现类时会发现,有非常多的方法需要实现。这时候,我们只需要让实现类 继承 ServiceImpl<BookDao, Book> ( BookDao 为 mapper 代理类, BooK 为实体类),这时候你会发现IService默认的方法都已经帮你实现,你只需要关注自己需要新增的方法即可。
@Service
public class IBookServiceImpl extends ServiceImpl<BookDao, Book> implements IBookService {
}
- 完成 controller
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private IBookService iBookService;
@GetMapping
public Result<List<Book>> getAll() {
return Result.success(iBookService.list());
}
@PostMapping
public Result<Book> save(@RequestBody Book book) {
iBookService.save(book);
return Result.success(book);
}
@PutMapping
public Result<String> update(@RequestBody Book book) {
boolean result = iBookService.updateById(book);
if (result) {
return Result.success();
}
return Result.error("更新失败");
}
@DeleteMapping("{id}")
public Result<String> delete(@PathVariable Integer id) {
boolean result = iBookService.removeById(id);
if (result) {
return Result.success();
}
return Result.error("删除失败");
}
@GetMapping("{id}")
public Result<Book> getById(@PathVariable Integer id) {
return Result.success(iBookService.getById(id));
}
@GetMapping("/{currentPage}/{pageSize}")
public Result<Page<Book>> getPage(@PathVariable Integer currentPage, @PathVariable Integer pageSize) {
Page<Book> page = new Page<>(currentPage, pageSize);
iBookService.page(page, null);
return Result.success(page);
}
}
完全遵循 restful 风格的controller 即编写完成
- 添加统一的异常处理器
@ExceptionHandler
@RestControllerAdvice
@Slf4j
public class ExceptionAdvice {
@ExceptionHandler(Exception.class)
public Result doException(Exception ex) {
log.error("出现异常:" + ex.getMessage(), ex);
return Result.error("内部服务错误,请联系管理员处理");
}
}
至此,该项目的后端部分基本编写完成。使用 postman 或者 apipost 对相关接口进行测试即可