MybatisPlus 进阶用法 --- IService Service层简化代码

一、前言

 熟悉 mybatis-plus 的人都知道,mybatis-plus 提供两种包含预定义增删改查操作的接口:

1.com.baomidou.mybatisplus.core.mapper.BaseMapper
2.com.baomidou.mybatisplus.extension.service.IService

   IService<M,T> 针对业务逻辑层的封装 需要指定Dao层类和对应的实体类 是在BaseMapper基础上的加强 ~

二、IService 使用

   步骤一 : 在Service 继承 isService 接口

/**
 * @author WangYan
 * @date 2021/10/13 13:53
 */
public interface OfferService extends IService<Offer> {
}

     步骤二: 在ServiceImpl 中实现

/**
 * @author WangYan
 * @date 2021/10/13 13:53
 */
@Service
public class OfferServiceImpl extends ServiceImpl<OfferMapper, Offer> implements OfferService{
}

  步骤三 :在测试类中,调用几个方法测试下:

  注意:在BaseMapper 当中是没有批量添加的方法

             在 isService接口中是有批量添加方法。

    @Autowired
    private OfferService offerService;
    
    @Test
    public void update(){
        Offer offer = new Offer();
        offer.setId(13);
        offer.setCompany("腾讯云科技");
        offerMapper.updateById(offer);
    }

package cn.gson.financial.kernel.model.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * <p>****************************************************************************</p> * <p><b>Copyright © 2010-2019 soho team All Rights Reserved<b></p> * <ul style="margin:15px;"> * <li>Description : cn.gson.financial.kernel.model.entity</li> * <li>Version : 1.0</li> * <li>Creation : 2019年10月21日</li> * <li>@author : ____′↘夏悸</li> * </ul> * <p>****************************************************************************</p> */ @Data @TableName(value = "fxy_financial_voucher") public class Voucher implements Serializable { @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 凭证字 */ @TableField(value = "word") private String word; @TableField(value = "code") private Integer code; /** * 备注 */ @TableField(value = "remark") private String remark; /** * 附单据数量 */ @TableField(value = "receipt_num") private Integer receiptNum; /** * 制单人 */ @TableField(value = "create_member") private Integer createMember; @TableField(value = "create_date") private Date createDate; /** * 借方总金额 */ @TableField(value = "debit_amount") private Double debitAmount; /** * 贷方总金额 */ @TableField(value = "credit_amount") private Double creditAmount; @TableField(value = "account_sets_id") private Integer accountSetsId; @TableField(value = "voucher_year") private Integer voucherYear; @TableField(value = "voucher_month") private Integer voucherMonth; @TableField(value = "voucher_date") private
04-17
<think>好的,我现在需要帮助用户理解MyBatis-Plus中Voucher类的代码结构和相关注解。首先,用户可能已经有一定的MyBatis-Plus基础,但需要具体的示例来解释Voucher类的结构。根据引用内容,特别是引用[3]和[4],用户可能涉及分表、服务接口以及常见的操作问题。 首先,我应该先构建一个典型的Voucher类,包含常见的MyBatis-Plus注解,比如@TableName、@TableId、@TableField等,这些是核心的注解,用于映射数据库表和字段。同时,用户提到想了解代码结构,所以需要展示类的属性、构造方法、getter/setter,可能还有toString方法。 接下来,注解说明部分需要逐一解释每个注解的作用。例如,@TableName用于指定表名,特别是在分表的情况下可能需要动态表名,这里可能需要引用[4]中提到的分表问题,说明如何处理。@TableId用于主键,特别是分表时的复合主键问题,引用[4]提到复合主键需要赋值,所以需要注意。 然后,考虑到用户可能涉及业务逻辑,比如优惠券的状态和类型,这些字段可能需要枚举类,比如VoucherStatus和VoucherType,这样代码更清晰。同时,示例中的deductBalance方法可能和服务接口相关,引用[3]中的IUserService接口,可以类比说明VoucherService的可能结构。 用户的问题还可能涉及数据库操作,比如插入或更新时的注意事项,例如在分表情况下,MyBatis-Plus的自动填充功能(@TableField(fill = FieldFill.INSERT))如何处理创建时间和更新时间,这里需要解释FieldFill的用法。 此外,用户可能对XML映射文件中的操作有疑问,比如引用[4]提到的批量插入问题,虽然Voucher类可能不直接涉及,但可以建议在复杂SQL时使用XML文件,并注意主键赋值的问题。 最后,生成的相关问题需要覆盖用户可能的后续疑问,比如分表策略、状态枚举的使用、自动填充原理以及乐观锁的应用,这些都是常见的进阶问题,能够帮助用户深入理解MyBatis-Plus在实际项目中的应用。</think>### MyBatis-Plus Voucher类代码结构及注解说明 以下是一个典型的MyBatis-Plus实体类`Voucher`的代码示例,包含常见的注解和业务字段: ```java @TableName("t_voucher") // 指定数据库表名[^4] public class Voucher { @TableId(value = "id", type = IdType.ASSIGN_ID) // 分布式ID生成策略[^1] private Long id; @TableField("voucher_code") // 字段映射(当字段名与属性名不一致时) private String code; @TableField(fill = FieldFill.INSERT) // 自动填充策略(插入时填充) private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) // 更新时自动填充 private LocalDateTime updateTime; @Version // 乐观锁版本字段[^1] private Integer version; // 业务字段 private BigDecimal value; // 优惠券面值 private Integer status; // 状态(0未使用/1已使用) private String type; // 类型(满减券/折扣券) // Lombok注解(简化代码) @Data @NoArgsConstructor @AllArgsConstructor public static class Builder { // 建造者模式构造器 } } ``` #### 关键注解解析 1. **`@TableName`** 指定实体类对应的数据库表名,支持分表动态表名(如`t_voucher_${2023}`)[^4] 2. **`@TableId`** - `value`:指定数据库主键字段名 - `type`:主键生成策略,常用`IdType.ASSIGN_ID`(雪花算法)或`IdType.AUTO`(数据库自增) 3. **`@TableField`** - 字段映射:解决数据库字段名与属性名不一致问题 - 自动填充:通过实现`MetaObjectHandler`接口实现自动填充时间字段[^1] 4. **`@Version`** 实现乐观锁机制,更新时会自动校验版本号: ```sql UPDATE t_voucher SET ..., version=version+1 WHERE id=1 AND version=1 ``` #### 典型业务方法 在Service中可能包含的优惠券操作方法: ```java public interface VoucherService extends IService<Voucher> { // 扣减优惠券 boolean deductVoucher(Long voucherId); // 条件查询 List<Voucher> queryValidVouchers(LocalDateTime now); } ``` #### 分表操作注意 当涉及分表时,需特别注意: 1. 复合主键必须完整赋值所有主键字段[^4] 2. 动态表名可通过实现`TableNameHandler`接口处理 3. 批量操作需明确指定分表规则
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逸航不吃瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值