auto keyword demo

本文介绍了一个简单的C++程序,展示了变量赋值、算术运算和标准输出的操作,并通过实例演示了如何使用STL中的vector容器进行元素遍历。
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int v1 = 10;
    int v2 = 20;
    auto v = v1 + v2;
    cout << v << endl;

    vector<int> ivec { 1, 2, 3, 4 };
    for (auto elem : ivec)
        cout << elem << " ";
    cout << endl;

    for (auto it = ivec.begin(); it != ivec.end(); ++it)
        cout << *it << " ";
    cout << endl;

    return 0;
}

<think>我们在构建一个SpringBoot工资管理系统时,需要遵循三层架构:表现层(Controller)、业务层(Service)和数据访问层(Repository/DAO)。下面我们重点介绍如何创建实体类(Entity)、数据访问层(Repository)和业务层(Service)。###1.创建实体类(Entity)实体类对应数据库中的表,用于存储工资相关的数据。例如,我们可以创建一个`Salary`类,包含员工ID、姓名、基本工资、奖金、扣款等字段。```java//Salary.javaimportjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;@EntitypublicclassSalary{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLongid;privateStringemployeeId;//员工工号privateStringname;//员工姓名privatedoublebaseSalary;//基本工资privatedoublebonus;//奖金privatedoublededuction;//扣款//构造方法(无参和有参)、Getter和Setter方法publicSalary(){}//有参构造方法(可选)publicSalary(StringemployeeId,Stringname,doublebaseSalary,doublebonus,doublededuction){this.employeeId=employeeId;this.name=name;this.baseSalary=baseSalary;this.bonus=bonus;this.deduction=deduction;}//省略Getter和Setter方法(实际开发中需要生成)publicLonggetId(){returnid;}publicvoidsetId(Longid){this.id=id;}//其他字段的Getter和Setter...}```###2.创建Repository接口(数据访问层)Repository接口继承自SpringDataJPA的`JpaRepository`,提供基本的CRUD操作。我们只需定义接口,SpringDataJPA会自动实现。```java//SalaryRepository.javaimportorg.springframework.data.jpa.repository.JpaRepository;importorg.springframework.stereotype.Repository;@RepositorypublicinterfaceSalaryRepositoryextendsJpaRepository<Salary,Long>{//可以根据需要添加自定义查询方法//例如:根据员工工号查询工资记录SalaryfindByEmployeeId(StringemployeeId);}```###3.创建Service(业务层)Service层处理业务逻辑,调用Repository进行数据操作。我们先定义接口,再实现类。####3.1创建Service接口```java//SalaryService.javaimportjava.util.List;publicinterfaceSalaryService{//保存工资记录SalarysaveSalary(Salarysalary);//根据ID查询工资记录SalarygetSalaryById(Longid);//查询所有工资记录List<Salary>getAllSalaries();//更新工资记录SalaryupdateSalary(Salarysalary);//删除工资记录voiddeleteSalary(Longid);}```####3.2创建Service实现类```java//SalaryServiceImpl.javaimportorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importjava.util.List;@ServicepublicclassSalaryServiceImplimplementsSalaryService{privatefinalSalaryRepositorysalaryRepository;@AutowiredpublicSalaryServiceImpl(SalaryRepositorysalaryRepository){this.salaryRepository=salaryRepository;}@OverridepublicSalarysaveSalary(Salarysalary){returnsalaryRepository.save(salary);}@OverridepublicSalarygetSalaryById(Longid){returnsalaryRepository.findById(id).orElse(null);}@OverridepublicList<Salary>getAllSalaries(){returnsalaryRepository.findAll();}@OverridepublicSalaryupdateSalary(Salarysalary){returnsalaryRepository.save(salary);//save方法如果已存在ID,则会更新}@OverridepublicvoiddeleteSalary(Longid){salaryRepository.deleteById(id);}}```###总结步骤1.**实体类**:使用`@Entity`注解标注类,定义字段和关联关系,使用`@Id`标注主键。2.**Repository**:创建接口并继承`JpaRepository`,可以自定义查询方法。3.**Service**:-定义接口声明业务方法。-实现类使用`@Service`注解,通过`@Autowired`注入Repository,并实现业务逻辑。这样,我们就完成了工资管理系统的核心数据操作部分。后续可以在Controller层处理HTTP请求,调用Service层提供接口。§§相关问题§§1.如何为工资管理系统设计数据库表结构?2.SpringDataJPA中如何实现复杂查询?3.在SpringBoot中如何测试Repository和Service层?4.工资管理系统如何实现权限控制?</think> ### SpringBoot工资管理系统:实体类、Repository与Service创建教程 以下是基于SpringBoot创建工资管理系统的具体步骤,采用三层架构设计(实体类 → Repository接口 → Service层),遵循JPA规范进行数据操作。 #### 1. **创建实体类(Entity)** 对应数据库的`salary`表,存储工资数据: ```java // Salary.java import jakarta.persistence.*; @Entity @Table(name = "salary") public class Salary { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 主键ID @Column(nullable = false) private String employeeId; // 员工工号 private String name; // 员工姓名 @Column(precision = 10, scale = 2) private BigDecimal baseSalary; // 基本工资(精确到小数点后两位) private BigDecimal bonus; // 奖金 private BigDecimal deduction; // 扣款 // 全参构造器(可选) // 无参构造器(必须) // Getter & Setter(必须) } ``` > **注意**: > - `@Entity` 标记为JPA实体类 > - `@Table` 指定数据库表名 > - `@Column` 定义字段约束 --- #### 2. **创建Repository接口** 继承`JpaRepository`提供基础的CRUD操作: ```java // SalaryRepository.java import org.springframework.data.jpa.repository.JpaRepository; public interface SalaryRepository extends JpaRepository<Salary, Long> { // 1. 根据员工工号查询 Optional<Salary> findByEmployeeId(String employeeId); // 2. 查询高于指定工资的记录 List<Salary> findByBaseSalaryGreaterThan(BigDecimal amount); // 3. 按姓名模糊查询 List<Salary> findByNameContaining(String keyword); } ``` > **自动实现机制**: > Spring Data JPA会根据方法名自动生成SQL查询(如`findByBaseSalaryGreaterThan` → `WHERE base_salary > ?`) --- #### 3. **创建Service层** ##### 3.1 定义Service接口 ```java // SalaryService.java public interface SalaryService { Salary saveSalary(Salary salary); // 创建或更新 Optional<Salary> getById(Long id); // 按ID查询 List<Salary> getAll(); // 获取所有 void deleteSalary(Long id); // 删除 BigDecimal calculateNetPay(Long id); // 计算实发工资(业务逻辑) } ``` ##### 3.2 Service实现类 ```java // SalaryServiceImpl.java import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional public class SalaryServiceImpl implements SalaryService { private final SalaryRepository salaryRepository; // 构造器注入 public SalaryServiceImpl(SalaryRepository salaryRepository) { this.salaryRepository = salaryRepository; } @Override public Salary saveSalary(Salary salary) { return salaryRepository.save(salary); // JPA自动执行INSERT/UPDATE } @Override public Optional<Salary> getById(Long id) { return salaryRepository.findById(id); } @Override public List<Salary> getAll() { return salaryRepository.findAll(); } @Override public void deleteSalary(Long id) { salaryRepository.deleteById(id); } @Override public BigDecimal calculateNetPay(Long id) { Salary salary = salaryRepository.findById(id) .orElseThrow(() -> new EntityNotFoundException("工资记录不存在")); // 计算实发工资 = 基本工资 + 奖金 - 扣款 return salary.getBaseSalary() .add(salary.getBonus()) .subtract(salary.getDeduction()); } } ``` --- #### 4. **关键配置** 在`application.properties`添加数据库连接: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/salary_db spring.datasource.username=root spring.datasource.password=123456 spring.jpa.hibernate.ddl-auto=update # 自动更新表结构 ``` --- ### 分层架构验证(伪代码测试) ```java // 注入Service测试 @Autowired private SalaryService salaryService; public void testSalaryFlow() { Salary salary = new Salary("EMP001", "张三", BigDecimal.valueOf(8000), BigDecimal.valueOf(2000), BigDecimal.valueOf(500)); // 保存到数据库 Salary saved = salaryService.saveSalary(salary); // 计算实发工资:8000 + 2000 - 500 = 9500 BigDecimal netPay = salaryService.calculateNetPay(saved.getId()); System.out.println("实发工资:" + netPay); // 输出9500.00 } ``` > **事务保障**:Service层的`@Transactional`保证数据库操作的原子性,异常时自动回滚。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值