Service设计模式

news/2024/5/18 22:22:33 标签: java, jdbc, 设计模式

\*\*`面向用户操作`\*\*的功能代码封装,Service业务层封装了用户的操作功能,一个用户操作,对应Service的一个方法。

### (一)**场景**

![](image/image_5_2cr5ldrq.png)

### (二)Service编程

**Service编码规范**

-   ① 一个业务模块(相关的功能属于一个模块,比如管理相关功能、账户相关操作等)的方法放在一个Service类中,命名:**`XxxxService`**,保持望文生义。
-   ② 用户的一个操作功能对应service一个方法,例如:`开卡`、`编辑卡号`、`注销卡号`、`转账`,对应方法 `openCard`、`editCard`、`removeCard`、`transfer`。
-   ③ Service的java类,通常放在`service`包下或者biz包下。

**示例代码:**

- 转账功能:

  - 实体类:

    ~~~java
 

  package com.xx.entity;
    
    import java.io.Serializable;
    //映射t_account表
    public class Account implements Serializable {
        private Integer accountId;
        private String username;
        private String password;
        private Double balance;
        //省略getter、setter、构造
    }
    ~~~

  - DAO:

   

~~~java
    package com.xx.dao;
    
    import com.xx.entity.Account;
    
    public interface AccountDao {
        /**
         * 根据账户名查询指定信息
         * @param username 被查询的账户名
         * @return 对应的对象信息
         */
        Account selectAccountByUsername(String username);
    
        /**
         * 根据账户名修改余额
         * @param username 被修改的账户名
         * @param newBalance 修改后的余额
         * @return 受影响的行数
         */
        int updateAccountByUsername(String username, double newBalance);
    }
    
    ~~~

    ~~~java
   

 package com.xx.dao.impl;
    
    import com.xx.dao.AccountDao;
    import com.xx.entity.Account;
    import com.xx.util.JDBCUtils;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    import java.util.List;
    
    public class AccountDaoImpl implements AccountDao {
        private JdbcTemplate jdbcTemplate = JDBCUtils.getJDBCTemplate();
    
        @Override
        public Account selectAccountByUsername(String username) {
            String sql = "select * from t_account where username=?";
            List<Account> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Account.class), username);
            return list.isEmpty() ? null : list.get(0);
        }
    
        @Override
        public int updateAccountByUsername(String username, double newBalance) {
            String sql = "update t_account set balance=? where username=?";
            return jdbcTemplate.update(sql, newBalance, username);
        }
    }
    
    ~~~

  - Service:

 

  ~~~java
    package com.xx.service;
    
    public interface AccountService {
        /**
         * 转账功能
         * @param fromName 用户输入的转出人姓名
         * @param toName 用户输入的转入人姓名
         * @param money 转账金额
         * @return转账是否成功的结果
         */
        boolean transfer(String fromName,String toName,double money);
    }
    ~~~

    ~~~java
 

  package com.xx.service.impl;
    
    import com.xx.dao.AccountDao;
    import com.xx.dao.impl.AccountDaoImpl;
    import com.xx.entity.Account;
    import com.xx.service.AccountService;
    
    public class AccountServiceImpl implements AccountService {
        private AccountDao ad = new AccountDaoImpl();
        @Override
        public boolean transfer(String fromName, String toName, double money) {
            //判断转出人是否存在
            Account from = ad.selectAccountByUsername(fromName);
            if (from == null) {
                throw new RuntimeException("转出人不存在!");
            }
            //判断余额是否充足
            if (from.getBalance() < money) {
                throw new RuntimeException("余额不足!");
            }
            //判断转入人是否存在
            Account to = ad.selectAccountByUsername(toName);
            if (to == null) {
                throw new RuntimeException("转入人不存在!");
            }
            //执行转账
            int n = ad.updateAccountByUsername(fromName, from.getBalance() - money);
            n += ad.updateAccountByUsername(toName, to.getBalance() + money);
            if (n == 2) {
                return true;
            }
    
            return false;
    
    
    
        }
    }
    ~~~

  - 视图层:

 

  ~~~java
    package com.xx.view;
    
    import com.xx.service.AccountService;
    import com.xx.service.impl.AccountServiceImpl;
    
    import java.util.Scanner;
    
    public class TransferView {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入转出人的账户名:");
            String fromName = sc.next();
            System.out.println("请输入转账金额:");
            double money = sc.nextDouble();
            System.out.println("请输入转入人的账户名:");
            String toName = sc.next();
    
            //调用转账功能
            AccountService as = new AccountServiceImpl();
    
            try {
                if (as.transfer(fromName, toName, money)) {
                    System.out.println("转账成功!");
                } else {
                    System.out.println("转账失败");
                }
            } catch (Exception e) {
                System.out.println("转账失败!详细信息为:"+e.getMessage());
            }
        }
    }
    
    ~~~

