讲师接口开发
使用代码生成器生成代码结构。
public class CodeGenerator {
@Test
public void run() {
// 1、创建代码生成器
AutoGenerator mpg = new AutoGenerator();
// 2、全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
/**
* 指定生成代码的路径绝对路径推荐
*/
gc.setOutputDir("D:\\Online-education\\Online-education\\online_education\\service\\service-edu" + "/src/main/java");
gc.setAuthor("zq");
gc.setOpen(false); //生成后是否打开资源管理器
gc.setFileOverride(false); //重新生成时文件是否覆盖
gc.setServiceName("%sService"); //去掉Service接口的首字母I
/**
* 主键策略 STR指定主键为字符类型
*/
gc.setIdType(IdType.ID_WORKER_STR); //主键策略 STR指定主键为字符类型
gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型
gc.setSwagger2(true);//开启Swagger2模式
mpg.setGlobalConfig(gc);
// 3、数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/education?serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("7946");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
// 4、包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName("edu"); //模块名
pc.setParent("com.example");
pc.setController("controller");
pc.setEntity("entity");
pc.setService("service");
pc.setMapper("mapper");
mpg.setPackageInfo(pc);
// 5、策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("edu_teacher");
strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀
strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作
strategy.setRestControllerStyle(true); //restful api风格控制器
strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符
mpg.setStrategy(strategy);
// 6、执行
mpg.execute();
}
}
MP会将service和mapper的类和配置文件、接口等生成。在controller可以直接注入service,service自动封装了调用mapper的方法。
查询全部讲师
controller:
@RestController
@RequestMapping("/edu/teacher")
public class TeacherController {
@Autowired
public TeacherService teacherService;
@GetMapping("findAll")
public List<Teacher> findAllTeacher(){
List<Teacher> list = teacherService.list(null);
return list;
}
}
配置类中要开启mapper扫描:
@MapperScan("com.example.edu.mapper")
@Configuration
public class eduConfig {
}
springboot配置文件及启动类。
配置文件中需要设置时区来解决从数据库查询返回的json数据是带时区的。
#返回json的全局时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
逻辑删除讲师
逻辑删除插件
@Bean
public ISqlInjector iSqlInjector(){
return new LogicSqlInjector();
}
实体类属性添加TableLogic
@TableLogic
private Boolean isDeleted;
编写controller
/**
* 逻辑删除讲师
* @DeleteMapping("{id}") /edu/teacher/id值 通过url的路径传递id值
* @param id @PathVariable String id 获取路径中的id值即{id}
* @return
*/
@DeleteMapping("{id}")
public Boolean removeTeacher(@PathVariable String id){
boolean flag = teacherService.removeById(id);
return flag;
}
整合swagger
swagger用于对接口进行测试。创建公共模块给所有模块进行使用。
在online-education模块下添加common模块,配置common的pom依赖并设置packing为pom、删除src。common下创建service-base模块。service-base的java目录中创建com.example.servicebase包,添加SwaggerConfig类。
@Configuration//配置类
@EnableSwagger2 //swagger注解
public class SwaggerConfig {
@Bean
public Docket webApiConfig(){
return new Docket(DocumentationType.SWAGGER_2)
.groupName("webApi")
.apiInfo(webApiInfo())
.select()
.paths(Predicates.not(PathSelectors.regex("/admin/.*")))
.paths(Predicates.not(PathSelectors.regex("/error.*")))
.build();
}
private ApiInfo webApiInfo(){
return new ApiInfoBuilder()
.title("网站-课程中心API文档")
.description("本文档描述了课程中心微服务接口定义")
.version("1.0")
.contact(new Contact("java", "http://baidu.com", "1123@qq.com"))
.build();
}
}
在service模块下引入service-base依赖。service下的子模块都可以使用了。
<dependency>
<groupId>com.example</groupId>
<artifactId>service-base</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
Springboot启动类上添加ComponentScan,Swagger(在com.example包下)就会在启动时添加到IoC容器了。
@ComponentScan(basePackages = {"com.example"})
成功如下:
接口统一结果返回
返回数据为json原理?
在common模块下添加子模块common-utils模块,包下创建ResultCode接口,定义返回码。
编写统一返回结果类。
@Data
public class Result {
private Boolean success;
private Integer code;
private String message;
private Map<String, Object> data = new HashMap<String, Object>();
//私有构造线程安全
private Result() {
}
public static Result ok(){
Result result = new Result();
result.setSuccess(true);
result.setCode(ResultCode.SUCCESS);
result.setMessage("成功");
return result;
}
public static Result error(){
Result result = new Result();
result.setSuccess(false);
result.setCode(ResultCode.ERROR);
result.setMessage("失败");
return result;
}
//this方便链式调用
public Result success(Boolean success){
this.setSuccess(success);
return this;
}
public Result message(String message){
this.setMessage(message);
return this;
}
public Result code(Integer code){
this.setCode(code);
return this;
}
public Result data(String key, Object value){
this.data.put(key, value);
return this;
}
public Result data(Map<String, Object> map){
this.setData(map);
return this;
}
}
在service模块的pom中引用common_utils依赖。
<dependency>
<groupId>com.example</groupId>
<artifactId>common_utils</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
使用统一返回结果。
@GetMapping("findAll")
public Result findAllTeacher(){
List<Teacher> list = teacherService.list(null);
return Result.ok().data("items",list);
}
讲师分页
配置分页插件
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
教师分页controller
@PostMapping("/pageTeacher/{current}/{size}")
public Result pageTeacher(@PathVariable long current,
@PathVariable int size){
Page<Teacher> pageTeacher = new Page<>(current,size);
teacherService.page(pageTeacher, null);
long total = pageTeacher.getTotal();
List<Teacher> records = pageTeacher.getRecords();
return Result.ok().data("total",total).data("rows",records);
}
多条件组合查询+分页
创建ov值对象对条件查询的条件进行封装。
@Data
public class TeacherQuery {
@ApiModelProperty(value = "教师名称,模糊查询")
private String name;
@ApiModelProperty(value = "头衔 1高级讲师 2首席讲师")
private Integer level;
@ApiModelProperty(value = "查询开始时间", example = "2019-01-01 10:10:10")
private String begin;//注意,这里使用的是String类型,前端传过来的数据无需进行类型转换
@ApiModelProperty(value = "查询结束时间", example = "2019-12-01 10:10:10")
private String end;
}
使用page方法传入QueryWrapper的对象就可以进行按条件查询。
@PostMapping("conditionPage/{current}/{size}")
public Result conditionPage(@PathVariable long current,
@PathVariable int size,@RequestBody TeacherQuery teacherQuery) {
//@RequestBody用于接收前端传过来的json数据并封装到ov对象
Page<Teacher> teacherPage = new Page<>();
QueryWrapper<Teacher> queryWrapper = new QueryWrapper<>();
//获取ov对象的值
Integer level = teacherQuery.getLevel();
String begin = teacherQuery.getBegin();
String name = teacherQuery.getName();
String end = teacherQuery.getEnd();
//StringUtils.isEmpty()判断name不为空时将条件存入queryWrapper对象
//queryWrapper对象可以存取多个条件代替MyBatis的动态SQL
if (!StringUtils.isEmpty(name)) {
queryWrapper.like("name", name);
}
if (!StringUtils.isEmpty(level)) {
queryWrapper.eq("level", level);
}
if (!StringUtils.isEmpty(begin)) {
queryWrapper.ge("gmt_create", begin);
}
if (!StringUtils.isEmpty(name)) {
queryWrapper.le("gmt_modified", end);
}
teacherService.page(teacherPage,queryWrapper);
long total = teacherPage.getTotal();
List<Teacher> records = teacherPage.getRecords();
return Result.ok().data("total",total).data("rows",records);
}
添加讲师
在实体类对应字段上添加自动填充。
@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
private Date gmtCreate;
@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date gmtModified;
在service-base中添加自动填充类。@Component不加会出现500。会报字段名不能为null的操作。
@Component
public class MyMateObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
//字段名为实体类中的属性名
this.setFieldValByName("gmtCreate",new Date(),metaObject);
this.setFieldValByName("gmtModified",new Date(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("gmtModified",new Date(),metaObject);
}
}
controller。
//添加教师
@PostMapping("addTeacher")
public Result addTeacher(@RequestBody Teacher teacher){
boolean save = teacherService.save(teacher);
if (save){
return Result.ok();
}else {
return Result.error();
}
}
统一异常处理
在service-base中添加GlobalExceptionHandler。
@ControllerAdvice
public class GlobalExceptionHandler {
//指定出现什么异常进行处理
@ExceptionHandler(Exception.class)
@ResponseBody
public Result exception(Exception e){
e.printStackTrace();
return Result.error().message("出现异常。。。。。");
}
}