农产品销售管理系统实战——后端实体类与数据持久化

说明&前提

一张表对应一个实体类。我们再src/main/java/cn/edu/ujn/argi下创建model目录。

BaseModel和ModelAop

BaseModel定义多个实体类共同的属性,其他实体类都集成自该类。

src/main/java/cn/edu/ujn/argi/model下创建BaseModel.java文件:

package cn.edu.ujn.argi.model;

import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;

@Data
public class BaseModel {
    @TableId(type = IdType.AUTO)
    private Long id;

    private boolean isDeleted = false;  // 软删除标记

    private Date createdTime = new Date();  // 创建时间
    private Date updatedTime = new Date();  // 更新时间

    public void softDelete(){
        this.isDeleted = true;
        this.updatedTime = new Date();
    }

    public void updateUpdatedTime(){
        this.updatedTime = new Date();
    }
}

在某些情况下我们希望不是真正删除数据库的某一行,而是标记该行不被识别到或者说不会返回给用户,这就叫做软删除。通过软删除标记我们可以做到这一点。

updateUpdatedTime是用于Aop的一个方法,我们在每次使用setter来更新信息的时候都需要修改时间。

然后我们在该目录下编写ModelAop.java

package cn.edu.ujn.argi.model;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class ModelAop {
    /**
     * 定义切点,拦截所有BaseModel及其子类的setter方法
     */
    @Pointcut("execution(* cn.edu.ujn.argi.model.BaseModel+.set*(..))")
    public void modelSetter() {}

    /**
     * 在setter方法执行后更新 updatedTime
     */
    @After("modelSetter()")
    public void updateUpdatedTime(JoinPoint joinPoint) {
        Object target = joinPoint.getTarget();
        if (target instanceof BaseModel) {
            BaseModel model = (BaseModel) target;
            // 更新 updatedTime
            model.updateUpdatedTime();
        }
    }
}

创建实体类

在目录src/main/java/cn/edu/ujn/argi/model创建

用户实体类UserModel.java

package cn.edu.ujn.argi.model;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;

import lombok.Data;

@Data
@TableName("tb_user")
public class UserModel extends BaseModel {
    @TableField("name")
    private String name;

    @TableField("password")
    private String password;

    @TableField("money")
    private String money = "0.00";

    @TableField("salt")
    private String salt;

    @TableField("role")
    private String role = "user";
}

用户地址实体类AddressModel.java

package cn.edu.ujn.argi.model;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;

import lombok.Data;

@Data
@TableName("tb_address")
public class AddressModel extends BaseModel {
    @TableField("user_id")
    private Long userId;

    @TableField("address")
    private String address;
}

商品实体类CommodityModel.java

package cn.edu.ujn.argi.model;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;

import lombok.Data;

@Data
@TableName("tb_commodity")
public class CommodityModel extends BaseModel {
    @TableField("name")
    private String name;

    @TableField("price")
    private String price;

    @TableField("total")
    private Long total;

    @TableField("cnt")
    private Long cnt;

    @TableField("pic")
    private byte[] pic;
}

购物车实体类CartModel.java

package cn.edu.ujn.argi.model;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;

import lombok.Data;

@Data
@TableName("tb_cart")
public class CartModel extends BaseModel {
    @TableField("user_id")
    private String userId;

    @TableField("commodity_id")
    private String commodityId;

    @TableField("cnt")
    private Long cnt;
}

订单实体类OrderModel.java

package cn.edu.ujn.argi.model;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;

import lombok.Data;

@Data
@TableName("tb_order")
public class OrderModel extends BaseModel {
    @TableField("user_id")
    private String userId;

    @TableField("commodity_id")
    private String commodityId;

    @TableField("cnt")
    private Long cnt;

    @TableField("total")
    private String total;   // 这里的total是总价格
}

这里我们来说下MyBatisPlus的注解。@TableName注解用于告诉ORM实体类对应的表,而@TableField用于映射实体类属性和数据库表的字段。

实现数据持久层

MyBatisPlus有一个好处,它提供了一个BaseMapper<T>类型,只要你通过这个泛型参数传入实体类,只需要继承这个接口,它就可以通过自动扫描和Spring容器自动为你注入,而无需去写相关XML文件来实现数据实体的增删改查。

不过在此之前我们得再ArgiApplication.java中配置,当框架需要mapper的时候通过这个配置找到该文件夹下的代码。在main方法上添加@MapperScan("cn.edu.ujn.argi.mapper")即可。

package cn.edu.ujn.argi;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan(basePackages = "cn.edu.ujn.argi")
@MapperScan("cn.edu.ujn.argi.mapper")
@SpringBootApplication
public class ArgiApplication {

    public static void main(String[] args) {
        SpringApplication.run(ArgiApplication.class, args);
    }

}

我们在src/main/java/cn/edu/ujn/argi目录下创建mapper文件夹

接下来我们在这个mapper文件夹写编写各个实体类的数据持久化。需要注意的是,我们在接下来编写的都是接口。

首先是UserMapper.java

package cn.edu.ujn.argi.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import cn.edu.ujn.argi.model.UserModel;
public interface UserMapper extends BaseMapper<UserModel> {
}

然后是AddressMapper.java

package cn.edu.ujn.argi.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import cn.edu.ujn.argi.model.AddressModel;

public interface AddressMapper extends BaseMapper<AddressModel> {
}

CommodityMapper.java

package cn.edu.ujn.argi.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import cn.edu.ujn.argi.model.CommodityModel;

public interface CommodityMapper extends BaseMapper<CommodityModel> {
}

CartMapper.java

package cn.edu.ujn.argi.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import cn.edu.ujn.argi.model.CartModel;

public interface CartMapper extends BaseMapper<CartModel> {
   
}

OrderMapper.java

package cn.edu.ujn.argi.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import cn.edu.ujn.argi.model.OrderModel;

public interface OrderMapper extends BaseMapper<OrderModel> {
    
}
最后修改:2025 年 04 月 15 日
如果觉得我的文章对你有用,请随意赞赏