目录
Spring Boot创建项目常见的包结构:
二、Service(业务逻辑)和ServiceImpl(业务逻辑实现)
@RequestMapping("/weburl/errLevel")
三.Mappe
四.Xml
五.Controller
一.Entity 实体类:
主要用于数据传递,对应于数据库中的一个表。
@Data
@TableName("err_level")
@ApiModel(value = "ErrLevel对象", description = "异常等级表")
public class ErrLevel implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("异常键")
private String errKey;
@ApiModelProperty("异常值")
private String errValue;
@ApiModelProperty("异常描述")
private String errDec;
@Override
public String toString() {
return "ErrLevel{" +
"errKey = " + errKey +
", errValue = " + errValue +
", errDec = " + errDec +
"}";
}
}
-
注解
-
@Data
这是一个Lombok库的注解,它会自动为类生成getter、setter、equals、hashCode和toString方法。简化了这些方法的书写,提高了代码效率。
例如
public String getErrKey() { return errKey; } public void setErrKey(String errKey) { this.errKey = errKey; }
-
@TableName("err_level")
也是Lombok库的注解,用于指定该类对应的数据库表名为"err_level"。 @ApiModel
注解来描述ErrLevel
类,并提供了"ErrLevel对象"的value和"异常等级表"的description。同时,我们还使用了@ApiModelProperty
注解来描述每个属性,以便在生成API文档时提供更详细的信息。最后,我们还重写了toString()
方法,以便在需要时方便地打印对象的信息。- @Override 主要用于重写父类或接口中的方法。它是一种编译时检查机制,可以帮助开发人员在编写代码时避免错误。当一个子类重写父类的方法时,可以使用@Override注解,这表示该方法覆盖了父类中的方法。如果父类中不存在要重写的方法,使用@Override注解会导致编译错误。 此外,使用@Override注解还有其他好处: 提供注释功能:虽然不写@Override注解也可以重写方法,但加上它可以帮助其他开发人员更好地理解代码。防止重写过程出错:在重写、覆盖父类(超类)中的函数时,加入@Override可以防止重写过程出错,以减少失误。
- @
Serializable
这是一个Java接口,任何实现这个接口的类都可以被序列化和反序列化, 这对于将对象存储到文件或发送到网络非常重要。public class ErrLevel implements Serializable{......}
二、Service(业务逻辑)和ServiceImpl(业务逻辑实现)
说白了就是写出一个方法,再实现这个方法,和Java的写法大同小异
Service
写出方法:
public interface IErrLevelService extends IService<ErrLevel> {
int myAddErrLevel(ErrLevel errLevel);
int myUpdateErrlevel(ErrLevel errLevel);
List<ErrLevel> myQryErrlevel(ErrLevel errLevel);
int myDelErrlevel(ErrLevel errLevel);
}
注:
extends IService表示IService<ErrLevel> 是一个泛型接口,表示 这是一个操作ErrLevel对象的服务接口。IService接口中可能定义了一些通用的操作,如增加(add)、删除(delete)、更新(update)、查询(find等),当一个接口继承另一个接口时,它将会继承另一接口的所有方法
例如:
public interface IService<T> {
/**
* 默认批次提交数量
*/
int DEFAULT_BATCH_SIZE = 1000;
/**
* 插入一条记录(选择字段,策略插入)
*
* @param entity 实体对象
*/
default boolean save(T entity) {
return SqlHelper.retBool(getBaseMapper().insert(entity));
}
}
ServiceImpl
实现方法:
@Service
public class ErrLevelServiceImpl extends ServiceImpl<ErrLevelMapper, ErrLevel> implements IErrLevelService {
@Resource
ErrLevelMapper errLevelMapper ;
@Override
public int myAddErrLevel(ErrLevel errLevel) {
return errLevelMapper.addErrLevel(errLevel);
}
@Override
public int myUpdateErrlevel(ErrLevel errLevel) {
return errLevelMapper.updateErrlevel(errLevel);
}
@Override
public List<ErrLevel> myQryErrlevel(ErrLevel errLevel) {
return errLevelMapper.qryErrlevel(errLevel);
}
@Override
public int myDelErrlevel(ErrLevel errLevel) {
return errLevelMapper.delErrlevel(errLevel);
}
}
注:
需要加上左上角@Serive,标记这个类是用于编写业务逻辑,implements则是实现了业务逻辑层里面的方法
1. 继承自ServiceImpl
这个已经实现的类,并且ServiceImpl
类需要接收两个类型参数。
2. ServiceImpl
是Mybatis-Plus框架中为我们提供的一个便利的服务实现类,它接收两个泛型参数:
-
ErrLevelMapper
: 第一个参数代表的是Mapper层的类型。在Mybatis-Plus中,Mapper负责定义与数据库操作相关的方法,比如插入、删除、更新、查询等。 -
ErrLevel
: 第二个参数代表的是实体类型,它对应数据库中的ErrLevel的表。在这里,这个类型的实例将含有和ErrLevel
表中一行数据相对应的数据 -
public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {....}
关于BaseMapper稍后再讲。
三、Mapper
public interface ErrLevelMapper extends BaseMapper<ErrLevel> {
int addErrLevel(ErrLevel errLevel);
int updateErrlevel(ErrLevel errLevel);
List<ErrLevel> qryErrlevel(ErrLevel errLevel);
int myDelErrlevel(ErrLevel errLevel);
int delErrlevel(ErrLevel errLevel);
}
注:继承的Base Mapper这个接口定义了很多关于数据库操作的方法,比如我们平常写的增删查改方法,这个给接口需要一个泛型参数,这个参数是被你操作的实体类里面的类型。但是并不会全部满足你的需求,因此这就需要XML文件和手写SQL语句。
例如:
public interface BaseMapper<T> extends Mapper<T> {
/**
* 插入一条记录
*
* @param entity 实体对象
*/
int insert(T entity);
}
四、Xml文件格式:
<?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 values (#{errKey},#{errValue},#{errDec})
</insert>
</mapper>
注:
"com.webgrd.weburl.mapper.ErrLevelMapper":你的Mapper路径
五、Controller
@RestController
@RequestMapping("/weburl/errLevel")
public class ErrLevelController {
@Resource
IErrLevelService errLevelService ;
@PostMapping("/add")
public Result<Integer> addErrlvl(@RequestBody ErrLevel errLevel){
int num = errLevelService.myAddErrLevel(errLevel);
return Result.success(num,"新增成功");
}
注:
@RestController
是一个类注解,它告诉 Spring Boot 这是一个控制器类,且返回的数据默认是JSON格式。
JSON格式:
JSON是独立于语言的文本格式,很多编程语言都支持JSON,
数据被组织成键值对形式,每一个键值对可以表示一个属性。例如:
{ "name": "John", "age": 30, "city": "New York" }
也可以是一个数组
{ "names": ["John", "Anna", "Tom"] }
@RequestMapping("/weburl/errLevel")
@RequestMapping("/weburl/errLevel")
就像在一座大楼里给一个房间贴上了门牌号。这样,当有人(在这里是一个网络请求)来找这个房间(也就是我们的代码)的时候,他们就知道该去哪里。
@Resource
自动把拥有该注解的属性所需要的资源(通常是一个对象)链接到属性上,也就是说注解之后就可以通过errLevelService随时调用IErrLevelService这个类上的方法
@Resource
IErrLevelService errLevelService ;
Result
处理后返回一个Result<Integer>
类型的结果。
更简单点来说,这句代码就是在告诉电脑:“你看到我给你定义的这个函数,叫做
addErrlvl
,你在网页上收到一笔新的信息(我们叫做errLevel
这个包裹),你就用这个函数去处理它。待会儿完成后,你把处理结果打包(包装成Result<Integer>
)回送给我。
有同学就问,为什么不直接返回结果呢,确实可以直接返回结果,
但是使用Result
这样的包装类,有许多优点。
-
统一格式:使用
Result
可以使得你的所有API都返回一个统一的结构,这样前端在处理返回数据时就会更简单,因为它们可以预料到数据的具体格式。 -
包含额外信息:
Result
类通常会包含一些额外的字段,如状态码、信息描述等,这样不仅可以告诉前端请求是否成功,还可以告诉它是由于什么原因失败。 -
提高可读性:
Result
包装的结果更易于阅读和理解。当其他开发者或者你阅读这段代码时,可以清楚得知道这个函数返回什么样的数据。
未打包
{
"name": "张三",
"age": 20,
"gender": "male"
}
已打包
{
"code": 200,
"message": "操作成功",
"data": {
"name": "张三",
"age": 20,
"gender": "male"
}
}
@RequestBody
你输入的数据会被自动转换成可以被系统识别的内容,并把数据放进ErrLevel后就可以直接使用。
public Result<Integer> addErrlvl(@RequestBody ErrLevel errLevel)
Result.success(num,"新增成功")的作用:
就像那个告诉你"购买成功"的对话框。它告诉你,你的操作已经成功了,而且"新增了几个(
num
就代表这个数量)"。整个操作的结果和详情,都包装在一个叫作Result
的盒子里,并且这个盒子被送回给你,这就完成了一整个操作通知的过程。
return Result.success(num,"新增成功");
public static <T> Result<T>success(T data,String message){
return new Result<>(20000,message,data);
}
先讲到这里了,希望能帮到大家。