前言
大部分是给自己留一个学习记录,如果有能帮到的,很可以。
大部分新手报错解决方法
前提,弄好了JDK的环境配置。
新手期,报错的时候只要弄好maven配置和pom.xml文件就能很好的解决大部分问题。下面是教程:
(maven配置)
在老师刚教的时候,老师都会给你们一个maven的安装包,把安装包保存到电脑文件夹里,建议存D盘,C盘东西太多会造成卡顿,如果C盘空间够,也可以存C盘,但你一定要记住你存在哪个位置,不然找不到文件,会很头疼。
打开电脑文件夹后,就找到你的maven包
注意:还没完哦,这只是配置了第一个maven而已,后面还有setting.xml和repository,但是步骤是一样的,找到他们的位置,然后配置。
pom.xml文件
pom文件里有很多依赖包,你们可以找你的老师要,这些依赖包没弄好,打代码时就容易报错
pom文件一般会报两种错(也会有其他的),第一种是springboot项目没有承认pom文件,第二种是加入新的依赖包,报红,更新不及时。
第一种报错表现形式:pom.xml文件变成橙色(手边没有素材,所以就没有图了)
解决方法:在pom.xml文件上右击鼠标,然后在弹出框中点击+ Add as Maven Project就解决了。
第二种报错表现形式:加入新依赖,新依赖爆红:(手边没有素材,所以就没有图了)
解决方法:加入新依赖后,右上角会有一个小的蓝色M,点击后,等他加载就好了。
springboot公式化框架
先来简单了解一下springboot项目的目录:
搞好环境后,就可以打代码啦,对着一片空白的代码,别慌,套公式吧!(以一个项目的用户管理为例)以下是不太专业的公式:
在有启动类的包里,包含
包名 | 解释 |
---|---|
entity | 实体类 |
service | 服务接口 |
serviceimpl | 服务接口的具体实现类 |
Mapper | 数据访问 |
Controller | 实现类 |
接下来,我会以一个项目的部分来展示代码,部分:如用户管理,汽车管理这样的小单元。
一个完整的项目,就是由这样一个一个小单元来组成,并成为一个项目,而这每个小单元就包含entity、service、serviceimpl、Mapper、controller、这五个包,而这里面要写什么呢?这就看你的项目需求是什么,那这里面就写什么。最基础的需求就是增删查改了。
接下来是分个演示。
数据库
在打项目之前,要有一个有数据的数据库,还有配置好application.yml文件
.yml文件
数据库
entity类
entity类,就是写实体的,实体就是一个事务(东西)的属性和行为(实体类可以看作是现实世界中对象的抽象表示),我们拿鸟来举例,
鸟有什么属性呢?比如鸟叫什么鸟?它是什么颜色?
鸟又由有什么行为呢?比如鸟它要吃饭,会唱歌
我们把他们抽象出来,即一个实体类叫鸟,里面有它的名字,它的颜色,它会吃饭,会唱歌,这样,一个实体类就写好了,再加上getting 和setting方法就完善了实体类。
我的项目是跟着老师一起打的,这个是一个有关于网址项目
下面是我的实体类:
package com.webgrd.weburl.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* <p>
* 异常等级表
* </p>
*
* @author author
* @since 2023-04-10
*/
@TableName("err_level")
@ApiModel(value = "ErrLevel对象", description = "异常等级表")
public class ErrLevel implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("异常键")
// @Column(name="err_key")
private String errKey;
@ApiModelProperty("异常值")
// @Column(name="err_value")
private String errValue;
@ApiModelProperty("异常描述")
// @Column(name="err_dec")
private String errDec;
public String getErrKey() {
return errKey;
}
public void setErrKey(String errKey) {
this.errKey = errKey;
}
public String getErrValue() {
return errValue;
}
public void setErrValue(String errValue) {
this.errValue = errValue;
}
public String getErrDec() {
return errDec;
}
public void setErrDec(String errDec) {
this.errDec = errDec;
}
@Override
public String toString() {
return "ErrLevel{" +
"errKey = " + errKey +
", errValue = " + errValue +
", errDec = " + errDec +
"}";
}
}
controller
在这里面写增删查改(我这张图里的更改写错了,不过下面标题为改的,修正了)
增
@PostMapping("/add")
public Result<?> addErrLevel(@RequestBody ErrLevel errLevel){
errLevelService.addErrLevel(errLevel);
return Result.success("添加成功");
}
删
@PostMapping("/del")
public Result<Integer> delErrLvl(@RequestBody ErrLevel errLevel){
int num = errLevelService.myDelErrlevel(errLevel);
return Result.success(num,"删除成功");
}
查
@GetMapping ("/qry")
public Result<List<ErrLevel>> qryErrLvl( ErrLevel errLevel){
List<ErrLevel> list = errLevelService.myQryErrlevel(errLevel);
return Result.success(list,"查询成功");
}
改
@PostMapping("/upd")
public Result<Integer> updErrLvl(@RequestBody ErrLevel errLevel){
Integer num = errLevelService.myUpdateErrlevel(errLevel);
return Result.success(num,"更新成功");
}
service
在软件开发中,服务接口和服务实现类被用来实现业务逻辑,以及提供访问数据库或其他资源的方法。
public interface IErrLevelService extends IService<ErrLevel> {
public void addErrLevel(ErrLevel errLevel);
List<ErrLevel> myQryErrlevel(ErrLevel errLevel);
int myDelErrlevel(ErrLevel errLevel);
int myUpdateErrlevel(ErrLevel errLevel);
}
Mapper
public interface ErrLevelMapper extends BaseMapper<ErrLevel> {
public void addErrLevel(ErrLevel errLevel);
int updateErrlevel(ErrLevel errLevel);
List<ErrLevel> qryErrLevel(ErrLevel errLevel);
int delErrlevel(ErrLevel errLevel);
}
serviceimpl
serviceimpl一般放在service包下,serviceimpl一般为service的具体细节实现类。
@Service
public class ErrLevelServiceImpl extends ServiceImpl<ErrLevelMapper, ErrLevel> implements IErrLevelService {
@Resource
ErrLevelMapper errLevelMapper;
@Override
public void addErrLevel(ErrLevel errLevel) {
errLevelMapper.addErrLevel(errLevel);
}
@Override
public List<ErrLevel> myQryErrlevel(ErrLevel errLevel) {
return errLevelMapper.qryErrLevel(errLevel);
}
@Override
public int myDelErrlevel(ErrLevel errLevel) {
return errLevelMapper.delErrlevel(errLevel);
}
@Override
public int myUpdateErrlevel(ErrLevel errLevel) {
return errLevelMapper.updateErrlevel(errLevel);
}
}
mapper.xml文件
一般不建议在Mapper里面写sql语句,所以,在resources下多建一个包,专门用来写sql语句
sql语句:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.webgrd.weburl.mapper.ErrLevelMapper">
<insert id="addErrLevel" parameterType="ErrLevel">
insert into err_level (errKey,errValue,errDec) values (#{errKey},#{errValue},#{errDec})
</insert>
<update id="updateErrlevel" parameterType="ErrLevel">
update err_level set errValue = #{errValue}, errDec = #{errDec}
where errKey = #{errKey}
</update>
<select id="qryErrLevel" parameterType="ErrLevel" resultType="ErrLevel">
select * from err_level where 1 = 1
<if test="errKey != null">
and errKey = #{errKey}
</if>
<if test="errValue != null">
and errValue = #{errValue}
</if>
</select>
<delete id="delErrlevel" parameterType="ErrLevel">
delete from err_level where errKey = #{errKey}
</delete>
</mapper>
写sql语句时,如果报错了,可以先在MySQL里把语句写好,并成功执行后,再把sql语句放到Mapper.xml里。
项目运行成功展示
项目成功演示
编写代码过程中遇到的问题(查询方法编写时,出错)
报错:Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public com.webgrd.common.Result<java.util.List<com.webgrd.weburl.entity.ErrLevel>> com.webgrd.weburl.controller.ErrLevelController.qryErrLvl(com.webgrd.weburl.entity.ErrLevel)]
报了这个错后,老师给我改了controller的请求方法,从Get改成了post
虽然上面的依然没有改成功,但是有一个新的报错(postman发送后报错)
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.webgrd.weburl.mapper.ErrLevelMapper.qryErrLevel] with root cause
提示我写sql语句的Mapper中有错,老师就检查了我的Mapper.java和我的Mapper.xml,就发现我的select id写错了
这是我的Mapper.java
List<ErrLevel> qryErrLevel(ErrLevel errLevel);
这是我的sql语句
<select id="qryErrlevel" parameterType="ErrLevel" >
select * from err_level where 1 = 1
<if test="errKey != null">
and errKey = #{errKey}
</if>
<if test="errValue != null">
and errValue = #{errValue}
</if>
</select>
发现qryErrLevel,大小写错误,改正过来后就可以了
然后有一个新报错
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement ‘com.webgrd.weburl.mapper.ErrLevelMapper.qryErrLevel’. It’s likely that neither a Result Type nor a Result Map was specified.] with root cause
这个错误信息表示在执行MyBatis查询时出现了问题,具体地说,MyBatis无法找到与查询语句相对应的结果映射,需要加resultType=“ErrLevel”
resultType是MyBatis中的一个元素,用于指定查询语句的返回结果类型
最后,来解决这个问题
Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public com.webgrd.common.Result<java.util.List<com.webgrd.weburl.entity.ErrLevel>> com.webgrd.weburl.controller.ErrLevelController.qryErrLvl(com.webgrd.weburl.entity.ErrLevel)]
提示controller有错,我们去controller中查看
@RequestBody
@RequestBody是Spring框架中的一个注解,用于将HTTP请求体中的JSON或XML数据绑定到Java对象。它通常用于处理POST或PUT请求,其中请求体包含要被映射到Java对象的数据。
用这个,写postman时,就得写JSON,由于我这个controller方法是用来查询的,所以把@RequestBody去掉,就可以正常运行了
查询成功
删除出错
Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type ‘text/plain;charset=UTF-8’ not supported]
解决方法:type 'text/plain;charset=UTF-8’报错解决方法
总结
大家学习过程,代码出错不要害怕,去解决。