目录
在继承自BaseMapper的泛型实体类上使用@TableName注解指定数据表的名称
在类中与主键对应的属性上使用@TableId注解指定主键的值如何处理
另外,原本应该做的配置不变,例如在配置类中使用@MapperScan指定Mapper接口所在的包。
MyBatis Plus介绍
MyBatis Plus是一个基于MyBatis的增强工具,它简化了MyBatis的开发流程,提供了更便捷、高效的数据库访问解决方案。MyBatis Plus在保留了MyBatis核心特性的基础上,提供了许多额外的功能和扩展,使得开发者可以更快速地编写数据库操作代码。
以下是MyBatis Plus的一些主要特性:
简化的CRUD操作:MyBatis Plus提供了丰富的CRUD操作方法,可以通过简单的接口方法完成常见的增删改查操作,无需编写SQL语句。
条件构造器:MyBatis Plus提供了强大的条件构造器,可以灵活地构建查询条件,支持链式调用,可读性强。
分页查询:MyBatis Plus内置了分页查询的支持,可以方便地进行分页查询操作。
代码生成器:MyBatis Plus提供了代码生成器工具,可以根据数据库表结构自动生成实体类、Mapper接口和XML映射文件,减少重复的编写工作。
乐观锁支持:MyBatis Plus支持乐观锁的使用,可以通过版本号等方式实现并发控制。
自动填充字段:MyBatis Plus支持自动填充字段,可以在插入和更新操作时自动填充某些字段的值,如创建时间、更新时间等。
多租户支持:MyBatis Plus提供了多租户的支持,可以在同一个数据库中实现租户数据的隔离和管理。
总体来说,MyBatis Plus简化了数据库操作的编写和维护工作,提高了开发效率,减少了重复性的代码编写。它与MyBatis完美集成,可以充分发挥MyBatis的灵活性和性能优势,是Java开发中常用的持久层框架之一。
CRUD操作使用
添加依赖:
<mybatis-plus-spring-boot.version>3.3.0</mybatis-plus-spring-boot.version>
<!-- Mybatis Plus整合Spring Boot的依赖项 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus-spring-boot.version}</version>
</dependency>
接口应该继承自BaseMapper
使用普通的MyBatis相同,需要自定义数据访问接口,不同的是,此接口应该继承自BaseMapper
,且继承的泛型应该是尝试处理的数据表所对应的实体类的类型,例如:
同时继承之后继承的已有方法都不需要我们在写mapper接口写抽象方法了,对应的mapper的xml文件的sql语句也不需要在写了,但自己想写一些它没有的或者你不想用它的也是可以写的。但一般增删改以及selectCount用的比较多,其他查询还是自己写好做优化。
在继承自BaseMapper的泛型
实体类上使用@TableName
注解指定数据表的名称
-
例如配置为
@TableName("pms_album")
-
如果没有通过以上注解指定名称,则MyBatis Plus会自动根据你的实现类的名称转换得到表名称,例如
Album
类对应的默认的表名称就是album
在类中与主键对应的属性上使用@TableId
注解指定主键的值如何处理
-
例如配置为
@TableId(type = IdType.AUTO)
-
如果没有通过以上注解进行配置,则MyBatis Plus默认会自动处理主键字段对应的值
另外,原本应该做的配置不变,例如在配置类中使用@MapperScan
指定Mapper接口所在的包。
使用selectCount
因为使用mybatis plus的 selectCount查询需要填入的是wapper<T>类型。
需要用到它的子集QueryWrapper,作用是设计sql语句WHERE的规则,如果要设计名称等于多少,就用eq,equals的意思,双引号“username”是需要的数据库里面的字段,匹配参数里面的adminAddNewParam.getUsername()。 等同于sql语句WHERE username=#{username}
用int countByUsername就能得到结果。
public void addNew(AdminAddNewParam adminAddNewParam) {
log.debug("开始处理【添加管理员】的业务,参数:{}", adminAddNewParam);
// 检查管理员用户名是否被占用,如果被占用,则抛出异常
QueryWrapper<Admin> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username", adminAddNewParam.getUsername());
int countByUsername = adminMapper.selectCount(queryWrapper);
log.debug("根据管理员用户名统计匹配的管理员数量,结果:{}", countByUsername);
if (countByUsername > 0) {
String message = "添加管理员失败,用户名已经被占用!";
log.warn(message);
throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
}
}