http://www.niftyadmin.cn/n/5366216.html

相关文章

AI专题:海外科技巨头指引,AI主线逻辑依旧坚挺

今天分享的是AI 系列深度研究报告&#xff1a;《AI专题&#xff1a;海外科技巨头指引&#xff0c;AI主线逻辑依旧坚挺》。 &#xff08;报告出品方&#xff1a;华西证券&#xff09; 报告共计&#xff1a;54页 本周热点:海外科技巨头指引&#xff0c;AI主线逻辑依旧坚挺 硬件…

MYSQL基础用PHP操作MYSQL

一、MYSQL数据库&#xff1a; systemctl start mariadb 开启数据库 mysql_secure_installation 初始设置 mysql -h localhost -uroot -proot 登录数据库 show databases;显示数据库 use mysql; 进入数据库 show tables;查看数据表 exit 推出数据表 数据类型&#xff1a; in…

UWA Pipeline 2.6.0 版本更新

UWA Pipeline是一款面向游戏开发团队的本地协作平台&#xff0c;旨在为游戏开发团队搭建专属的DevOps研发交付流水线&#xff0c;提供可视化的CICD操作界面、高可用的自动化测试以及UWA性能保障服务的无缝贴合等实用功能。 本周&#xff0c;我们迎来了全新的UWA Pipeline 2.6.…

汽车信息安全--SHE中的密钥管理(一)

目录 1.HTA基本概述 2.SHE架构及密钥管理 2.1 分清SHE和EVTIA HSM 2.2 SHE架构 3.

CVE-2024-0352:Likeshop任意文件上传漏洞复现 [附POC]

文章目录 Likeshop任意文件上传(CVE-2024-0352)漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现0x06 修复建议Likeshop任意文件上传(CVE-2024-0352)漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关…

【Java八股面试系列】JVM-垃圾回收

目录 垃圾回收 堆空间的基本结构 内存分配和回收原则 分代收集机制 Minor GC 流程 空间分配担保 老年代 大对象直接进入老年代 长期存活的对象将进入老年代 GC的区域 对象存活判定算法 引用计数法 可达性分析算法 finalize() 字符串常量判活 类判活 垃圾回收算…

Verilog实现2进制码与BCD码的互相转换

1、什么是BCD码&#xff1f; BCD码是一种2进制的数字编码形式&#xff0c;用4位2进制数来表示1位10进制中的0~9这10个数。这种编码技术&#xff0c;最常用于会计系统的设计里&#xff0c;因为会计制度经常需要对很长的数字做准确的计算。相对于一般的浮点式记数法&#xff0c;…

Flink on k8s之historyServer

1.Flink HistoryServer用途 HistoryServer可以在Flink 作业终止运行&#xff08;Flink集群关闭&#xff09;之后&#xff0c;还可以查询已完成作业的统计信息。此外&#xff0c;它对外提供了 REST API&#xff0c;它接受 HTTP 请求并使用 JSON 数据进行响应。Flink 任务停止后&…