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

yizhihongxing

下面是详细讲解“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日

相关文章

  • java BASE64Encoder详细介绍及简单实例

    Java BASE64Encoder详细介绍及简单实例 在Java中,BASE64编码是一种十分常见的数据编码方式,它将二进制数据编码成ASCII字符以方便传输。而在Java中有一个BASE64Encoder类,提供了方便的数据编码和解码功能。 BASE64Encoder类介绍 BASE64Encoder类是Java内置的实现BASE64编解码的类,它可以将…

    Java 2023年5月20日
    00
  • spring security中的csrf防御原理(跨域请求伪造)

    Spring Security 中的 CSRF(Cross-Site Request Forgery)攻击防御是非常重要的安全机制。在这个攻防机制中,Spring Security 通过在表单中添加或者 TkCooikeToken 的形式防御 CSRF 攻击,保障 Web 应用程序的安全。 CSRF 防御机制 CSRF 攻击利用用户在 Web 浏览器中处于登…

    Java 2023年5月20日
    00
  • Java案例使用集合方法实现统计任意字符串中字符出现的次数

    Java案例使用集合方法实现统计任意字符串中字符出现的次数 需求分析 我们需要编写一个Java程序,统计任意一个字符串中每个字符出现的次数。输入任意一个字符串,程序返回一个Map,其中键为字符,值为该字符在字符串中出现的次数。 设计思路 本问题我们将使用 Java 语言中的 Map 与字符数组( char[] )来实现。 遍历输入的字符串,将字符串中出现的字…

    Java 2023年5月27日
    00
  • Spring Cloud Data Flow初体验以Local模式运行

    以下是“Spring Cloud Data Flow初体验以Local模式运行”的完整攻略。 准备工作 首先需要创建一个Spring Boot项目,并添加如下依赖: <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> …

    Java 2023年5月20日
    00
  • Java实现5种负载均衡算法(小结)

    Java实现5种负载均衡算法(小结) 什么是负载均衡 负载均衡是分布式系统中常用的一种技术,用于将请求分发到多个计算机资源上,以达到平衡负载的效果。通过负载均衡技术,能够提高系统的可用性、可伸缩性和性能。 为什么需要负载均衡 在分布式系统中,有时一个计算节点无法满足系统的负载需求,而此时采用多个节点共同处理请求则成为了必要。负载均衡技术将请求分发到多个节点上…

    Java 2023年5月19日
    00
  • Spring配置动态数据源实现读写分离的方法

    下面是Spring配置动态数据源实现读写分离的方法的完整攻略。 什么是动态数据源? 动态数据源是指可以在应用程序运行时动态地切换不同的数据源,以便满足应用程序的需求。在实际应用程序中,常见的用途是实现数据库读写分离,将读操作分配到只读数据库,将写操作分配到主数据库。 实现步骤 引入依赖 在 pom.xml 中添加以下依赖: <dependency&gt…

    Java 2023年5月20日
    00
  • 微信公众号服务号推送模板消息设置方法(后端java)

    下面是详细的攻略: 微信公众号服务号推送模板消息设置方法 开启模板消息功能 要使用模板消息功能,首先需要在公众号后台开启该功能。具体操作步骤如下: 登录公众号后台,在左侧菜单栏中选择“开发者工具”。 点击页面上方的“接口权限”选项卡,找到“模板消息”并开启该功能。 开启模板消息功能后,需要到“模板消息”选项中添加至少一个消息模板。在添加模板时需要提供模板的标…

    Java 2023年5月20日
    00
  • JVM教程之Java代码编译和执行的整个过程(二)

    JVM教程之Java代码编译和执行的整个过程(二) 在第一部分中,我们讲解了Java代码编译和执行的基本过程,包括编译器、虚拟机、类加载器等。本篇文章将更加深入地介绍这个过程的细节和优化技巧,同时提供两个实际示例。 Java源代码编译成字节码文件 在上一篇文章中,我们列出了编译Java源代码的基本命令: javac HelloJava.java 这个命令将生…

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