问题如下:在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));
}
}
执行结果截图:
以下是项目中使用到的依赖:
<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>
以上就是本次全部内容啦!
漫漫学习之路,继续前行即可!
最后说明一下,这是个人的一个简单分布式架构的项目。