农产品销售管理系统实战——后端实体类与数据持久化
说明&前提
一张表对应一个实体类。我们再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> {
}