举例:
Controller层 :服务员,把客人(前端)点的菜(数据、请求的类型等)进行汇总什么口味、咸淡、量的多少,交给厨师长(Service层),厨师长则告诉沾板厨师(Dao 1)、汤料房(Dao 2)、配菜厨师(Dao 3)等(统称Dao层)我需要什么样的半成品,副厨们(Dao层)就负责完成厨师长(Service)交代的任务。
项目的文件结构如下图:
下文将通过实现根据id查询People表信息的功能,梳理各层的格式与规范。
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` bigint(20) NOT NULL COMMENT '用户ID',
`name` varchar(32) NOT NULL COMMENT '名字',
`age` int(3) DEFAULT '0' COMMENT '登录次数',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO student(id,name,age)
VALUES (1,'小创',21),(2,'小明',22);
Entity层是实体层,也就是所谓的model,也称为pojo层,是数据库在项目中的类。
domain层:与数据库中的表一一对应起来的JavaBean。
model层:和domain区别是用途不同,model通常代表了不与数据库一一对应的javaBean,封装的数据是给前端的JS脚本使用的 。
对应数据库student表,id,name,age三个字段。
重写toString方法,定义get,set方法,定义构造函数。
public class StudentInfo {
private Long id;
private String name;
private Integer age;
@Override
public String toString() {
return "StudentInfo{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public StudentInfo(Long id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
}
Data Access Object,数据库访问对象。是持久层,主要与数据库进行交互。DAO层的类和表一 一对应的,建议DAO只做原子操作增删改查。
首先是设计dao层的接口,然后在配置文件中定义此接口的实现类,然后就可以再模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,dao层的数据源配置,以及有关数据库连接参数都在配置文件中进行配置。
@Mapper
public interface StudentInfoDao {
StudentInfo selectById(@Param("id") Integer id);
}
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.scyproject.dao.StudentInfoDao">
<select id="selectById" resultType="com.scyproject.domain.StudentInfo">
SELECT * FROM `student` WHERE id = #{id}
select>
mapper>
Service层 业务层 控制业务。
对一个或多个DAO进行的再次封装,封装成一个服务,所以这里也就不会是一个原子操作了,需要事务控制。
service层主要负责业务模块的应用逻辑应用设计。同样是首先设计接口,再设计其实现类,接着在配置文件中配置其实现的关联。这样我们就可以在应用中调用service接口来进行业务处理。具体要调用已经定义的dao层接口,封装service层业务逻辑有利于通用的业务逻辑的独立性和重复利用性。程序显得非常简洁。
public interface StudentInfoService {
StudentInfo selectById(Integer id);
}
@Service
public class StudentInfoServiceImpl implements StudentInfoService {
@Autowired
StudentInfoDao studentInfoDao;
@Override
public StudentInfo selectById(Integer id) {
return studentInfoDao.selectById(id);
}
}
在配置文件中配置其实现的关联(这一步在本次实践中没用到)
controller层 控制层 控制业务逻辑
controler负责请求转发,接受页面过来的参数,传给Service处理,接到返回值,再传给页面。
controller层负责具体的业务模块流程的控制,在此层要调用service层的接口来控制业务流程,控制的配置也同样是在Spring的配置文件里进行,针对具体的业务流程,会有不同的控制器。我们具体的设计过程可以将流程进行抽象归纳,设计出可以重复利用的子单元流程模块。这样不仅使程序结构变得清晰,也大大减少了代码量。
新建StudentInfoController 类,接收localhost:xxxx/student/retrieve请求,调用studetService,并返回查询结果Result类。
@RestController
public class StudentInfoController {
@Resource
private StudentInfoService studentInfoService;
@PostMapping("/student/retrieve")
public Result selectStudentById(@RequestParam("id") Integer id) {
System.out.println("id = "+id);
return Result.success(studentInfoService.selectById(id));
}
}
运行如果报错Invalid bound statement (not found),可以看下配置文件是不是配置对了。
mybatis.mapper-locations: classpath:mapper/*.xml
链接:https://www.jianshu.com/p/18c4418e9b99
链接:https://blog.csdn.net/ftfy123/article/details/113762497