springmvc 中dao层和service层的区别说明

下面是详细讲解“springmvc 中dao层和service层的区别说明”的攻略。

1. DAO层和Service层的作用

DAO层

DAO层(Data Access Object 层)是Spring框架中负责与数据库交互,并对数据进行CRUD(增删改查)的持久化操作代码的一层。在实际开发中,DAO层通常与Hibernate、MyBatis等持久化框架联合使用,以实现数据的持久化操作。

Service层

Service层是业务逻辑层,负责调用DAO层进行数据的增删改查操作,并进行业务处理。在一个系统中,Service层通常包含多个Service接口和实现类,每个接口和实现类负责处理一个或多个模块的业务逻辑。

2. DAO层和Service层的区别说明

DAO层和Service层都是Spring框架中的重要组成部分,它们的区别可以从以下几个方面来进行说明:

2.1 功能区别

DAO层主要实现与数据库的交互操作,它的主要职责是封装底层的数据访问技术,实现对数据的持久化操作。而Service层主要负责业务逻辑的处理,Service层对DAO层的调用是为了完成自己的业务逻辑需求。

2.2 数据库操作区别

DAO层的操作主要是与数据库打交道,进行增删改查等数据库操作。Service层在对DAO进行操作的同时,还会对数据进行逻辑处理,例如事务管理和业务校验等,并且Service层也可以通过接口提供给其他模块使用。

2.3 小规模应用区别

对于小规模的应用来说,DAO层和Service层通常放在一起,使用同一个类来实现数据库的操作和业务逻辑的处理。但是随着应用规模的扩大,DAO和Service逐渐分离成为两个独立的层次,从而使应用易于维护和扩展。

3. 两条示例说明

示例一

假设有一个电商网站,我们需要实现用户注册功能。首先,我们需要定义一个User类,用于封装用户信息:

public class User {
    private String username;
    private String password;
    //getter和setter方法省略
}

然后,我们需要在DAO层中定义一个UserDao接口和实现类,用于对User类进行增删改查操作:

public interface UserDao {
    void save(User user);
    void delete(User user);
    void update(User user);
    User findByUsername(String username);
}
@Repository
public class UserDaoImpl implements UserDao {

    @Autowired
    private SqlSessionFactory sqlSessionFactory;

    @Override
    public void save(User user) {
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
            sqlSession.insert("UserMapper.insert", user);
        }
    }

    @Override
    public void delete(User user) {
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
            sqlSession.delete("UserMapper.delete", user);
        }
    }

    @Override
    public void update(User user) {
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
            sqlSession.update("UserMapper.update", user);
        }
    }

    @Override
    public User findByUsername(String username) {
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
            return sqlSession.selectOne("UserMapper.findByUsername", username);
        }
    }
}

最后,在Service层中定义一个UserService接口和实现类,用于对User进行业务处理:

public interface UserService {
    User register(User user);
}
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public User register(User user) {
        User existingUser = userDao.findByUsername(user.getUsername());
        if (existingUser != null) {
            throw new RuntimeException("用户名已存在");
        }
        userDao.save(user);
        return user;
    }
}

示例二

接下来,我们举一个更复杂的例子,比如假设有一个部门管理系统。我们需要实现三个功能:

  1. 添加一个部门;
  2. 查询部门列表;
  3. 删除一个部门。

首先,我们需要定义一个Department类,用于封装部门信息:

public class Department {
    private Integer id;
    private String name;
    private String desc;
    //getter和setter方法省略
}

然后,我们需要在DAO层中定义一个DepartmentDao接口和实现类,用于对Department类进行增删改查操作:

public interface DepartmentDao {
    void save(Department department);
    void delete(Integer id);
    void update(Department department);
    Department findById(Integer id);
    List<Department> findAll();
}
@Repository
public class DepartmentDaoImpl implements DepartmentDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void save(Department department) {
        String sql = "INSERT INTO department (name, description) VALUES (?, ?)";
        jdbcTemplate.update(sql, department.getName(), department.getDesc());
    }

    @Override
    public void delete(Integer id) {
        String sql = "DELETE FROM department WHERE id=?";
        jdbcTemplate.update(sql, id);
    }

    @Override
    public void update(Department department) {
        String sql = "UPDATE department SET name=?, description=? WHERE id=?";
        jdbcTemplate.update(sql, department.getName(), department.getDesc(), department.getId());
    }

    @Override
    public Department findById(Integer id) {
        String sql = "SELECT * FROM department WHERE id=?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(Department.class));
    }

    @Override
    public List<Department> findAll() {
        String sql = "SELECT * FROM department";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Department.class));
    }
}

