当前位置: 首页 > news >正文

d41:MyBatisPlus入门,注解,配置,条件构造器,自定义SQL,IService

MyBatisPlus入门与实践指南

导航

  • 学习内容:MyBatisPlus入门,注解,配置,条件构造器,自定义SQL,IService

1. MyBatisPlus入门

MyBatisPlus(MP)是MyBatis的增强工具,提供了更便捷的CRUD操作。以下是入门步骤:

引入依赖

首先,在项目中引入MyBatisPlus的依赖:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version>
</dependency>

如果项目中已经使用了MyBatis,可以移除原有的MyBatis依赖。

继承MP的Mapper接口

创建一个Mapper接口,继承BaseMapper

public interface UserMapper extends BaseMapper<User> {
}

这样就可以直接使用MP提供的CRUD方法,无需手动编写SQL语句。

示例代码
@Test
void testSelectById() {User user = userMapper.queryUserById(5L);System.out.println("user = " + user);
}

注意:如果定义了与BaseMapper方法同名的方法,BaseMapper的方法将被优先使用。


2. 常用注解和配置

MyBatisPlus通过实体类的反射来映射数据库表信息,支持多种注解和配置。

实体类注解
  • 指定表名
    @TableName("tb_user")
    public class User {
    }
    
  • 指定主键及其策略
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    
    • IdType.AUTO:自增ID
    • IdType.INPUT:手动输入
    • IdType.ASSIGN_ID:雪花算法(随机),也是默认策略
  • 指定字段名
    @TableField("username")
    private String username;
    
    • 布尔值字段,is前缀会被自动去除:
      @TableField("is_right")
      private Boolean isRight;
      
    • 避免与数据库的关键字段冲突:
      @TableField("`other`")
      private Integer other;
      
全局配置

MyBatisPlus支持MyBatis的原生配置,并提供了全局策略配置:

mybatis-plus:mapper-locations: classpath*:mapper/**/*.xmltype-aliases-package: com.itheima.mp.domain.poconfiguration:map-underscore-to-camel-case: true # 开启驼峰命名cache-enabled: false # 禁用二级缓存global-config:db-config:id-type: auto # 全局主键策略update-strategy: not_null # 默认更新策略

3. 条件构造器和自定义SQL

MyBatisPlus提供了强大的条件构造器,用于动态构造SQL语句。

QueryWrapper
@Test
void testQueryWrapper() {QueryWrapper<User> queryWrapper = new QueryWrapper<User>().select("id", "username", "phone", "info", "balance").like("username", "o").ge("balance", 1000);List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}
LambdaWrapper

通过反射获取字段名称,更加类型安全:

@Test
void testLambdaWrapper() {LambdaQueryWrapper<User> queryWrapper = new QueryWrapper<User>().lambda().select(User::getId, User::getUsername, User::getPhone, User::getInfo, User::getBalance).like(User::getUsername, "o").ge(User::getBalance, 1000);List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}
自定义SQL

可以直接编写SQL语句:

