diff --git a/mybatis-plus-test/pom.xml b/mybatis-plus-test/pom.xml
new file mode 100644
index 0000000..2c7759e
--- /dev/null
+++ b/mybatis-plus-test/pom.xml
@@ -0,0 +1,36 @@
+
+
+ 4.0.0
+
+ com.ruoyi
+ ruoyi
+ 3.8.7
+
+
+ mybatis-plus-test
+
+
+ UTF-8
+
+
+
+ com.ruoyi
+ ruoyi-common
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+
+ com.ruoyi
+ ruoyi-admin
+ 3.8.7
+ test
+
+
+
+
\ No newline at end of file
diff --git a/mybatis-plus-test/src/main/java/com/ruoyi/mp/constant/OrderStatus.java b/mybatis-plus-test/src/main/java/com/ruoyi/mp/constant/OrderStatus.java
new file mode 100644
index 0000000..35eaf98
--- /dev/null
+++ b/mybatis-plus-test/src/main/java/com/ruoyi/mp/constant/OrderStatus.java
@@ -0,0 +1,31 @@
+package com.ruoyi.mp.constant;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+
+/**
+ * @author yexuejc
+ * @class-name OrderStatus
+ * @description
+ * @date 2024/1/19 15:29
+ */
+public enum OrderStatus {
+ /** 订单状态:默认:未支付 */
+ NORMAL(0),
+ /** 订单状态:已支付,待发货 */
+ PAYED(1),
+ /** 订单状态:已发货,待收货 */
+ SHIPPED(2),
+ /** 订单状态:完成,已收货 */
+ RECEIVED(3),
+ /** 订单状态:取消 */
+ CANCEL(4),
+ ;
+
+
+ @EnumValue
+ public final int code;
+
+ OrderStatus(int code) {
+ this.code = code;
+ }
+}
diff --git a/mybatis-plus-test/src/main/java/com/ruoyi/mp/domain/BaseVersionEntity.java b/mybatis-plus-test/src/main/java/com/ruoyi/mp/domain/BaseVersionEntity.java
new file mode 100644
index 0000000..72c0496
--- /dev/null
+++ b/mybatis-plus-test/src/main/java/com/ruoyi/mp/domain/BaseVersionEntity.java
@@ -0,0 +1,26 @@
+package com.ruoyi.mp.domain;
+
+import com.baomidou.mybatisplus.annotation.Version;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 带乐观锁版本的BaseEntity
+ *
+ * @author yexuejc
+ * @class-name BaseVersionEntity
+ * @description
+ * @date 2024/1/19 14:11
+ */
+public class BaseVersionEntity extends BaseEntity {
+ @Version
+ private long version;
+
+ public long getVersion() {
+ return version;
+ }
+
+ public BaseVersionEntity setVersion(long version) {
+ this.version = version;
+ return this;
+ }
+}
diff --git a/mybatis-plus-test/src/main/java/com/ruoyi/mp/domain/UserOrder.java b/mybatis-plus-test/src/main/java/com/ruoyi/mp/domain/UserOrder.java
new file mode 100644
index 0000000..618b2d9
--- /dev/null
+++ b/mybatis-plus-test/src/main/java/com/ruoyi/mp/domain/UserOrder.java
@@ -0,0 +1,124 @@
+package com.ruoyi.mp.domain;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ruoyi.mp.constant.OrderStatus;
+
+import java.util.Date;
+
+/**
+ * @author yexuejc
+ * @class-name UserOrder
+ * @description
+ * @date 2024/1/19 14:10
+ */
+public class UserOrder extends BaseVersionEntity {
+ private static final long serialVersionUID = 1L;
+ @TableId(value = "order_id", type = IdType.AUTO)
+ private Long orderId;
+ private Long uid;
+ private Long gid;
+
+ @TableField("order_time")
+ private Date orderTime;
+ private Long amount;
+ @TableField("pay_type")
+ private String payType;
+ @TableField("goods_name")
+ private String goodsName;
+
+ private OrderStatus status;
+
+ public OrderStatus getStatus() {
+ return status;
+ }
+
+ public UserOrder setStatus(OrderStatus status) {
+ this.status = status;
+ return this;
+ }
+
+ public Long getOrderId() {
+ return orderId;
+ }
+
+ public UserOrder setOrderId(Long orderId) {
+ this.orderId = orderId;
+ return this;
+ }
+
+ public Long getUid() {
+ return uid;
+ }
+
+ public UserOrder setUid(Long uid) {
+ this.uid = uid;
+ return this;
+ }
+
+ public Long getGid() {
+ return gid;
+ }
+
+ public UserOrder setGid(Long gid) {
+ this.gid = gid;
+ return this;
+ }
+
+ public Date getOrderTime() {
+ return orderTime;
+ }
+
+ public UserOrder setOrderTime(Date orderTime) {
+ this.orderTime = orderTime;
+ return this;
+ }
+
+ public Long getAmount() {
+ return amount;
+ }
+
+ public UserOrder setAmount(Long amount) {
+ this.amount = amount;
+ return this;
+ }
+
+ public String getPayType() {
+ return payType;
+ }
+
+ public UserOrder setPayType(String payType) {
+ this.payType = payType;
+ return this;
+ }
+
+ public String getGoodsName() {
+ return goodsName;
+ }
+
+ public UserOrder setGoodsName(String goodsName) {
+ this.goodsName = goodsName;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return "UserOrder{" +
+ "orderId=" + orderId +
+ ", uid=" + uid +
+ ", gid=" + gid +
+ ", orderTime=" + orderTime +
+ ", amount=" + amount +
+ ", payType='" + payType + '\'' +
+ ", goodsName='" + goodsName + '\'' +
+ ", status=" + status +
+ ", version=" + getVersion() +
+ ", create_by=" + getCreateBy() +
+ ", create_time=" + getCreateTime() +
+ ", update_by=" + getUpdateBy() +
+ ", update_time=" + getUpdateTime() +
+ "} " ;
+ }
+}
diff --git a/mybatis-plus-test/src/main/java/com/ruoyi/mp/mapper/UserOrderMapper.java b/mybatis-plus-test/src/main/java/com/ruoyi/mp/mapper/UserOrderMapper.java
new file mode 100644
index 0000000..67e39ef
--- /dev/null
+++ b/mybatis-plus-test/src/main/java/com/ruoyi/mp/mapper/UserOrderMapper.java
@@ -0,0 +1,13 @@
+package com.ruoyi.mp.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.mp.domain.UserOrder;
+
+/**
+ * @author yexuejc
+ * @class-name UserOrderMapper
+ * @description
+ * @date 2024/1/19 14:15
+ */
+public interface UserOrderMapper extends BaseMapper {
+}
diff --git a/mybatis-plus-test/src/main/java/com/ruoyi/mp/service/UserOrderService.java b/mybatis-plus-test/src/main/java/com/ruoyi/mp/service/UserOrderService.java
new file mode 100644
index 0000000..7603e24
--- /dev/null
+++ b/mybatis-plus-test/src/main/java/com/ruoyi/mp/service/UserOrderService.java
@@ -0,0 +1,53 @@
+package com.ruoyi.mp.service;
+
+import com.ruoyi.mp.constant.OrderStatus;
+import com.ruoyi.mp.domain.UserOrder;
+import com.ruoyi.mp.mapper.UserOrderMapper;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+/**
+ * @author yexuejc
+ * @class-name UserOrderService
+ * @description
+ * @date 2024/1/19 14:15
+ */
+@Service
+public class UserOrderService {
+
+ @Resource
+ UserOrderMapper userOrderMapper;
+
+ public void add() {
+ UserOrder entity = new UserOrder();
+ entity.setUid(123L);
+ entity.setGid(4885L);
+ entity.setStatus(OrderStatus.NORMAL);
+ entity.setOrderTime(new Date());
+ entity.setAmount(15200L);
+ entity.setPayType("W");
+ entity.setGoodsName("测试商品");
+ int row = userOrderMapper.insert(entity);
+ if (row > 0) {
+ System.out.println("添加成功");
+ System.out.println(entity);
+ } else {
+ System.out.println("添加失败");
+ }
+ }
+
+ public UserOrder get(long orderId) {
+ return userOrderMapper.selectById(orderId);
+ }
+
+ public void update(UserOrder order) {
+ int row = userOrderMapper.updateById(order);
+ if (row > 0) {
+ System.out.println("更新成功");
+ } else {
+ System.out.println("更新失败");
+ }
+ }
+}
diff --git a/mybatis-plus-test/src/main/resources/init.sql b/mybatis-plus-test/src/main/resources/init.sql
new file mode 100644
index 0000000..6499e99
--- /dev/null
+++ b/mybatis-plus-test/src/main/resources/init.sql
@@ -0,0 +1,18 @@
+CREATE TABLE `user_order`
+(
+ `order_id` int NOT NULL AUTO_INCREMENT,
+ `uid` int DEFAULT NULL,
+ `gid` int DEFAULT NULL,
+ `order_time` datetime DEFAULT NULL,
+ `amount` int DEFAULT NULL,
+ `status` int DEFAULT NULL,
+ `pay_type` varchar(1) DEFAULT NULL,
+ `goods_name` varchar(100) DEFAULT NULL,
+ `version` bigint DEFAULT '0',
+ `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) DEFAULT NULL comment '备注',
+ PRIMARY KEY (`order_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
\ No newline at end of file
diff --git a/mybatis-plus-test/src/test/java/com/ruoyi/mp/Config.java b/mybatis-plus-test/src/test/java/com/ruoyi/mp/Config.java
new file mode 100644
index 0000000..250d595
--- /dev/null
+++ b/mybatis-plus-test/src/test/java/com/ruoyi/mp/Config.java
@@ -0,0 +1,24 @@
+package com.ruoyi.mp;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+/**
+ * 按照实际情况设定自动获取操作者
+ * @author yexuejc
+ * @class-name Config
+ * @description
+ * @date 2024/1/19 15:46
+ */
+@Component
+public class Config {
+
+ @Bean
+ @ConditionalOnMissingBean
+ public MetaObjectHandler metaObjectHandler() {
+ return new TestMetaObjectHandler();
+ }
+
+}
diff --git a/mybatis-plus-test/src/test/java/com/ruoyi/mp/TestMetaObjectHandler.java b/mybatis-plus-test/src/test/java/com/ruoyi/mp/TestMetaObjectHandler.java
new file mode 100644
index 0000000..34e7748
--- /dev/null
+++ b/mybatis-plus-test/src/test/java/com/ruoyi/mp/TestMetaObjectHandler.java
@@ -0,0 +1,14 @@
+package com.ruoyi.mp;
+
+import com.ruoyi.web.core.config.MplusMetaObjectHandler;
+
+/**
+ * @author: yexuejc
+ * @date: 2020-10-13 15:25:28
+ */
+public class TestMetaObjectHandler extends MplusMetaObjectHandler {
+ @Override
+ protected String getOperator() {
+ return "test";
+ }
+}
diff --git a/mybatis-plus-test/src/test/java/com/ruoyi/mp/service/UserOrderServiceTest.java b/mybatis-plus-test/src/test/java/com/ruoyi/mp/service/UserOrderServiceTest.java
new file mode 100644
index 0000000..8500cfe
--- /dev/null
+++ b/mybatis-plus-test/src/test/java/com/ruoyi/mp/service/UserOrderServiceTest.java
@@ -0,0 +1,61 @@
+package com.ruoyi.mp.service;
+
+import com.ruoyi.RuoYiApplication;
+import com.ruoyi.mp.constant.OrderStatus;
+import com.ruoyi.mp.domain.UserOrder;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import javax.annotation.Resource;
+
+/**
+ * mybatis-plus
+ * 乐观锁
+ * 自动注入创建时间,操作者
+ * 主键数据库自增
+ */
+@SpringBootTest(classes = RuoYiApplication.class)
+class UserOrderServiceTest {
+
+ @Resource
+ UserOrderService userOrderService;
+
+ /***
+ * 创建表数据
+ */
+ @Test
+ void add() {
+ userOrderService.add();
+ //15:49:29.640 [main] DEBUG c.r.m.m.U.insert - [debug,135] - ==> Preparing: INSERT INTO user_order ( uid, gid, order_time, amount, pay_type, goods_name, status, version, create_by, create_time, update_by, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
+ //15:49:29.789 [main] DEBUG c.r.m.m.U.insert - [debug,135] - ==> Parameters: 123(Long), 4885(Long), 2024-01-19 15:49:29.628(Timestamp), 15200(Long), W(String), 测试商品(String), 0(Integer), 0(Long), test(String), 2024-01-19 15:49:29.638(Timestamp), test(String), 2024-01-19 15:49:29.639(Timestamp)
+ //15:49:29.932 [main] DEBUG c.r.m.m.U.insert - [debug,135] - <== Updates: 1
+ //添加成功
+ //UserOrder{orderId=4, uid=123, gid=4885, orderTime=Fri Jan 19 15:49:29 CST 2024, amount=15200, payType='W', goodsName='测试商品', status=NORMAL, version=0, create_by=test, create_time=Fri Jan 19 15:49:29 CST 2024, update_by=test, update_time=Fri Jan 19 15:49:29 CST 2024}
+ }
+
+ /**
+ * 更新操作
+ */
+ @Test
+ void update() {
+ UserOrder userOrder = userOrderService.get(4);
+ System.out.println("更新前:" + userOrder);
+ userOrder.setStatus(OrderStatus.PAYED);
+ userOrderService.update(userOrder);
+ userOrder = userOrderService.get(4);
+ System.out.println("更新后:" + userOrder);
+ //15:50:42.433 [main] DEBUG c.r.m.m.U.selectById - [debug,135] - ==> Preparing: SELECT order_id,uid,gid,order_time,amount,pay_type,goods_name,status,version,create_by,create_time,update_by,update_time FROM user_order WHERE order_id=?
+ //15:50:42.436 [main] DEBUG c.r.m.m.U.selectById - [debug,135] - ==> Parameters: 4(Long)
+ //15:50:42.449 [main] DEBUG c.r.m.m.U.selectById - [debug,135] - <== Total: 1
+ //更新前:UserOrder{orderId=4, uid=123, gid=4885, orderTime=Fri Jan 19 15:49:30 CST 2024, amount=15200, payType='W', goodsName='测试商品', status=NORMAL, version=0, create_by=test, create_time=Fri Jan 19 15:49:30 CST 2024, update_by=test, update_time=Fri Jan 19 15:49:30 CST 2024}
+ //15:50:42.463 [main] DEBUG c.r.m.m.U.updateById - [debug,135] - ==> Preparing: UPDATE user_order SET uid=?, gid=?, order_time=?, amount=?, pay_type=?, goods_name=?, status=?, version=?, create_by=?, create_time=?, update_by=?, update_time=? WHERE order_id=? AND version=?
+ //15:50:42.473 [main] DEBUG c.r.m.m.U.updateById - [debug,135] - ==> Parameters: 123(Long), 4885(Long), 2024-01-19 15:49:30.0(Timestamp), 15200(Long), W(String), 测试商品(String), 1(Integer), 1(Long), test(String), 2024-01-19 15:49:30.0(Timestamp), test(String), 2024-01-19 15:49:30.0(Timestamp), 4(Long), 0(Long)
+ //15:50:42.675 [main] DEBUG c.r.m.m.U.updateById - [debug,135] - <== Updates: 1
+ //更新成功
+ //15:50:42.676 [main] DEBUG c.r.m.m.U.selectById - [debug,135] - ==> Preparing: SELECT order_id,uid,gid,order_time,amount,pay_type,goods_name,status,version,create_by,create_time,update_by,update_time FROM user_order WHERE order_id=?
+ //15:50:42.677 [main] DEBUG c.r.m.m.U.selectById - [debug,135] - ==> Parameters: 4(Long)
+ //15:50:42.682 [main] DEBUG c.r.m.m.U.selectById - [debug,135] - <== Total: 1
+ //更新后:UserOrder{orderId=4, uid=123, gid=4885, orderTime=Fri Jan 19 15:49:30 CST 2024, amount=15200, payType='W', goodsName='测试商品', status=PAYED, version=1, create_by=test, create_time=Fri Jan 19 15:49:30 CST 2024, update_by=test, update_time=Fri Jan 19 15:49:30 CST 2024}
+
+ }
+}
\ No newline at end of file