主页 > 游戏开发  > 

MyBatis-Plus为简化开发而生【核心功能】

MyBatis-Plus为简化开发而生【核心功能】

文章目录 一、前言二、快速入门1. 入门案例2. 常见注解3. 常见配置 三、核心功能1. 条件构造器2. 自定义 SQL3. Service 接口3.1 基本使用3.2 复杂条件

一、前言

顾名思义,MyBatis-Plus 其实是 MyBatis 的一个加强版,它可以帮助我们快速高效地编写数据库代码。

优点 | Advantages

① 无侵入:Mybatis-Plus 在 Mybatis 的基础上进行扩展,只做增强不做改变,引入 Mybatis-Plus 不会对您现有的 Mybatis 构架产生任何影响,而且 MP 支持所有 Mybatis 原生的特性; ② 依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring; ③ 损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作; ④ 通用CRUD操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求; ⑤ 多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题; ⑥ 支持自定义全局通用操作:支持全局通用方法注入; ⑦ 支持代码生成:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用; ⑧ 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,预防误操作; ⑨ 内置分页插件:基于Mybatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于写基本List查询; ⑩ 内置性能分析插件:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询。

总结: ① 润物无声,只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑; ② 效率至上,只需简单配置,即可快速进行单表 CRUD 操作,从而节省大量时间; ③ 丰富功能,代码生成、自动分页、逻辑删除、自动填充等功能一应俱全。

二、快速入门 1. 入门案例

如图这是一个基础的 mybatis 项目,它需要编写大量的单表 CRUD 语句,接下来我们将用 MyBatis-Plus 来对代码进行改造。

① 引入依赖

MyBatis-Plus 官方提供了 starter 依赖,其中集成了 MyBatis 和 MyBatis-Plus 的所有功能,并且实现了自动装配效果。 因此我们写了 MyBatis-Plus 的依赖之后,就可以把 MyBatis 的依赖删掉了。

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

② 继承 BaseMapper 接口

让自定义的 Mapper 继承 MyBatis-Plus 提供的 BaseMapper 接口,所有的增删改查方法都已经在 BaseMapper 里定义好了。

尖括号里指明泛型为要操作的实体类的类型!

③ 直接使用

Mapper 里不需要再自己写方法,xml 里也不需要自己写 CRUD 语句,外部直接调用 BaseMapper 的增删改查方法即可。

④ 运行成功

BaseMapper 中的方法:查询 select 开头,新增 insert 开头,删除 delete 开头,修改 update 开头!

2. 常见注解

MyBatis-Plus 是如何找到对应的数据表的?

MyBatis-Plus 通过扫描实体类,并基于反射来获取实体类信息作为数据库表信息。

注意: ① MyBatis-Plus 根据泛型类型找到对应的实体类; ② 类名驼峰转下划线,作为数据库的表名; ③ 名为 id 的字段作为数据表的主键; ④ 变量名驼峰转下划线,作为数据表的字段名。

如果说,实体类信息与数据库信息不符,则需要自定义配置:

@TableName:用来指定表名; @TableId:用来指定主键; @TableField:用来指定普通字段。

主键字段可以通过 IdType 来定义类型:AUTO 自增、INPUT 自行输入、ASSIGN_ID 雪花算法。如果不指定类型,默认采用雪花算法生成 ID!

什么时候需要加注解: ① 成员变量名与数据库字段名不一致; ② 成员变量名以 is 开头且属于布尔类型; ③ 成员变量名与数据库关键字发生冲突(加转义字符); ④ 成员变量不是数据库字段(exist 为 false)

MyBatis-Plus 通过反射机制获取字段名的时候,会自动把 is 去掉,然后把剩余部分作为变量名,这就跟数据库不一致了。所以 is 开头且属于布尔类型的,必须加注解!

3. 常见配置

MyBatis-Plus 只适用于单表的增删改查,如果需要进行复杂的多表操作,还是要手写 SQL 语句的。

MyBatis-Plus 的配置项继承了 MyBatis 的原生配置,并增加了自己的特有配置。

除了 type-aliases-package,其实很多配置都是有默认值的,所以大多数都不用自己配!

三、核心功能

MyBatis-Plus 支持各种复杂的 where 条件,可以满足日常开发的所有需求。

1. 条件构造器

如图,Wrapper 即为条件构造器。

eq 等于,ge 大于等于,gt 大于,le 小于等于,lt 小于!

需求: ① 查询出名字中带 o 的,存款大于等于 1000 元的人的 id、username、info 和 balance 字段。

