课程管理-课程信息确认(加载问题) | 学习笔记

简介: 快速学习课程管理-课程信息确认(加载问题)

开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot)课程管理-课程信息确认(加载问题)学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/667/detail/11390


课程管理-课程信息确认(加载问题)


内容介绍

一、Controller 部分

二、Service 部分

三、EduCourseMapper.xml 部分

四、测试报错

五、解决方法


一、Controller 部分

来到 EduCourseController 课程相关中,在其中写对刚才的 mapper的一个调用。

EduCourseController 中51行添加如下代码:

//根据课程 id 查询课程确认信息

//写个 get 提交,其中写上 getPublishCourseInfo 方法,在里面传入课程 id

GetMapping("getPublishCourseInfo/{id}")

//将 id 用注解@PathVariable 取到publicRgetPublishCourseInfo(@PathVariableStringid){

//调 courseService中publishCourseInfo 这个方法,在里面传 id,

最后让方法返回创建的 CoursePublishVo 这个对象,因为其中包含所

有的属性。

CoursePublishVocoursePublishVo=courseService.publishCour

seInfo(id);

//最后 return 值 coursePublishvo,同时命名为 publishCourse

returnR.ok().data("publishCourse",coursePublishvo):


二、Service 部分

之后点击来到编写 service 部分,在 service 中将其作调用,在service中调mapper。

EduCourseService.java代码:

publicinterfaceEduCourseServiceextendsIService<EduCours

e>{

//添加课程基本信息的方法

StringsaveCouiseInfo(CourseInfoVocourseInfoVo);

//根据课程id查询课程基本信息

CourseInfoVogetCourseInfo(StringcourseId);

//修改课程信息

voidupdateCourseInfo(CourseInfolocourseInfoVo);

//根据课程id查询课程确认信息

CoursePublishVopublishCourseInfo(Stringid);

}

以上为 interface 中,我们点击其中27行图标找其对应的实现类:

在 EduCourseServiceImpl.java28行代码,点击 EduCourseServiceImpl 中显示的 Implementmethods。在实现类中方法创建。同时在实现类中调用 mapper。调用方法可以写个 baseMapper 也可以写 this,但此时要调用自己编写的 Mapper,就应该要写 baseMapper才可以调到。采用 baseMapper.调用刚才写的getPublishCourseInfo(StringcourseId)方法,通过形参 id 将其中的 courseId 获得。

最终返回对象,将对象做个 return。到此就可以实现在 mapper 中调用 getPublishCourseInfo方法时就会对应调到其中的xml配置文件,

执行 sql 语句将结果返回。

EduCourseServiceImpl.java 代码如下:

//根据课程id查询课程确认信息 eOverride

publicCoursePublishVopublishCourseInfo(Stringid){

//采用 baseMapper.调用刚才写的 getPublishCourseInfo(String

courseId)方法,通过形参id将其中的 courseId 获得CoursePublishVopublishCourseInfo=baseMapper.getPublishCourseInfo(id);

//最终返回对象,将对象做个return

returnpublishCourseInfo;

)


三、EduCourseMapper.xml 部分

EduCourseMapper.xml代码如下:

<?xmlversion="1.0"encoding="UTF-8"?>

<!DCCTYPemapperPUBLIC"-//mybatis.org//DTDMapper3.0/EN”"

http://mybatis.org/dtd/mybatis-3-mapper.dtd>

<mappernamespace="com.atguigu.eduservice.mapper.EduCour

seMapper">

<!--sql语句:根据课程id查询课程确认信息-->

<selectid="getPublishCourseInfo”resultType="comatguigu.

eduservice.entity.vo.CoursePublishVo">

SELECTec.id,ec.title,ec.price,ec.lesson_numASlessonNum,

ec.cover,

et.nameASteacherName,

es1.titleAssubjectLevelOne,

es2.titleAssubjectLevelTwo

FROMedu_courseecLEFTOUTERJOINedu_course_descriptione

cdONec.id=ecd.id

LEETOUTERJOINedu_teacheretoNec.teacher_id=et.id

LEFTOUTERJOINedu_subjectes2ONec.subject_id=es2.id

WHEREec.id=#{courseId}

总结

此为一个调用过程:通过 EduCourseController 调 EduCourseService,而在EduCourseService 中使用 baseMapper,调 EduCourseMapper.java 中刚才的getPublishCourseInfo(StringcourseId)方法,

最终执行其中的 EduCourseMapper.xml 文件中的 sql 语句,然后将数

据得到。


四、测试报错

1.测试过程

启动代码之后,输入网址:(http://localhost:8001/swagger-ui.h

tml)打开 Swagger 进行测试。点击edu-course-controller,打开

刚才写的方法,即第二个/eduservice/course/getPublishCourseIn

fo/{id}。

向其中传入一个 id 值:1234747900958183425

2.提示报错

传完之后,点击Tryitout!之后浏览报错问题,发现执行了全局异

常处理,表示目前接口中报错了

测试报错显示:

ResponseBody

{

"success"":false,

"code":20001,

"message"":“执行了全局异常处理..”

"data":{}

}

3.报错原因

通过接口中提示报错信息,进行分析。此错误造成的原因是因为在开

发中调用 ibatis 配置文件时,执行报如下错误。无外乎是两种原因。

1第一种方法名是否写错

如 Mapper 中的方法名和 xml 中 select 标签中的方法名是否一致,在

老师讲解中排除此可能。

接口中报错:

//说明是由 ibatis 报的错,报错叫:BindingException,即数据绑

定异常

org.apache.ibatis.binding.BindingException:

//notfound表示没有找到,即冒号(:)后的方法并未找到执行

