springboot中工具类调用service层、dao层

问题如下:在controller中只能返回相应的内容到相应页面上,那么处理数据库中没有的数据时,只能通过工具类来进行调用。
即,我想在工具类中查数据库的数据,对数据进一步的处理。

查了很多博客,发现了一些坑。
以下只为下次使用时避免跳坑里:

结合我本次项目中一些内容来说明:

数据库中对应的bean对象:Card.java

import java.io.Serializable;

//Serializable表示对字段序列化
public class Card implements Serializable {
	private int id;//卡号
	private String name;//姓名
	private String password;//密码
	private double balance;//余额

	public Card(){}
	public Card(int id,String name,String password,double balance){
		this.id=id;
		this.name=name;
		this.password=password;
		this.balance=balance;
	}
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public double getBalance() {
		return balance;
	}

	public void setBalance(double balance) {
		this.balance = balance;
	}

	@Override
	public String toString() {
		return "Card{" +
				"id=" + id +
				", name='" + name + '\'' +
				", password='" + password + '\'' +
				", balance=" + balance +
				'}';
	}
}

通过一个中间类进行处理 CardDepend.java

import java.io.Serializable;

public class CardDepend implements Serializable {
	private int id;//消费卡号
	private double update;//消费或充值多少元

	public CardDepend(){}
	public CardDepend(int id,double update){
		this.id=id;
		this.update=update;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public double getUpdate() {
		return update;
	}

	public void setUpdate(double update) {
		this.update = update;
	}


	@Override
	public String toString() {
		return "Pay{" +
				"id=" + id +
				", update=" + update +
				'}';
	}
}

实体类Card的Dao层:CardMapper.java

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import edu.cn.common.bean.Card;

public interface CardMapper extends BaseMapper<Card> {
}

*CardMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="edu.cn.server.mapper.CardMapper">

</mapper>

实体类Card的Service层:CardService.java

import com.baomidou.mybatisplus.extension.service.IService;
import edu.cn.common.bean.Card;


public interface CardService extends IService<Card> {

}

Card的Service层的实现类:CardServiceImpl.java

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import edu.cn.common.bean.Card;
import edu.cn.server.service.CardService;
import edu.cn.server.mapper.CardMapper;
import org.springframework.stereotype.Service;

@Service
public class CardServiceImpl extends ServiceImpl<CardMapper, Card> implements CardService {
}

现在的问题是,我需要处理的业务逻辑不是对Card这个实体进行直接的增删改查,而是校园卡形式的刷卡消费、充值、申请账户等。

下面是我需要处理的业务逻辑:CampusCardService.java

import edu.cn.common.bean.Card;
import edu.cn.common.unti.CardDepend;

public interface CampusCardService {

	String pay(CardDepend depend);//支付
	boolean apply(Card card);//开户
	boolean invest(CardDepend depend);//充值

}

该业务逻辑的实现类:CampusCardServiceImpl.java

import edu.cn.common.bean.Card;
import edu.cn.common.service.CampusCardService;
import edu.cn.common.unti.CardDepend;
import edu.cn.server.utils.CardUntil;
import org.springframework.stereotype.Service;


@Service
public class CampusCardServiceImpl implements CampusCardService {
	@Override
	public String pay(CardDepend depend) {//支付
		String message="消费失败!您的余额不足!请先充值!";
		Card card= CardUntil.getById(depend.getId());//获取当前账户信息
		if(card!=null){//如果存在该账户
			double balance=card.getBalance();//现在的余额
			double update=depend.getUpdate();//消费额
			double balanced=balance-update;//消费后的余额
			if(balance>=0){//消费后的余额大于等于0(即余额够此次消费)
				card.setBalance(balanced);
				CardUntil.updateById(card);
				message="消费成功!本次消费"+update+"元,剩余"+balanced+"元!";
			}else{//余额不足

			}
		}else{//不存在该账户
			message="发生错误:不存在该账户!";
		}
		return message;
	}

	@Override
	public boolean apply(Card card) {//申请账户
		return CardUntil.save(card);
	}

	@Override
	public boolean invest(CardDepend depend) {//充值
		Card card=CardUntil.getById(depend.getId());//获取当前账户信息
		double balanced=card.getBalance()+depend.getUpdate();
		card.setBalance(balanced);
		return CardUntil.updateById(card);
	}
}

重点来了!需要我们自己编写一个工具类来调Service层中的方法进行拿和放数据到数据库中,工具类中的方法只能是static,不能new
工具类:CardUntil.java

import edu.cn.common.bean.Card;
import edu.cn.server.service.CardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

//该注解表示该类是spring的一个组件
@Component
public class CardUntil {
	@Autowired
	private CardService cardService;

	private static CardService service;
//这是jdk自带的构造器方法
	@PostConstruct
	public void init(){
		service=cardService;
	}
//其实可以看做重写了service的方法,现在可以直接调用
	public static Card getById(Integer id){
		return service.getById(id);
	}

	public static boolean updateById(Card card){
		return service.updateById(card);
	}

	public static boolean save(Card card){
		return service.save(card);
	}
}

下面通过junit来进行测试(注意!不能直接通过自己编写的main方法来测试

import edu.cn.common.unti.CardDepend;
import edu.cn.server.service.impl.CampusCardServiceImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class CardServerApplicationTest {
	@Test
	public void contextTest(){
		//要处理的业务逻辑的实现类
		CampusCardServiceImpl card=new CampusCardServiceImpl();
		//中间类
		CardDepend depend=new CardDepend(1,50);
		//执行pay方法
		System.out.println(card.pay(depend));
	}
}

执行结果截图:
springboot中工具类调用service层、dao层
以下是项目中使用到的依赖:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.3.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity</artifactId>
            <version>1.7</version>
        </dependency>

    </dependencies>

以上就是本次全部内容啦!
漫漫学习之路,继续前行即可!

最后说明一下,这是个人的一个简单分布式架构的项目。

上一篇:前端学习之搭建github静态博客总结


下一篇:stm32Cubemx实用篇(四):SD卡读写实验