Java的生命力还有一千年,所以不要着急放弃SpringBoot。尤其在没有找到更好的替代框架之前。
SpringBoot简介
Spring Boot 是一个基于 Spring 框架的开源 Java 应用框架,旨在简化 Spring 应用程序的创建、开发和部署。它提供了一种快速构建生产级别 Spring 应用的方式,通过减少繁琐的配置和设置工作,让开发者能够专注于业务逻辑的实现。以下是 Spring Boot 的主要特点:
- 自动配置:Spring Boot 自动配置许多常见的 Spring 应用组件,如数据库、Web 框架、安全配置等,减少了手动配置的工作量。
- 独立运行:Spring Boot 应用可以打包成一个可执行的 JAR 文件,包含嵌入的服务器(如 Tomcat、Jetty),能够直接运行,而无需外部应用服务器。
- 简化的开发体验:提供了强大的开发工具支持,如 Spring Boot CLI、Spring Boot Initializr,使得项目的创建和配置变得非常简单。
- 微服务支持:Spring Boot 非常适合开发微服务架构的应用,能够快速创建独立的服务,并通过 Spring Cloud 提供的丰富工具支持微服务的管理和部署。
- 健壮的社区和生态系统:Spring Boot 拥有广泛的社区支持和丰富的扩展生态系统,提供了各种插件和库,满足不同的应用需求。
- 内置监控和管理:Spring Boot 提供了 Actuator 模块,用于监控和管理应用,支持健康检查、指标监控、应用配置查看等功能。
Spring Boot 是构建现代 Java 应用的利器,极大地提高了开发效率和应用的可维护性。
SpringBoot整合
创建Spring Web项目
pom.xml
<dependencies> <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> </dependencies>
application.yml
server: port: 80
实体类
@Data @NoArgsConstructor @AllArgsConstructor public class Book { @TableId private Integer id; private String type; private String bookname; private String description; }
Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发,SpringBoot目前默认集成了lombok技术,并提供了对应的版本控制,所以只需要提供对应的坐标即可,在pom.xml中添加lombok的坐标。
<dependencies> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
数据层开发——基础CRUD
数据层开发使用MyBatisPlus,数据源使用Druid
<dependencies> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies>
server: port: 80 spring: datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC username: root password: root
使用MP的标准通用接口BaseMapper加速开发,注意@Mapper和泛型的指定
@Mapper public interface BookDao extends BaseMapper<Book> { }
MP技术默认的主键生成策略为雪花算法,生成的主键ID长度较大,和目前的数据库设定规则不相符,需要配置一下使MP使用数据库的主键生成策略。在application.yml中添加对应配置即可,具体如下
server: port: 80 spring: datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC username: root password: root mybatis-plus: global-config: db-config: table-prefix: tbl_ #设置表名通用前缀 id-type: auto #设置主键id字段的生成策略为参照数据库设定的策略,当前数据库设置id生成策略为自增
SpringBoot整合MP的时候通过配置的形式就可以查阅执行期SQL语句,配置如下
mybatis-plus: global-config: db-config: table-prefix: tbl_ id-type: auto configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
定义MP拦截器并将其设置为Spring管控的bean
//实现分页拦截器 @Configuration public class MPConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor());//**** return interceptor; } }
数据层开发——条件查询功能制作
QueryWrapper条件
@Test void testGetBy(){ QueryWrapper<Book> qw = new QueryWrapper<>(); qw.like("name","Spring"); bookDao.selectList(qw); }
LambdaQueryWrapper条件
@Test void testGetBy2(){ String name = "1"; LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<Book>(); lqw.like(Book::getName,name); bookDao.selectList(lqw); }
动态条件
@Test void testGetBy2(){ String name = "1"; LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<Book>(); //if(name != null) lqw.like(Book::getName,name); //方式一:JAVA代码控制 lqw.like(name != null,Book::getName,name); //方式二:API接口提供控制开关 bookDao.selectList(lqw); }
业务层开发
public interface BookService { Boolean save(Book book); Boolean update(Book book); Boolean delete(Integer id); Book getById(Integer id); List<Book> getAll(); IPage<Book> getPage(int currentPage,int pageSize); }
业务层实现类如下,转调数据层即可
@Service public class BookServiceImpl implements BookService { @Autowired private BookDao bookDao; @Override public Boolean save(Book book) { return bookDao.insert(book) > 0; } @Override public Boolean update(Book book) { return bookDao.updateById(book) > 0; } @Override public Boolean delete(Integer id) { return bookDao.deleteById(id) > 0; } @Override public Book getById(Integer id) { return bookDao.selectById(id); } @Override public List<Book> getAll() { return bookDao.selectList(null); } @Override public IPage<Book> getPage(int currentPage, int pageSize) { IPage page = new Page(currentPage,pageSize); bookDao.selectPage(page,null); return page; } }
业务层快速开发
业务层接口快速开发
public interface IBookService extends IService<Book> { //添加非通用操作API接口 }
业务层接口实现类快速开发,关注继承的类需要传入两个泛型,一个是数据层接口,另一个是实体类
@Service public class BookServiceImpl extends ServiceImpl<BookDao, Book> implements IBookService { @Autowired private BookDao bookDao; //添加非通用操作API }
表现层开发
@RestController @RequestMapping("/books") public class BookController2 { @Autowired private IBookService bookService; @GetMapping public List<Book> getAll(){ return bookService.list(); } @PostMapping public Boolean save(@RequestBody Book book){ return bookService.save(book); } @PutMapping public Boolean update(@RequestBody Book book){ return bookService.modify(book); } @DeleteMapping("{id}") public Boolean delete(@PathVariable Integer id){ return bookService.delete(id); } @GetMapping("{id}") public Book getById(@PathVariable Integer id){ return bookService.getById(id); } @GetMapping("{currentPage}/{pageSize}") public IPage<Book> getPage(@PathVariable int currentPage,@PathVariable int pageSize){ return bookService.getPage(currentPage,pageSize, null); } }
- 基于Restful制作表现层接口
- 新增:POST
- 删除:DELETE
- 修改:PUT
- 查询:GET
- 接收参数
- 实体数据:@RequestBody
- 路径变量:@PathVariable
表现层消息一致性处理
@Data public class R { private Boolean flag; private Object data; public R(Boolean flag,Object data){ this.flag=flag; this.data=data; } public R(Object data){ if(data!=null){ this.flag=true; this.data=data; }else { this.flag=false; this.data=data; } } }