@Test
void testUpdateWrapper() {List<Long> ids = List.of(1L, 2L, 4L);UpdateWrapper<User> updateWrapper = new UpdateWrapper<User>().setSql("balance = balance - 100").in("id", ids);userMapper.update(null, updateWrapper);
}
条件比较函数
  • gt:大于(>
  • ge:大于等于(>=
  • lt:小于(<
  • le:小于等于(<=
  • eq:等于(=
  • ne:不等于(!=<>
条件构造器与Mapper混合使用
@Test
void testCustomSql() {List<Long> ids = List.of(1L, 2L, 4L);int amount = 200;LambdaQueryWrapper<User> queryWrapper = new QueryWrapper<User>().lambda().in(User::getId, ids);userMapper.updateBalance(queryWrapper, amount);
}

注意:构造器固定以"ew"为参数值:

void updateBalance(@Param("ew") LambdaQueryWrapper<User> queryWrapper, int amount);

在Mapper XML中:

<update id="updateBalance">update user set balance = balance + #{amount}${ew.customSqlSegment}
</update>

4. IService

通过IService进一步简化操作。

继承IService

在接口中继承IService

public interface IUserService extends IService<User> {
}
实现类

实现类继承ServiceImpl

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
}
使用IService方法

可以直接使用IService的内置方法:

@ApiOperation("新增用户")
@PostMapping
public void saveUser(@RequestBody UserFormDTO userFormDTO) {User user = BeanUtil.copyProperties(userFormDTO, User.class);userService.save(user);
}
业务处理

ServiceImpl中,可以直接使用IServiceMapper层的方法:

public void deductBalance(Long id, Integer money) {User user = this.getById(id);baseMapper.deductBalance(id, money);
}

也可以使用Lambda构造业务逻辑:

@Override
@Transactional
public void deductBalance(Long id, Integer money) {User user = this.getById(id);if (user == null || user.getStatus() == 2) {throw new RuntimeException("用户不存在或已冻结");}if (user.getBalance() < money) {throw new RuntimeException("余额不足");}int balance = user.getBalance() - money;lambdaUpdate().set(User::getBalance, balance).set(balance < 0, User::getStatus, 2).eq(User::getId, id).eq(User::getBalance, user.getBalance()) // 乐观锁.update();
}
Lambda查询
@Override
public List<User> queryUsers(UserQuery userQuery) {String name = userQuery.getName();Integer status = userQuery.getStatus();Integer minBalance = userQuery.getMinBalance();Integer maxBalance = userQuery.getMaxBalance();return lambdaQuery().like(name != null, User::getUsername, name).eq(status != null, User::getStatus, status).ge(minBalance != null, User::getBalance, minBalance).le(maxBalance != null, User::getBalance, maxBalance).list();
}

5. 批量操作

批量新增

采取分组发送的方式,避免通信传输和内存占用过大:

@Test
void testSaveBatch() {List<User> list = new ArrayList<>(1000);long b = System.currentTimeMillis();for (int i = 1; i < 100000; i++) {list.add(buildUser(i));if (i % 1000 == 0) {userService.saveBatch(list);list.clear();}}long e = System.currentTimeMillis();System.out.println("耗时:" + (e - b));
}

注意:尽管开启了批量保存,但MySQL默认会逐条插入。需要额外开启rewriteBatchedStatements=true


6. 小技巧

Lombok注解

使用Lombok的@RequiredArgsConstructor注解可以自动生成构造器,简化依赖注入:

@RequiredArgsConstructor
public class UserController {private final IUserService userService;
}
http://www.dtcms.com/a/478957.html

相关文章:

  • 沈阳网官方网站重庆男科医院哪家好
  • 无广技术贴!【PDF编辑器】Solid Converter PDF保姆级图文下载安装指南——实用推荐之PDF编辑软件
  • Fail2ban安装及配置教程:防止ECS暴力破解
  • 自做的网站如何发布松江建设新城有限公司网站
  • 住建城乡建设部网站网站建设空间主机的选择
  • 阿里美团京东从“三国杀”到“双雄会”:本地生活无限战争的终局猜想
  • wpf之Interaction.Triggers
  • 网站建设新的技术方案企业网站建设东莞
  • SSM管理系统c4ki9(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 珠海正规网站制作排名费用多少无锡阿凡达建设
  • asp网站建设 aws西安高校定制网站建设公司推荐
  • PyTorch 实现 MNIST 手写数字识别完整流程(含数据处理、模型构建与训练可视化)
  • 【Java并发编程】概念与核心问题、线程核心、并发控制、线程池、并发容器、并发问题
  • C++模板编程实战记录:SFINAE核心技术深度掌握
  • Spring Boot项目的常用依赖有哪些?
  • 保姆级教程 | ASE学习过程记录分析
  • 网站如何留言免费网站seo排名优化
  • 运维视角:SpringBootWeb框架全解析
  • Java Redis “运维”面试清单(含超通俗生活案例与深度理解)
  • 【组队学习】Post-training-of-LLMs TASK01
  • 涉县网站网络推广培训哪里好
  • Jenkins自动化配置--CICD流水线
  • 网站建设etw深圳租赁住房和建设局网站
  • 人力网站建设的建议wordpress加百度广告代码出问题
  • Mozilla 项目
  • 今日行情明日机会——20251013
  • 关于解决js中MediaRecorder录制的webm视频没有进度条的问题
  • 红日靶场(二)学习过程详细记录
  • 【多线程】门栓/闭锁(Latch/CountDownLatch)
  • [1-02-02].[第01章:HTML + CSS