目录
和Mybatis的区别
特性/框架 | MyBatis | MyBatis-Plus |
---|---|---|
SQL编写方式 | 需要手写大量的SQL | 内置通用Mapper、通用Service,少量配置实现CRUD |
动态SQL支持 | 提供XML标签,支持动态SQL语句,可重用 | -(继承MyBatis特性,但更侧重于简化操作) |
ORM映射 | 提供映射标签,支持对象与数据库的ORM字段关系映射 | -(继承MyBatis特性) |
Lambda表达式支持 | 不支持 | 支持Lambda表达式,方便编写查询条件 |
主键生成策略 | 需要手动配置 | 支持主键自动生成,提供多种策略,包括分布式ID |
代码生成 | 无内置功能 | 提供代码生成器,快速生成Mapper、Model、Service、Controller代码 |
分页功能 | 需要手动实现 | 内置分页插件,配置后分页查询如同普通List查询 |
性能分析 | 无内置功能 | 内置性能分析插件,输出SQL及执行时间 |
全局拦截 | 支持自定义拦截器,但无内置智能分析 | 内置全局拦截插件,智能分析阻断全表delete、update,可自定义拦截规则 |
导包
在使用maven进行导入包,会有很多Mybatis-plus的内容,以下是常用的解释
依赖项名称 | 描述 | 用途 |
---|---|---|
mybatis-plus-boot-starter | MyBatis-Plus为Spring Boot提供的启动器依赖 | 包含MyBatis-Plus核心功能及Spring Boot集成配置,方便在Spring Boot项目中快速集成MyBatis-Plus |
mybatis-plus-annotation | MyBatis-Plus提供的注解依赖 | 包含用于简化数据库操作和提高代码可读性的注解,如@TableName 、@TableId 等 |
mybatis-plus-core | MyBatis-Plus的核心模块 | 提供MyBatis-Plus的基础功能和核心类,如条件构造器、分页插件等 |
mybatis-plus-generator | MyBatis-Plus的代码生成器依赖 | 能够自动生成与数据库表对应的Java实体类、Mapper接口、Service接口和Controller类等代码,提高开发效率 |
说明:一般情况下,导入包时,主要以mybatis-plus-boot-starter为主。同时,不要忘记导入mysql等其他数据库的jar包
pom.xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
配置文件修改
application.yml
和原有的mybatis在使用上没有区别
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost/tmp
username: root
password: root
启动类修改
需要增加@MapperScan标签对Mapper包路径进行扫描
package com.wunaiieq.tmp2024121103;
import org.apache.ibatis.annotations.Mapper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.wunaiieq.tmp2024121103.mapper")
public class Tmp2024121103Application {
public static void main(String[] args) {
SpringApplication.run(Tmp2024121103Application.class, args);
}
}
如果存在不同的mapper路径,则使用如下方式
@MapperScans({
@MapperScan("com.example.mapper1"),
@MapperScan("com.example.mapper2")
})
Mapper层修改
相较于Mybatis,在plus中,所有的mapper都需要集成BaseMapper<实体类>
package com.wunaiieq.tmp2024121103.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wunaiieq.tmp2024121103.entity.Students;
public interface StudentsMapper extends BaseMapper<Students> {
}
注解
@TableName(“表名”)
用法:写在实体类上,用于指定当前实体类为哪个表(表所属的数据库在 application.yml中配置)
示例:
package com.wunaiieq.tmp2024121103.entity;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("students")
public class Students {
private int id;
private String name;
public Students(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Students{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@TableId(“数据库中主键字段名”,“主键策略”)
描述:指定实体类的某个属性为主键
value:数据库中主键字段名
type:主键策略(如下)
IdType.AUTO:数据库ID自增。适用于自增主键,如MySQL的自增列。
IdType.NONE:无状态,该类型为未设置主键类型。需要手动赋值。
IdType.INPUT:用户输入ID。适用于手动输入主键值,在插入数据时如果不手动设置该字段的值,数据库会报错。
IdType.ASSIGN_ID:分配ID,适用于分布式系统。使用雪花算法生成唯一ID(Long类型)。
IdType.ASSIGN_UUID:分配UUID,适用于分布式系统。生成唯一ID(String类型)。
示例
package com.wunaiieq.tmp2024121103.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("students")
public class Students {
@TableId(value = "id",type = IdType.AUTO)
private int id;
private String name;
public Students(int id, String name) {
this.id = id;
this.name = name;
}
public Students(String name) {
this.name = name;
}
@Override
public String toString() {
return "Students{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@TableField(“数据库中字段名”)
描述:指定映射关系(当实体属性和数据库中字段名不同时)
示例
package com.wunaiieq.tmp2024121103.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;
@TableName("students")
public class Students {
@TableId(value = "id",type = IdType.AUTO)
private int id;
@TableField("name")
private String name;
public Students(int id, String name) {
this.id = id;
this.name = name;
}
public Students(String name) {
this.name = name;
}
@Override
public String toString() {
return "Students{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
内置方法
前置说明
T表示实体类,在以下方法中,会针对T进行相应的操作
条件构造器
条件参数
查询方式 | 说明 |
---|---|
or | 或条件语句 |
and | 且条件语句 |
like | 模糊查询(LIKE) |
notLike | 模糊查询(NOT LIKE) |
exists | EXISTS 条件语句 |
notExists | NOT EXISTS 条件语句 |
isNull | NULL 值查询 |
isNotNull | IS NOT NULL 查询 |
in | IN 查询 |
notIn | NOT IN 查询 |
groupBy | 分组查询 |
orderBy | 排序查询 |
having | 分组后筛选 |
eq | 等于(=) |
ne | 不等于(<>) |
between | BETWEEN 条件语句 |
gt | 大于(>) |
ge | 大于等于(>=) |
lt | 小于(<) |
le | 小于等于(<=) |
示例
条件参数是链式调用的,可以同时使用多个参数,构建查询条件
在配置好查询条件后,将QueryWrapper对象传递给MybatisPlus中的方法即可
QueryWrapper<Students> queryWrapper = new QueryWrapper<>();
queryWrapper.lt("id",3).or().gt("id",2000);
List<Students> studentsList = studentsMapper.selectList(queryWrapper);
插入
int insert(T entity)
功能:插入一个实体记录到数据库中。
参数:entity 是要插入的实体对象。
返回值:插入成功的记录数,通常为 1。
示例:
User user = new User();
user.setName("John Doe");
user.setAge(30);
int result = userMapper.insert(user);
// result 应该为 1,表示插入成功
删除
int deleteById(Serializable id)
功能:根据主键 ID 删除一条记录。
参数:id 是要删除记录的主键。
返回值:删除成功的记录数,通常为 1。
示例
int result = userMapper.deleteById(0001);
// result 应该为 1,表示删除成功
int deleteById(T entity)
功能:根据实体对象的主键删除一条记录。这个方法与 deleteById(Serializable id) 的功能相似,但它是通过实体对象来删除的。
参数:entity 是包含主键的实体对象。
返回值:删除成功的记录数。
示例
User user = new User();
user.setId(1L);
int result = userMapper.deleteById(user);
// result 应该为 1,表示删除成功
int deleteByMap(@Param(“cm”) Map<String, Object> columnMap)
功能:根据条件构造器(以 Map 形式)删除记录。
参数:columnMap 是一个包含列名和对应值的 Map,用于构造删除条件。
返回值:删除成功的记录数。
示例:
Map<String, Object> map = new HashMap<>();
map.put("name", "John Doe");
int result = userMapper.deleteByMap(map);
// result 表示删除的记录数
int delete(@Param(“ew”) Wrapper queryWrapper)
功能:根据条件构造器删除记录。
参数:queryWrapper 是一个条件构造器,用于构造复杂的删除条件。
返回值:删除成功的记录数。
示例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John Doe");
int result = userMapper.delete(queryWrapper);
// result 表示删除的记录数
int deleteBatchIds(@Param(“coll”) Collection<?> idList)
功能:根据主键 ID 集合批量删除记录。
参数:idList 是一个包含多个主键 ID 的集合。
返回值:删除成功的记录数。
示例
List<Long> idList = Arrays.asList(001, 002, 003);
int result = userMapper.deleteBatchIds(idList);
// result 表示删除的记录数
更新/修改
int update(@Param(“et”) T entity, @Param(“ew”) Wrapper updateWrapper)
功能:根据条件构造器更新记录。
参数:entity 是包含更新数据的实体对象,updateWrapper 是条件构造器,用于构造更新条件。
返回值:更新成功的记录数。
示例
User user = new User();
user.setName("Jane Doe");
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("age", 30);
int result = userMapper.update(user, updateWrapper);
// result 表示更新的记录数
查询
T selectById(Serializable id)
功能:根据主键 ID 查询一条记录。
参数:id 是要查询记录的主键。
返回值:查询到的实体对象,如果没有找到则返回 null。
示例:
User user = userMapper.selectById(1L);
// user 是查询到的实体对象,或者为 null
List selectBatchIds(@Param(“coll”) Collection<? extends Serializable> idList)
功能:根据主键 ID 集合批量查询记录。
参数:idList 是一个包含多个主键 ID 的集合。
返回值:查询到的实体对象列表。
示例:
List<Long> idList = Arrays.asList(1L, 2L, 3L);
List<User> users = userMapper.selectBatchIds(idList);
// users 是查询到的实体对象列表
List selectByMap(@Param(“cm”) Map<String, Object> columnMap)
功能:根据条件构造器(以 Map 形式)查询记录。
参数:columnMap 是一个包含列名和对应值的 Map,用于构造查询条件。
返回值:查询到的实体对象列表。
示例
Map<String, Object> map = new HashMap<>();
map.put("age", 30);
List<User> users = userMapper.selectByMap(map);
// users 是查询到的实体对象列表
default T selectOne(@Param(“ew”) Wrapper queryWrapper)
功能:根据条件构造器查询一条记录。如果查询结果有多条记录,则抛出异常。
参数:queryWrapper 是一个条件构造器,用于构造查询条件。
返回值:查询到的实体对象,如果没有找到则返回 null,如果找到多条记录则抛出异常。
示例:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John Doe");
User user = userMapper.selectOne(queryWrapper);
// user 是查询到的实体对象,或者为 null,或者抛出异常
判断记录是否存在
default boolean exists(Wrapper queryWrapper)
功能:根据条件构造器判断记录是否存在。
参数:queryWrapper 是一个条件构造器,用于构造查询条件。
返回值:如果记录存在则返回 true,否则返回 false。
示例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John Doe");
boolean exists = userMapper.exists(queryWrapper);
// exists 为 true 或 false
统计数量
Long selectCount(@Param(“ew”) Wrapper queryWrapper)
功能:根据条件构造器查询记录数。
参数:queryWrapper 是一个条件构造器,用于构造查询条件。
返回值:查询到的记录数。
示例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 18);
Long count = userMapper.selectCount(queryWrapper);
// count 是查询到的记录数
模糊查询(返回实体对象列表)
List selectList(@Param(“ew”) Wrapper queryWrapper)
功能:根据条件构造器查询记录列表。
参数:queryWrapper 是一个条件构造器,用于构造查询条件。
返回值:查询到的实体对象列表。
示例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "John");
List<User> users = userMapper.selectList(queryWrapper);
// users 是查询到的实体对象列表
Map形式返回
List<Map<String, Object>> selectMaps(@Param(“ew”) Wrapper queryWrapper);
功能:根据条件构造器查询记录,并将结果以键值对(Map<String, Object>)的形式返回。每个Map代表数据库中的一行数据,键为列名,值为列数据。
参数:queryWrapper 是一个条件构造器,用于构造查询条件。
返回值:查询到的数据列表,列表中的每个元素都是一个包含列名和列值的Map。
示例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", 25);
List<Map<String, Object>> users = userMapper.selectMaps(queryWrapper);
// users 是查询到的数据列表,每个元素都是一个Map,Map中包含了用户的列名和对应的值
只返回查询列
List selectObjs(@Param(“ew”) Wrapper queryWrapper);
功能:根据条件构造器查询记录,但只返回每行的某个列(通常是查询的第一个列)的值列表。
参数:queryWrapper 是一个条件构造器,用于构造查询条件。
返回值:查询到的列值列表,列表中的每个元素都是Object类型。
示例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("name"); // 只选择name列
List<Object> names = userMapper.selectObjs(queryWrapper);
// names 是查询到的name列的值列表
分页查询
<P extends IPage> P selectPage(P page, @Param(“ew”) Wrapper queryWrapper);
功能:根据条件构造器分页查询记录。
参数:page 是一个分页对象,包含了分页的信息(如当前页码、每页数量等)。queryWrapper 是一个条件构造器,用于构造查询条件。
返回值:返回的是传入的分页对象P,但此时该对象已经包含了查询结果和分页信息。
示例
Page<User> page = new Page<>(1, 10); // 查询第一页,每页10条数据
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.ge("age", 18); // 查询年龄大于等于18的用户
Page<User> userPage = userMapper.selectPage(page, queryWrapper);
// userPage 包含了查询结果和分页信息
分页查询,Map返回
<P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param(“ew”) Wrapper queryWrapper);
功能:根据条件构造器分页查询记录,并将结果以键值对(Map<String, Object>)的形式返回。
参数:page 是一个分页对象,包含了分页的信息。queryWrapper 是一个条件构造器,用于构造查询条件。
返回值:返回的是传入的分页对象P,但此时该对象已经包含了查询结果(以Map形式)和分页信息。
示例
Page<Map<String, Object>> page = new Page<>(1, 5); // 查询第一页,每页5条数据
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "John"); // 查询名字中包含John的用户
Page<Map<String, Object>> userPage = userMapper.selectMapsPage(page, queryWrapper);
// userPage 包含了查询结果(每个结果都是一个Map)和分页信息