写写关于持久层,业务层和控制层的自己看法

写写关于持久层,业务层和控制层的自己看法

1:持久层

持久层也叫DAO层,主要工作是负责给数据库做CRUD操作,并把这些数据库操作提供给业务层做处理。如果比作做饭的话,持久层好比是给做饭提供食材。

package com.cy.store.mapper;

import com.cy.store.entity.Address;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/** 处理收货地址数据的持久层接口 */
public interface AddressMapper {
    /**
     * 插入收货地址数据
     * @param address 收货地址数据
     * @return 受影响的行数
     */
    Integer insert(Address address);

    /**
     * 统计某用户的收货地址数据的数量
     * @param uid 用户的id
     * @return 该用户的收货地址数据的数量
     */
    Integer countByUid(Integer uid);

    /**
     * 查询某用户的收货地址列表数据
     * @param uid 收货地址归属的用户id
     * @return 该用户的收货地址列表数据
     */
    List<Address> findByUid(Integer uid);


    /**
     * 将某用户的所有收货地址设置为非默认地址
     * @param uid 收货地址归属的用户id
     * @return 受影响的行数
     */
    Integer updateNonDefaultByUid(Integer uid);

    /**
     * 将指定的收货地址设置为默认地址
     * @param aid 收货地址id
     * @param modifiedUser 修改执行人
     * @param modifiedTime 修改时间
     * @return 受影响的行数
     */
    Integer updateDefaultByAid(
            @Param("aid") Integer aid,
            @Param("modifiedUser") String modifiedUser,
            @Param("modifiedTime") Date modifiedTime);

    /**
     * 根据收货地址aid值,查询收货地址详情
     * @param aid 收货地址id
     * @return 匹配的收货地址详情,如果没有匹配的数据,则返回null
     */
    Address findByAid(Integer aid);

    /**
     * 根据收货地址id删除数据
     * @param aid 收货地址id
     * @return 受影响的行数
     */
    Integer deleteByAid(Integer aid);

    /**
     * 查询某用户最后修改的收货地址
     * @param uid 归属的用户id
     * @return 该用户最后修改的收货地址,如果该用户没有收货地址数据则返回null
     */
    Address findLastModified(Integer uid);

}

2:业务层

业务层也叫Service层,主要工作是负责组装一下持久层的数据操作,把需要的数据封装在实体类中,并提供最终控制层需要的数据。所以如果比作做饭的话,那么业务层好比拿着持久层提供的食材,然后做成一道客官喜爱的菜式。

 @Override
    public void delete(Integer aid, Integer uid, String username) {
        // 根据参数aid,调用findByAid()查询收货地址数据
        Address result = addressMapper.findByAid(aid);
        // 判断查询结果是否为null
        if (result == null) {
            // 是:抛出AddressNotFoundException
            throw new AddressNotFoundException("尝试访问的收货地址数据不存在");
        }

        // 判断查询结果中的uid与参数uid是否不一致(使用equals()判断)
        if (!result.getUid().equals(uid)) {
            // 是:抛出AccessDeniedException:非法访问
            throw new AccessDeniedException("非常访问");
        }

        // 根据参数aid,调用deleteByAid()执行删除
        Integer rows1 = addressMapper.deleteByAid(aid);
        if (rows1 != 1) {
            throw new DeleteException("删除收货地址数据时出现未知错误,请联系系统管理员");
        }

        // 判断查询结果中的isDefault是否为0
        if (result.getIsDefault() == 0) {
            return;
        }

        // 调用持久层的countByUid()统计目前还有多少收货地址
        Integer count = addressMapper.countByUid(uid);
        // 判断目前的收货地址的数量是否为0
        if (count == 0) {
            return;
        }

        // 调用findLastModified()找出用户最近修改的收货地址数据
        Address lastModified = addressMapper.findLastModified(uid);
        // 从以上查询结果中找出aid属性值
        Integer lastModifiedAid = lastModified.getAid();
        // 调用持久层的updateDefaultByAid()方法执行设置默认收货地址,并获取返回的受影响的行数
        Integer rows2 = addressMapper.updateDefaultByAid(lastModifiedAid, username, new Date());
        // 判断受影响的行数是否不为1
        if (rows2 != 1) {
            // 是:抛出UpdateException
            throw new UpdateException("更新收货地址数据时出现未知错误,请联系系统管理员");
        }
    }

3:控制层

控制层也叫Controller层,主要工作是负责根据传递cookie参数,session参数或者前端传过来的参数,并把这些参数来传递给业务层封装好的数据操作,并把持久层传递过来的数据进行序列化后传递给前端页面。如果比作做饭的话,那么控制层就好比是把做好的菜式传给服务员,让服务员传到客官的菜桌上来享用。

    @RequestMapping("{aid}/delete")
    public JsonResult<Void> delete(@PathVariable("aid") Integer aid, HttpSession session) {
        Integer uid = getUidFromSession(session);
        String username = getUsernameFromSession(session);
        addressService.delete(aid, uid, username);
        return new JsonResult<Void>(OK);
    }
  • 35
    点赞
  • 142
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
持久层设计是指在应用程序和数据库之间建立一个稳定的、可靠的数据访问。在设计持久层时,需要考虑以下几个方面: 1. 数据库选择:根据业务需求选择合适的数据库,如关系型数据库、非关系型数据库等。 2. ORM框架选择:ORM框架可以将数据库操作转换为对象操作,大大简化了开发流程。常见的ORM框架有Hibernate、Mybatis等。 3. 数据库表设计:根据业务需求设计数据库表,包括表结构、字段类型、索引等。 4. DAO设计:DAO(Data Access Object)持久层的核心,负责与数据库进行交互。需要根据业务需求设计DAO接口和实现类。 下面是一个简单的持久层设计示例: 1. 数据库选择:选择MySQL数据库。 2. ORM框架选择:选择Mybatis框架。 3. 数据库表设计:设计一个用户表,包括以下字段:id、username、password、email、phone。 4. DAO设计:定义UserDao接口,包括以下方法: - addUser(User user):添加用户。 - deleteUser(int id):删除用户。 - updateUser(User user):更新用户信息。 - getUserById(int id):根据ID获取用户信息。 - getUserByUsername(String username):根据用户名获取用户信息。 实现UserDao接口的类为UserDaoImpl,具体实现如下: ``` public class UserDaoImpl implements UserDao { private SqlSessionFactory sessionFactory; public UserDaoImpl(SqlSessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public void addUser(User user) { try (SqlSession session = sessionFactory.openSession()) { session.insert("addUser", user); session.commit(); } } public void deleteUser(int id) { try (SqlSession session = sessionFactory.openSession()) { session.delete("deleteUser", id); session.commit(); } } public void updateUser(User user) { try (SqlSession session = sessionFactory.openSession()) { session.update("updateUser", user); session.commit(); } } public User getUserById(int id) { try (SqlSession session = sessionFactory.openSession()) { return session.selectOne("getUserById", id); } } public User getUserByUsername(String username) { try (SqlSession session = sessionFactory.openSession()) { return session.selectOne("getUserByUsername", username); } } } ``` 上述代码中,SqlSessionFactory是Mybatis框架的核心接口,用于创建SqlSession对象。SqlSession对象用于执行SQL语句,包括增删改查等操作。在每个方法中,首先通过SqlSessionFactory创建SqlSession对象,然后执行对应的SQL语句,最后提交事务或关闭SqlSession对象。 这是一个简单的持久层设计示例,可以根据业务需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值