#SQL写法 select id, username, info, balance from user where username like '%o%' and balance >= 1000 #MyBatis-Plus写法 @Test void testQueryWrapper() { //1.构建查询条件 QueryWrapper<User> wrapper = new QueryWrapper<User>() .select("id", "username", "info", "balance") .like("username", "o") .ge("balance", 1000); //2.查询 List<User> users = userMapper.selectList(wrapper); users.forEach(System.out::println); }

② 更新用户名为 jack 的用户的余额为 2000 元。

#SQL写法 update user set balance = 2000 where username = 'jack' #MyBatis-Plus写法 @Test void testUpdateWapper() { UpdateWrapper<User> wrapper = new UpdateWrapper<User>() .setSql("balance = 2000") .eq("username", "jack"); userMapper.update(null, wrapper); }

以上代码通过 QueryWrapper 和 UpdateWrapper 实现了复杂的查询和更新功能,但它的数据库字段名是被硬编码到代码中的,耦合度太高不易修改,所以我们推荐采用 Lambda 的方式构造条件,用字段对应的 get 函数代替字段名。

2. 自定义 SQL

问题描述: 用 MyBatis-Plus 构建 SQL 语句确实方便了很多,但是 MyBatis-Plus 更擅长的是 SQL 条件的构建,当我们遇到复杂的业务操作时,SQL 语句的前半部分只能采用硬编码的方式拼接在业务代码中,这样显然不符合常规的开发规范。

简单条件操作,直接传参即可;复杂条件操作,需要使用条件构造器;特别复杂的操作,为防止硬编码行为,只能自定义 SQL!

解决办法:SQL 语句的 where 部分交给 MyBatis-Plus 去做,而它的前半部分由我们自己定义。

核心思路: 将 MyBatis-Plus 构建好的条件往下传递,传给 Mapper 层,在 Mapper 层或者 xml 文件中,完成 SQL 语句的组装。

需求: 将 id 在指定范围的用户(例如 1、2、4)的余额扣减指定值。

① 基于 Wrapper 构建 where 条件

@Test void testUpdateWapper() { List<Long> ids = List.of(1L, 2L, 4L); int amount = 200; LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<User>() .in(User::getId, ids); userMapper.updateBalanceByIds(wrapper, amount); }

② 在 mapper 方法参数中用 Param 注解声明 wrapper 变量名称

变量名称必须是 ew!

public interface UserMapper extends BaseMapper<User> { void updateBalanceByIds(@Param("ew") LambdaUpdateWrapper<User> wrapper, @Param("amount") int amount); }

一般用常量 Constants.WRAPPER 代替 ex 会显得更加规范,要注意 Constants 的包路径不要导错!

③ 自定义 SQL,并使用 Wrapper 条件

${ew.customSqlSegment} 代表拼接自定义片段!

<mapper namespace="com.zxe.mp.mapper.UserMapper"> <update id="updateBalanceByIds"> update user set balance = balance - #{amount} ${ew.customSqlSegment} </update> </mapper> 3. Service 接口 3.1 基本使用

相比 BaseMapper,Service 接口提供的功能更多更全。

Service 的内部实际上调用了 BaseMapper 接口,所有的方法都已经被实现好,我们只需要继承接口就行!

① 让我们的 UserService 接口继承 IService 接口

② 我们的实现类也继承 ServiceImpl 实现类

ServiceImpl<UserMapper, User> 的两个参数分别为要用到的 Mapper 和实体类!

③ 编写测试类,直接调用 Service 中的方法即可

Service 中的方法:查询单个 get 开头,查询多个 list 开头,复杂条件查询用 lambdaQuery,查询数量 count 开头,分页查询 page 开头,新增 save 开头,删除 remove 开头,修改 update 开头!

3.2 复杂条件

Service 的复杂条件用 lambdaQuery 和 lambdaQuery 实现。

复杂条件一般定义在业务层,Controller 层只负责向下传数据!

① 复杂查询

//复杂查询,统计数量用count,查询多个用list List<User> users = this.lambdaQuery() .like(name != null, User::getName, name) .eq(status != null, User::getStatus, status) .ge(minBalance != null, User::getBalance, minBalance) .le(maxBalance != null, User::getBalance, maxBalance) .list();

以上代码与下图功能一致:

② 复杂更新

//复杂更新,用update this.lambdaUpdate() .set(User::getBalance, remainBalance) //第一个参数是条件,后面的是操作 .set(remainBalance == 0, User::getStatus, 2) .eq(User::getId, id) .update();
标签:

MyBatis-Plus为简化开发而生【核心功能】由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“MyBatis-Plus为简化开发而生【核心功能】