一、概念
dao层: 持久层。主要与数据库进行交互
dao层主要是做数据持久层的工作,主要与数据库进行交互。
dao层首先会创建dao接口,然后会在配置文件中定义该接口的实现类,接着就可以在模块中就可以调用dao的接口进行数据业务的而处理,并且不用关注此接口的具体实现类是哪一个类。
dao层的数据源和数据库连接的参数数都是在配置文件中进行配置的。
entity层(domain层) 实体层,数据库在项目中的类
service(biz):业务层,控制业务
service层主要负责业务模块的逻辑应用设计。
和DAO层一样都是先设计接口,再创建要实现的类,然后在配置文件中进行配置其实现的关联。接下来就可以在service层调用接口进行业务逻辑应用的处理。
封装service层的业务逻辑有利于业务逻辑的独立性和重复利用性。
controller层(action层):控制层,控制业务逻辑
controller层负责具体的业务模块流程的控制,controller层主要调用Service层里面的接口控制具体的业务流程,控制的配置也需要在配置文件中进行。
view层:视图层
此层与控制层结合比较紧密,需要二者结合起来协同工发。View层主要负责前台jsp页面的表示。
二、MVC
MVC即:model view controller。
model层=entity层。存放我们的实体类,与数据库中的属性值基本保持一致。
service层。存放业务逻辑处理,也是一些关于数据库处理的操作,但不是直接和数据库打交道,他有接口还有接口的实现方法,在接口的实现方法中需要导入mapper层,mapper层是直接跟数据库打交道的,他也是个接口,只有方法名字,具体实现在mapper.xml文件里,service是供我们使用的方法。
mapper层=dao层,现在用mybatis逆向工程生成的mapper层,其实就是dao层。对数据库进行数据持久化操作,他的方法语句是直接针对数据库操作的,而service层是针对我们controller,也就是针对我们使用者。service的impl是把mapper和service进行整合的文件。
(多说一句,数据持久化操作就是指,把数据放到持久化的介质中,同时提供增删改查操作,比如数据通过hibernate插入到数据库中。)
controller层。控制器,导入service层,因为service中的方法是我们使用到的,controller通过接收前端传过来的参数进行业务操作,在返回一个指定的路径或者数据表。
三、区别
(1)Conroller层和Service层的区别
Controlle层负责具体的业务模块流程的控制;Service层负责业务模块的逻辑应用设计。
在具体的项目中,其流程为:Controller层调用Service层的方法,Service层调用Dao层中的方法,其中调用的参数是使用Entity层进行传递的。
(2)dao层和service层的区别
以下为转文: 首先解释面上意思,service是业务层,dao是数据访问层。
呵呵,这个问题我曾经也有过,记得以前刚学编程的时候,都是在service里直接调用dao,service里面就new一个dao类对象,调用,其他有意义的事没做,也不明白有这个有什么用,参加工作久了以后就会知道,业务才是工作中的重中之重。
我们都知道,标准主流现在的编程方式都是采用MVC综合设计模式,MVC本身不属于设计模式的一种,它描述的是一种结构,最终目的达到解耦,解耦说的意思是你更改某一层代码,不会影响我其他层代码,如果你会像spring这样的框架,你会了解面向接口编程,表示层调用控制层,控制层调用业务层,业务层调用数据访问层。
初期也许都是new对象去调用下一层,比如你在业务层new一个DAO类的对象,调用DAO类方法访问数据库,这样写是不对的,因为在业务层中是不应该含有具体对象,最多只能有引用,如果有具体对象存在,就耦合了。
当那个对象不存在,我还要修改业务的代码,这不符合逻辑。好比主板上内存坏了,我换内存,没必要连主板一起换。我不用知道内存是哪家生产,不用知道多大容量,只要是内存都可以插上这个接口使用。这就是MVC的意义。
接下来说你感觉service的意义,其实因为你现在做东西分层次不是那么严格,在一个你们做东西业务本身也少,举个最简单的例子,你做一个分页的功能,数据1000条,你20条在一个页,你可以把这个功能写成工具类封装起来,然后在业务层里调用这个封装的方法,这才是业务里真正干得事,只要没访问数据库的,都要在业务里写。
再有不明白的追问,这是经验问题,呵呵,其实以后你就会懂。只是刚开始写的代码都是有个请求,我就去数据库取,业务几乎没有。
比说你现在用的是SSH框架,做一个用户模块:
(1)、假设现在你做这个功能会用到user表和权限表,那么你前台的页面访问action,action再去调用用户模块service,用户模块service判断你是操作user表还是权限表,如果你操作的是user表则service的实现类就去调用userDAO。如果是操作的是权限表则调用权限的DAO
(2)、也就是说DAO一定是和数据库的每张表一一对应,而service则不是。明白的没?其实你一个项目一个service和一个DAO其实也一样可以操作数据库,只不过那要是表非常多,出问题了,那找起来多麻烦,而且太乱了
(3)、好处就是你的整个项目非常系统化,和数据库的表能一致,而且功能模块化,这样以后维护或者改错比较容易,性能也高一些
四、怎么写(实操)
(1)项目结构
(2)实体类
添加属性和属性对应的get,set方法,有参无参构造方法,toString()方法
package service_dao_demo.entity;
public class Student {
private int stuNo;
private String name;
private int age;
public Student() {
}
public Student(int stuNo, String name, int age) {
this.stuNo = stuNo;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"stuNo=" + stuNo +
", name='" + name + ''' +
", age=" + age +
'}';
}
public int getStuNo() {
return stuNo;
}
public void setStuNo(int stuNo) {
this.stuNo = stuNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
(3)dao层接口
根据实体类创建增删改查学生信息的方法
package service_dao_demo.dao.student;
import service_dao_demo.entity.Student;
public interface StudentDao {
void addInfo(Student student);
void deleteInfo(int stuNo);
void updateInfo(Student student);
Student findInfo(int stuNo);
}
(4)dao层实现类
实现dao层接口,直接对数据库进行操作
package service_dao_demo.dao.student.studentImpl;
import service_dao_demo.dao.student.StudentDao;
import service_dao_demo.entity.Student;
public class StudentDaoImpl implements StudentDao {
Student student = new Student();
@Override
public void addInfo(Student student) {
// 操作数据库的代码
}
@Override
public void deleteInfo(int stuNo) {
// 操作数据库的代码
}
@Override
public void updateInfo(Student student) {
// 操作数据库的代码
}
@Override
public Student findInfo(int stuNo) {
// 操作数据库的代码
return student;
}
}
(5)service层接口
根据实际需求,在dao层接口中选择方法创建
package service_dao_demo.service.student;
import service_dao_demo.entity.Student;
public interface StudentService {
void addInfo(Student student);
void deleteInfo(int stuNo);
void updateInfo(Student student);
Student findInfo(int stuNo);
}
(6)service层实现类
实现service层接口,不直接对数据库进行操作,通过dao层实现类对数据库进行操作(直接对数据库进行操作的只有dao层实现类)
package service_dao_demo.service.student.studentImpl;
import service_dao_demo.dao.student.studentImpl.StudentDaoImpl;
import service_dao_demo.entity.Student;
import service_dao_demo.service.student.StudentService;
public class StudentServiceImpl implements StudentService {
StudentDaoImpl studentDaoImpl = new StudentDaoImpl();
@Override
public void addInfo(Student student) {
studentDaoImpl.addInfo(student);
}
@Override
public void deleteInfo(int stuNo) {
studentDaoImpl.deleteInfo(stuNo);
}
@Override
public void updateInfo(Student student) {
studentDaoImpl.updateInfo(student);
}
@Override
public Student findInfo(int stuNo) {
return studentDaoImpl.findInfo(stuNo);
}
}
(7)测试类调用代码
StudentServiceImpl serviceImpl = new StudentServiceImpl();
Student student = new Student();
student.setName("张三");
student.setAge(15);
student.setStuNo(123);
serviceImpl.addInfo(student);