最后,在Service层中定义一个DepartmentService接口和实现类,用于对Department进行业务处理:

public interface DepartmentService {
    void addDepartment(Department department);
    List<Department> getDepartmentList();
    void deleteDepartment(Integer id);
}
@Service
public class DepartmentServiceImpl implements DepartmentService {

    @Autowired
    private DepartmentDao departmentDao;

    @Override
    public void addDepartment(Department department) {
        departmentDao.save(department);
    }

    @Override
    public List<Department> getDepartmentList() {
        return departmentDao.findAll();
    }

    @Override
    public void deleteDepartment(Integer id) {
        departmentDao.delete(id);
    }
}

以上就是关于“springmvc 中dao层和service层的区别说明”的完整攻略,希望能对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springmvc 中dao层和service层的区别说明 - Python技术站

(0)
上一篇 2023年6月16日
下一篇 2023年6月16日

相关文章

  • spring boot security设置忽略地址不生效的解决

    当我们使用Spring Boot的Security模块时,经常会遇到需要设置特定路径忽略身份验证和授权的情况,但是在设置后却发现该路径还是需要认证。本文将介绍如何解决这个问题。 问题分析 在Spring Boot中,我们可以通过WebSecurity来配置安全策略。通过调用它的ignoring()方法,可以设置忽略的URL地址。但是,有时候我们会发现这样的设…

    Java 2023年5月20日
    00
  • Java基础—数据类型

    数据类型 Java 的两大数据类型:内置数据类型、引用数据类型 内置数据类型 Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。 byte、short、int、long、float、double、char、boolean 基本类型 范围 byte: (8位)-128~127 short: (26位)一个sh…

    Java 2023年4月17日
    00
  • SpringBoot Starter机制及整合tomcat的实现详解

    下面我将详细讲解“SpringBoot Starter机制及整合tomcat的实现详解”。 SpringBoot Starter机制 什么是Starter? 在Spring Boot中,Starter是指用于快速启动某一技术栈的依赖包,通过引入Starter,开发人员可以非常方便地引入一整套封装好的技术栈。 例如,我们想要应用JDBC来实现数据库操作,只需要…

    Java 2023年5月19日
    00
  • Mybatis一对多查询的两种姿势(值得收藏)

    下面我来详细讲解“Mybatis一对多查询的两种姿势(值得收藏)”的完整攻略,其中包含两个示例。 概述 Mybatis作为Java开发中热门的ORM框架之一,其支持的一对多查询功能使用起来相对简单,但是需要掌握一些技巧才能发挥出它的优势。本文将介绍Mybatis中一对多查询的两种姿势,旨在帮助开发人员更好地掌握这一功能。 前置条件 在使用Mybatis一对多…

    Java 2023年5月20日
    00
  • Java创建线程及配合使用Lambda方式

    创建线程 在 Java 中,创建线程主要有两种方式:继承 Thread 类和实现 Runnable 接口。 继承 Thread 类 继承 Thread 类是最简单的一种创建线程的方式,在继承 Thread 类后,需要重写 run 方法,在 run 方法中编写需要执行的代码。然后创建一个线程实例并调用 start 方法,这个方法会启动一个新线程,并且会自动调用…

    Java 2023年5月18日
    00
  • Linux下Varnish缓存服务器的安装与配置教程

    安装Varnish缓存服务器的步骤如下: 1. 更新apt包管理器 使用以下命令更新apt包管理器: sudo apt update 2. 安装Varnish 使用以下命令从Ubuntu存储库中安装Varnish: sudo apt install varnish 3. 配置Varnish服务器 3.1 修改Varnish默认配置 使用以下命令来编辑默认的V…

    Java 2023年6月15日
    00
  • Java如何在 Word 中设置上、下标

    Java在Word中设置上、下标,可以通过POI库来实现。下面是详细的攻略: 导入POI库 首先需要导入POI库,可从官网下载并在项目中引用。以下是Maven依赖: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifa…

    Java 2023年5月26日
    00
  • Sprint Boot @Size使用方法详解

    @Size是Spring Boot中的一个注解,用于标记一个字段或方法参数的长度必须在指定范围内。在本文中,我们将详细介绍@Size注解的作用和使用方法,并提供两个示例。 @Size注解的作用 @Size注解用于标记一个字段或方法参数的长度必须在指定范围内。当使用@Size注解标记一个字段或方法参数时,如果该字段或方法参数的长度不在指定范围内,则会抛出jav…

    Java 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部