Invalidboundstatement(notfound):com.atguigu.eduservice

.mapper.zduCourseMapper.getPublishcourseInfo

4.原因分析

(1)总结

项目中创建 mapper 接口,编写 xml 文件 sql 语句,执行出现错误

错误:绑定异常,提示方法没有找到

ibatis.binding.BindingException:Invalidboundstatement(n

otfound):com.atguigu.eduservice.mapper.zduCourseMapper.g

etPublishcourseInfo

这个错误是由于 maven 默认加载机制造成的问题。

maven 加载时候,把 java 文件夹里面.java 类型文件进行编译,如果

其他类型文件,不会加载。

(2)说明

在工程结构中有个叫 target 的文件夹,其中都是 class 文件,就是说 java 代码在编译之后会到 target 中去,因为其中都是编译后的代码,包括其中的配置都含有。

而在原始的源代码中,除了有以下6个 Mapper,还有 xml 文件。

但在编译之后的 mapper 文件,xml 部分在编译之后并不存在,在此报的就是这个错误,它在此执行 EduCourseMpper 这个接口去找配置文件,但在编译后的文件中并没有配置文件,所以找不到就报了错误,说方法找不到。

这就是由于 maven 造成的错误,因为 maven 在默认加载的时候,如果将代码写在java中,就只会加载里面 java 类型的文件,因为 xml 并非java类型文件而是xml类型,该文件默认不会加载,因而报错显示方法找不到。


五、解决方式

1.方法一:复制 xml 到 target 目录中

复制一个 xml 到 target 目录中,该做法是因为此时 xml 没有编译,所以之间将xml 复制再粘贴到 target 的 mapper 中去即可,该方法正确可以做到。但此方法过于麻烦每次都需要进行复制,同时容易忘记复制,所以使用较少。

2.方法二:把 xml 文件放到 resource 目录中

意思就是将 xml 放到 resource 中,因为 resource 中都会自动做一个加载。但该种方法容易改变项目的结构,使得不便查找自己的代码结构。所以也不做使用。

3.方法三(推荐使用):通过配置实现

(1)pom.xml

(2)项目application.properties

在pom.xml和项目application.properties两处作配置。

解决方案:

1在pom 文件中加上以下配置内容,让其去加载其中的 xml 文件

在guli_edu 的 pom 中配置如下节点内容如下:

<!--项目打包时会将java目录中的*.xaml文件也进行打包-->

<build>

<resources>

<resource>

<directory>src/main/java</directory>

<includes>

<include>**/*.xml</include>

</includes>

<filtering>false</filtering>

</resource>

</resources>

</build>

重新打包项目会发现 traget 目录下出现了 xml 文件夹

2在 application 中加上以下内容,指定 xml 加载的位置

在 SpringBoot 配置文件中添加配置:

#配置 mapperxnl 文件的路径

mybatis-plus.mapper-locations=classpath:com/guli/edu/mappe

r/xml/*.xml

完成以上两个配置后,再在 target 中的操作文件执行就不会报错了。

4.(07-sql 语句和 maven 加载机制图解)

项目中创建 mapper 接口,编写 xml 文件 sql 语句,执行出现错误

错误:绑定异常,提示方法没有找到

ibatis.binding.BindingException:Invalidboundstatement(n

otfound):com.atguigu.eduservice.mapper.zduCourseMapper.g

etPublishcourseInfo

这个错误是由于 maven 默认加载机制造成的问题。

maven 加载时候,把 java 文件夹里面.java 类型文件进行编译,如果

其他类型文件,不会加载。

解决方式:

1.复制 xml 到 target 目录中

2.把 xml 文件放到 resources 目录中

3.推荐使用:通过配置实现

(1)pom.xml

(2)项目application.properties

相关文章
|
存储 前端开发 JavaScript
课程管理-修改课程信息(前端) | 学习笔记
简介:快速学习课程管理-修改课程信息(前端)
74 0
课程管理-修改课程信息(前端) | 学习笔记
|
XML SQL 前端开发
课程管理-课程信息确认(后端) | 学习笔记
快速学习课程管理-课程信息确认(后端)
84 0
|
前端开发 数据库 开发者
课程管理-修改课程信息(后端) | 学习笔记
简介:快速学习课程管理-修改课程信息(后端)
107 0
课程管理-修改课程信息(后端) | 学习笔记
|
前端开发 JavaScript API
课程管理-课程信息确认(前端) | 学习笔记
简介:快速学习课程管理-课程信息确认(前端)
74 0
|
前端开发 Java 开发者
课程管理-添加课程信息前端(1) | 学习笔记
简介:快速学习课程管理-添加课程信息前端(1)
94 0
课程管理-添加课程信息前端(1) | 学习笔记
|
机器学习/深度学习 前端开发 开发者
课程管理-添加课程信息前端(2) | 学习笔记
简介:快速学习课程管理-添加课程信息前端(2)
55 0
|
前端开发 API 开发者
课程分类管理-课程分类显示前端 | 学习笔记
快速学习课程分类管理-课程分类显示前端
61 0
|
开发者 微服务
课程管理-添加课程信息接口 | 学习笔记
简介:快速学习课程管理-添加课程信息接口
87 0
|
存储 前端开发 JavaScript
课程管理-修改课程信息(最终实现) | 学习笔记
简介:快速学习课程管理-修改课程信息(最终实现)
148 0
课程管理-修改课程信息(最终实现) | 学习笔记
|
JSON 前端开发 JavaScript
课程管理-修改课程信息(前端)| 学习笔记
简介:快速学习课程管理-修改课程信息(前端)
207 0
课程管理-修改课程信息(前端)| 学习笔记