日期:2022年6月10日
正文
完成基本功能要求——在给定日期、航班号或给定日期、出发地、目的地两种组合模式下的航班查询,查询结果中至少应当包含航班的起降时间、剩余座位数、票价
上一个月完成了后台接口的所有,这个月开始写前台小程序的接口,首先完成基本功能中的多条件组合查询,这个很简单,转化成sql语句就是“select {想要查询的字段} from {表名} where {条件1} and {条件2} and ....”
思路理清,目标明确之后下面是
具体实现步骤
1.通过easy-code插件连接数据库表,然后生成对应的Mybatis-plus的代码
之前发过easy-code的基本使用方法,不懂得可以查看我之前的博客:www.yuque.com/u22371353/i…
完成之后会生成如下目录及文件
2.手动配置pom文件以及application.properties文件
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>service</artifactId>
<groupId>com.domestic</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service-flight</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
</project>
# 服务端口
server.port=8001
# 服务名
spring.application.name=service-flight
# 环境设置:dev,test,prod
spring.profiles.active=dev
# mysql数据库连接
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.url=jdbc:mysql://localhost:3306/highestplane?serverTimezone=GMT%2B8
#spring.datasource.username=root
#spring.datasource.password=root
# 配置多数据源
# 指定默认主数据源
spring.datasource.dynamic.primary=master
spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/highestplane?serverTimezone=GMT%2B8
spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password=root
# 指定副数据源
spring.datasource.dynamic.datasource.slave_1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.slave_1.url=jdbc:mysql://localhost:3306/highestplane?serverTimezone=GMT%2B8
spring.datasource.dynamic.datasource.slave_1.username=root
spring.datasource.dynamic.datasource.slave_1.password=root
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=redis
spring.redis.database= 0
spring.redis.timeout=1800000
spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1
#最大阻塞等待时间(负数表示没限制)
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0
#最小空闲
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# 返回json的全局时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3.修改controller中生成的代码
由于easy-code只会生成简单的增删该查代码,所以需要我们对第一个按条件查询所有的代码稍作修改即可实现
这个是默认easy-code生成的按条件查询所有的代码
@GetMapping("findAll")
public R selectAll(Page<Flight> page, Flight flight) {
return success(this.flightService.page(page, new QueryWrapper<>(flight)));
}
稍作修改:这里的select是我们新自定义的方法,一开始会报红,alt+enter创建service目录下的接口方法即可
//日期+起飞城市+目的地城市查询
@GetMapping("select")
public R select(Flight flight) {
List<Flight> list = flightService.select(flight);
return success(list);
}
这里的select是我们新自定义的方法,一开始会报红,alt+enter创建service目录下的接口方法即可
下图是创建好的接口方法
只有接口没有实现类同样会报错,在impl目录下中的对应实现类重写接口方法
注意:具体的逻辑代码就是在这里实现的
package com.domestic.flightservice.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.domestic.commonutils.MD5;
import com.domestic.flightservice.dao.FlightDao;
import com.domestic.flightservice.entity.Flight;
import com.domestic.flightservice.service.FlightService;
import com.domestic.servicebase.exceptionhandler.FlightException;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.sql.Date;
import java.time.LocalTime;
import java.util.List;
/**
* 航班信息(Flight)表服务实现类
*
* @author makejava
* @since 2022-06-10 10:09:36
*/
@Service("flightService")
public class FlightServiceImpl extends ServiceImpl<FlightDao, Flight> implements FlightService {
//日期+起飞城市+目的地城市查询
@Override
public List<Flight> select(Flight flight) {
Date flightDate = flight.getFlightDate();
String startPlace = flight.getStartPlace();
String endPlace = flight.getEndPlace();
Integer lowestPrice = flight.getLowestPrice();
String startTime = flight.getStartTime();
String flightDuration = flight.getFlightDuration();
//用户输入非空判断
if (StringUtils.isEmpty(flightDate)
|| StringUtils.isEmpty(startPlace)
|| StringUtils.isEmpty(endPlace)){
throw new FlightException(-1,"请输入完整的查询信息!");
}
QueryWrapper<Flight> wrapper = new QueryWrapper<>();
wrapper.eq("flight_date",flightDate);
wrapper.eq("start_place",startPlace);
wrapper.eq("end_place",endPlace);
if (!StringUtils.isEmpty(lowestPrice)){ //前端价格传值则升序排列
wrapper.orderByAsc("lowest_price");
}
if (!StringUtils.isEmpty(flightDuration)){ //前端飞行时长传值则升序排列
wrapper.orderByAsc("flight_duration");
}
if (!StringUtils.isEmpty(startTime)){ //前端起飞时间传值则升序排列
wrapper.orderByAsc("start_time");
}
//根据条件做查询
List<Flight> date_list = baseMapper.selectList(wrapper);
//查询数据库中是否有值
if(date_list.isEmpty()) {
throw new FlightException(-1,"暂无航班!");
}
return date_list;
}
}
4.手动写FlightApplication启动类
package com.domestic.flightservice;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@EnableDiscoveryClient //nacos注册
@ComponentScan(basePackages = {"com.domestic"}) //包扫描注解扫描配置的swagger
public class FlightApplication {
public static void main(String[] args) {
SpringApplication.run(FlightApplication.class,args);
}
}
5.这时候有一个坑,直接启动会报错
错误原因:这个错误就是mapper接口没有实现类
解决方案:加入@MapperScan注解
收获:我这里是加在了自定义的config类中,这里可以配置一些所需要的插件信息以及像MapperScan等的包扫描注解
package com.domestic.flightservice.config;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
//import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration
@MapperScan("com.domestic.flightservice.dao")
public class FlightConfig {
/**
* 逻辑删除插件
*/
/*
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
*/
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
/**
* 性能分析插件
*/
@Bean
@Profile({"dev","test"}) //设置dev和test环境开启,保证我们的效率
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setMaxTime(100); //设置sql执行的最大时间,超过时间不执行 单位毫秒(ms)
performanceInterceptor.setFormat(true);//是否开启输出格式化支持
return performanceInterceptor;
}
}
6.启动FlightApplication测试easy-code给我们生成的基本的MP增删改查代码
swagger输入查询条件
总结
今天完成了基本功能要求的一项,现在回想起来有easy-code工具的加持下感觉并不难,这也是我第一次完整的写出controller+service+impl,这是我对spring-cloud的项目的目录结构有了更清楚地认识,唯一一个回想起来花费我很长时间的就是哪个mapperscan的注解,因为之前的做的小demo根本不会用到config配置类,甚至连结果都是在控制台输出的,我是比葫芦画瓢的看老师的实战项目视频才解决的这个问题,这个算是一个值得注意的难点;重点还是在impl中写的逻辑代码,这个是要你结合你的数据库以及想要实现的结果来自行编写的,需要很清晰的目的,以及较为完善的数据库设计,数据库设计不好会影响到后续一系列的代码。